C# 'da database nasıl oluşturulur?

Başlatan Mucit23, 02 Ocak 2017, 16:32:42

Mucit23

Hocam

Excelde tablo oluşturmak için bu web sitesinden faydalandım.
http://www.tugayarslan.com/blog/c-ile-excele-hukmedin-1-dokuman-olusturma-yazma-kaydetme/

Kayıt yapabilmek için bir buton ekleyip ilk önce savefile dialog ile kayıt yerini seçiyorum
        private void button2_Click(object sender, EventArgs e)
        {
            string kayit_yeri="";

            try//İlk başta kayıt yerimizi seçelim. 
            {
                saveFileDialog1.Filter = "xlsx Files | *.xlsx";
                saveFileDialog1.Title = "Kayıt Yeri";
                saveFileDialog1.DefaultExt = "xlsx";
                DialogResult result = saveFileDialog1.ShowDialog();

                if (result == DialogResult.OK)
                {
                    kayit_yeri = saveFileDialog1.FileName;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Bir hata oluştu!", ex.Message);
            }

            read_and_write_excel(); //Excel tablomuzu dolduralım. 

            if (kayit_yeri != "")
            {
                ExcelProje.SaveAs(kayit_yeri, Excel.XlFileFormat.xlWorkbookDefault, Missing, Missing, false, Missing, Excel.XlSaveAsAccessMode.xlExclusive);
                ExcelProje.Close(true, Missing, Missing);
                ExcelUygulama.Quit();

                MessageBox.Show("Dosya Başarıyla Kaydedildi.");
            }
            else
            {
                MessageBox.Show("Lütfen Bir Dosya Adı Giriniz.");
            }
        }

Kayıt yeri seçildikten sonra read_and_write_excel(); fonksiyonuna gidip txt dosyasının içini okuyup excel dosyasını dolduruyorum.
o fonksiyonun içeriğide aşağıdaki gibi.

        public bool read_and_write_excel()
        {

            string rxdata;
            int row = 0;

            try
            {
                using (StreamReader file = new StreamReader(ProjectFolder, true))
                {
                    rxdata = file.ReadLine();
                    row = 1; //1. Satırdan başlayacağız
                    while (rxdata != null)
                    {
                        string[] parts = rxdata.Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries);

                        for (int i = 0; i < parts.Count(); i++)
                        {
                            Excel.Range bolge = (Excel.Range)ExcelSayfa.Cells[row, i+1];
                            bolge.Value2 = parts[i];
                        }
   
                        rxdata = file.ReadLine();
                        row++; //Satır indisimizi 1 arttırıyoruz. 
                    }
                }
                return true;
            }
            catch (DirectoryNotFoundException ex_DirNotFound)
            {
                MessageBox.Show("Okuma İşlemi sırasında bir hata oluştu!\nHata mesajı: " + ex_DirNotFound.Message, "Error");
                return false;
            }

        }


Önceden hiç çalışmıyordu fakat şuan o sorunu çözdüm tablo oluşturuluyor fakat buradaki koda göre exelde 1 satır atlayarak tabloyu dolduruyor. Bu sorunu anlamıyorum. Şimdide bununla uğraşıyorum.

Benim verilerim TXT dosyasında aşağıdaki gibi dizili. Burada hiç sıkıntı yok. Fakat bunu excel'e aktarırken problem yaşıyorum.
1.Deger|607|349|473|758|130|872|744|278|323|109|540|665|492|242|387|803|727|529|340|712|303|469|009|857|760|033|699|378|116|835|097|326|212|667|710|333|379|649|279|021|667|272|793|036|785|245|128|391|294|157|701|353|808|244|568|590|624|296|030|103|322|466|549|224#
2.Deger|701|253|477|108|528|133|598|781|835|313|465|814|563|036|725|569|015|394|729|301|317|095|105|404|351|798|588|323|005|682|852|566|016|537|038|144|201|297|371|428|137|458|577|297|894|804|509|731|545|375|435|698|142|799|368|512|360|757|294|208|295|468|113|430#
3.Deger|406|762|142|565|382|352|667|621|495|412|771|101|890|231|338|357|316|290|140|679|035|106|872|298|195|219|354|623|889|860|505|726|423|506|713|170|738|694|420|344|466|034|026|294|763|738|244|790|350|459|223|447|085|217|872|639|047|585|496|085|823|520|644|668#


Bu satırlardan bayağı var. Bu yüzden bu işlemi hızlı yapmam lazım. Ama iki satır veriyi bile parçalayıp excel'e yazma 2-3 sn sürüyor. İşlemler neden bu kadar yavaş oluyorki?

Bu işi en efektif bir şekilde nasıl yaparım? TXT dosyamızın oluşturulmuş olduğunu düşünün. Sadece TXT dosyasından satır okuyup excel'e hızlı bir şekilde atmam lazım. Hatta bu işlemin süresini bir tane progress bar ile göstersem süper olacak.

vitruvius

Hocam verdiğin kodu denedim ama satır atlamalı yazmadı bende. Sebebini merak ediyorsan projeyi ziple ve bana yolla. Debug eder bakar, sorunu buluruz.

Value2() fonksiyonu son derece pahalı bir fonksiyon. Biraz araştırdım ve buradaki kaynaktan iki boyutlu bir dizi tanımlayıp Value2() fonksiyonunu bir kere çağırıp dizinin tüm içeriğinin yazdırılabildiğini gördüm.

Kendimce bir şeyler karaladım, exception yakalamayı ve birkaç güvenlik kontrolünü sana bıraktım.

OpenFileDialog ile önce verileri okuyacağın dosyayı seçtiriyorum, sonra da yazacağın excel dosyasını seçtiriyorum. Satırların yanlarında açıklama var zaten. Önemli olan yazma operasyonunu anlamak.

İki boyutlu bir dizi var. Dizinin satır kısmı senin de excel'deki satır kısmın olacak. Yani text dosyanda kaç satır varsa o kadar. Sütunları da text dosyasından okuduğun verinin Split() edilmiş hali tek tek eklenecek. Yani büyüklüğü 65 olacak. Yalnız burada bu büyüklüğün sabit olduğundan emin olmak lazım zira diziyi tanımlarken kaç sütun olacağını hesaplayıp tanımlıyoruz ve bunu bir daha değiştiremeyiz. Eğer sütun sayısı değişken ise List<> üzerinden devam etmek gerekir.

Verdiğin örnek text dosyasını 100 satırlık bir dosya yaptım. Tek tek her döngüde value2()'yi çağırıp yazdırmak yaklaşık 75 saniye sürüyor. İki boyutlu dizi kullanıp tek seferde yazdırmak ise yaklaşık 0.475 saniye :)

Tüm kod aşağıda:

using System;
using System.Linq;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.IO;

namespace myExcel2
{
    public partial class Form1 : Form
    {
        static Excel.Application myExcelApp;
        static Excel.Workbook myExcelWorkbook;
        static Excel.Worksheet myExcelSheet;
        static object Missing = System.Reflection.Missing.Value;
        static Excel.Range myExcelRange;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Pops-up an OpenFileDialog and lets the user select a file.
        /// </summary>
        /// <param name="title">String: Title of OpenFileDialog.</param>
        /// <param name="fileType">String: File type that the user is going to select. Ex: Text file.</param>
        /// <param name="fileExtension">String: File extension WITH the dot in the beginning.</param>
        /// <returns>Null: If nothing is selected. String: Full file path including file name and extension.</returns>
        private static string selectFile(string title, string fileType, string fileExtension)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = title;
            ofd.Filter = fileType + "|*" + fileExtension;

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                return ofd.FileName;
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Reads all lines of the given file.
        /// </summary>
        /// <param name="fullPath">String: Full file path, including the name and extension of the file.</param>
        /// <returns>Null: If file doesn't exist. String[]: Lines of the given file.</returns>
        private static string[] readAllLines(string fullPath)
        {
            if (File.Exists(fullPath))
            {
                return File.ReadAllLines(fullPath);
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Writes data to the given excel file.
        /// </summary>
        /// <param name="fullPath">String: Full file path, including the name and extension of the file.</param>
        /// <param name="allLines">String[]: Data to be written.</param>
        /// <returns>True: Write operation is successful.</returns>
        private static bool writeToExcel(string fullPath, string[] allLines)
        {
            if (File.Exists(fullPath))
            {                
                int height = allLines.Count();  // Number of rows.
                int width = allLines[0].Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries).Count(); // Number of columns.

                Excel.Range top = myExcelSheet.Cells[1, 1]; // Start position.
                Excel.Range bottom = myExcelSheet.Cells[height, width]; // End position.
                Excel.Range all = myExcelSheet.get_Range(top, bottom);

                string[,] myList = new string[height, width];   // A 2D array to hold data.

                for (int i=0; i<height; i++)
                {
                    string[] items = allLines[i].Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries);

                    for (int j = 0; j < width; j++)
                    {
                        myList[i, j] = items[j];    // Insert the data.
                    }
                }
                all.Value2 = myList;    // Write data into the excel file.
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Saves the given excel file.
        /// </summary>
        /// <param name="fullPath">String: Full file path, including the name and extension of the file.</param>
        /// <returns>True: Save operation is successful.</returns>
        private static bool saveExcelFile(string fullPath)
        {
            if (File.Exists(fullPath))
            {
                myExcelApp.DisplayAlerts = false;  // If turned on, overwrite message will pop-up.
                myExcelWorkbook.SaveAs(fullPath, Excel.XlFileFormat.xlWorkbookDefault, Missing, Missing, false, Missing, Excel.XlSaveAsAccessMode.xlNoChange);
                myExcelWorkbook.Close(true, Missing, Missing);
                myExcelApp.Quit();
                return true;
            }
            else
            {
                return false;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            myExcelApp = new Excel.Application();
            myExcelWorkbook = myExcelApp.Workbooks.Add(Missing);
            myExcelSheet = (Excel.Worksheet)myExcelWorkbook.Worksheets.get_Item(1);
            myExcelRange = myExcelSheet.UsedRange;
            myExcelSheet = (Excel.Worksheet)myExcelApp.ActiveSheet;

            myExcelApp.Visible = false;
            myExcelApp.AlertBeforeOverwriting = false;

            string sourceFilePath = selectFile("Please select your source file.", "Text file", ".txt"); // Select the source file.
            string destinationPath = null;
            string[] allLinesFromSource = null;

            if (sourceFilePath != null)
            {
                allLinesFromSource = readAllLines(sourceFilePath);  // Read the file.

                if (allLinesFromSource != null)
                {
                    destinationPath = selectFile("Please select your target file.", "Excel File", ".xlsx"); // Target excel file.

                    if (destinationPath != null)
                    {
                        if (writeToExcel(destinationPath, allLinesFromSource)) // Write.
                        {
                            if (saveExcelFile(destinationPath))
                            {
                                MessageBox.Show("Successfully written&saved.", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Close();    // Close the application.
                            }
                            else
                            {
                                MessageBox.Show("An error happened while saving the file.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                Close();    // Close the application.
                            }
                        }
                    }
                }
            }
        }
    }
}


Mucit23

Hocam benim 2000 3000 satırı problemsiz yapabilmem gerek. Aslında Excel'e aktarma işlemi benim için lüks gibi birşey. normalde Excel'de benim yazılım olmadan verileri tabloya döküyorum. Önceliğim Txt dosyası oluşturmaktı. Onu yaptım gibi. Fakat Excel işinide halletsem mükemmel olacak.

Hocam dünden beri uğraşıyorum ama satır atlayarak kaydetme işini çözemedim. Biraz işin derinliklerine girdiğimde aşağıdaki döngü içerisinde row değişkeninin daha olması gerekenden dahada çok arttığını görüyorum.
                    
while (rxdata != null)
                    {
                        string[] parts = rxdata.Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries);

                        for (int i = 0; i < parts.Count(); i++)
                        {
                            Excel.Range bolge = (Excel.Range)ExcelSayfa.Cells[row, i+1];
                            bolge.Value2 = parts[i];
                        }
   
                        rxdata = file.ReadLine();
                        row++; //Satır indisimizi 1 arttırıyoruz. 
                    }

Normalde Txt dosyasında iki satır veri var ama program döngüden çıktığında row değişkeni 5 civarı değer alıyor.  Yani anlam  veremedim hocam projeyi aşağıdaki linke yükledim. Müsait bir zamanında incelerseniz ve diğer hataları görüp söylerseniz çok memnun olurum.
https://yadi.sk/d/a1gqHb8537iNWn

Value2 fonksiyonuna pahalı demişsiniz  :D Tam anlayamadım demek istediğinizi

Hocam sizin anlattığınızda şöylemi yapmam gerekiyor. Excel'le göndermeden önce Bütün TXT dosyasını split edip iki boyutlu bir diziye önce kaydedip sonra excel'e göndereceğim. Böyle olursa eğer 2000 satır veri olsa 2000*64 toplam 128000 adet veri yapar. Bunu dizide tutmak bilgisayarı çok kasmaz mı?

Excel'de bu işlem çok hızlı gerçekten. o kadar hızlı olmasada 5-6 saniye içerisinde bu işi yapsam süper olur  :)

serdararikan

Neden aldığın verileri list içerisine yazmiyorsun?

vitruvius

Satır atlamalı yazdırma olayı bende gerçekleşmedi. Dolayısı ile debug edemedim.

Verinin 65 parçadan oluşacağını garanti edebiliyor musun? Edebilsen bile List<> ile çalışmak daha kolaylık sağlayacaktır ama sen bilirsin.

Value2() fonksiyonu zaman alan bir fonksiyon dolayısı ile mümkün olduğunca az çağırmak programı oldukça hızlandıracaktır. Senin yaptığın gibi dizinin her elemanı için bu fonksiyonu tek tek çağırmak yerine verdiğim örnekteki gibi iki boyutlu bir dizi kullanıp bir kere çağırırsan programın son derece hızlanacaktır. Rakamları verdim :P

Verdiğim örneği bir dene ve performansını gör. Bütün proje kodu var orada. Her şey Form1_Load() içinde gerçekleşiyor herhangi bir buton, textBox v.s. eklemene gerek yok. 2000 satırlık bir text dosyası seç ve bir bak.

Mucit23

Selamlar

Visual Studio ile bir proje hazırladık projemiz dügün çalışıyor vs. Bu projeyi Windows 7 ve üzeri PC lerde düzgün bir şekilde çalışması için ne yapmak gerekir? Sonuç olarak ben bir exe dosyası istiyorum. Virüs programları bu programı kötü niyetli olarak algılamasın. Ve Windows8 ve üzeri x86,x64 olmak üzere her türlü platformda çalışsın istiyorum.

vitruvius

.NET versiyonun ve Visual Studio versiyonun ne? Setup dosyası oluşturursan sorun olmayacaktır.

Mucit23

Hocam NetFramework 4 kurulu bilgisayarımda Ayrıca VS 2010 kullanıyorum.

Debug klasörü içindek oluşan exe bu durumda işimi görmezmi?

muhittin_kaplan

hocam normalde görür, ama olurda freamework yüklü değildir felan durumu olursa diye setup hazırlamak iyidir.
https://www.youtube.com/watch?v=aUctlCNoX64