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

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

vitruvius

Ben cevabı hazırlarken muhittin_kaplan cevap vermiş ama çöpe gitmesin benim yazdıklarım da :)

String.Split aşağıdaki gibi tanımlanmış.

public string[] Split(
	string[] separator,
	StringSplitOptions options
)


separator: Ayırıcılardan oluşan bir string array.
options: İki ihtimalin var:
            StringSplitOptions.RemoveEmptyEntries: boş dönecek dizi elemanlarını engellemek için.
            StringSplitOptions.None: boş dönecek dizi elemanlarını da dahil etmek için.

Return: Belirlediğin ayıraçlarla ayrılmış olan substring'lerden oluşan string array.

İki farklı karakteri baz alıp ayırmak istiyorsan bunları char[] ile tanımla ve Split fonksiyonunun içine bu diziyi koy.

static void Main(string[] args)
{
    string text = "1.Deger|607|349|322|466|549|224#";
    char[] delim = { '|', '#' };  // Ayiraclar.
    string[] subItems = text.Split(delim, StringSplitOptions.None);

    foreach (string line in subItems)
    {
        Console.WriteLine(line);
    }
}


Bunun çıktısı aşağıdaki gibi:

1.Deger
607
349
322
466
549
224

vitruvius

#16
Bu arada MessageBox.Show()'un ikinci parametresi Caption yani başlıktır.

public static DialogResult Show(
	string text,
	string caption
)



Benim verdiğim kodda catch bloğundaki bazı kısımları sildim çünkü başka fonksiyonlar v.s. gerektiyor ancak benim yaptığım iş exception olduğunda bunu ayrı bir error.log gibi bir dosyaya kaydederim.

Senin exception yakalama yönteminde yakaladığın hatayı MessageBox.Show()'ın ikinci parametresine aktarıyorsun, bu da hata mesajının başlıkta yazmasına sebep olur. Bu hata mesajları çok uzun olabilir ve balşıkta hoş durmaz. Hatta bunu kullanıcıya yansıtmak da güzel olmaz. Kullanıcıya genel bir "okuma hatası bla bla" gibi bir mesaj verir, esas hata mesajını kendine saklarsın.

Demek istediğim, senin hata yakalama yöntemin şu şekilde çıktı veriyor:



Şu şekilde düzenlersen:

catch (DirectoryNotFoundException ex_DirNotFound)
{
     MessageBox.Show("Okuma İşlemi sırasında bir hata oluştu!\nHata mesajı: " + ex_DirNotFound.Message, "Error");
}


Aşağıdaki gibi çıktı alırsın:


vitruvius

Bir şey daha söyleyecektim unuttum.

Exception.Message sadece exception'ın nedenini söyler.

Exception.ToString() ise sana exception'ı her şeyiyle söyler.

Aşağıdaki program parçasına bakalım. Dosyayı okumaya çalışırken exception oluşmasını bekliyorum çünkü verdiğim path benim bilgisayarda yok.

using System;
using System.IO;

namespace mySplitConsole
{
    class Program
    {
        private static void oku()
        {
            try
            {
                string path = @"c:\temp\MyTest.txt";
                using (StreamReader file = new StreamReader(path)) // Burada exception ebkliyorum cunku boyle bir path bende yok.
                {
                    string rxdata = file.ReadLine();
                    while (rxdata != null)
                    {
                        string[] text = rxdata.Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries);  //Burada satır verisi parçalara ayrılacak. 
                    }
                }
            }
            catch (DirectoryNotFoundException ex_DirNotFound)
            {
                Console.WriteLine(ex_DirNotFound.Message);
                Console.WriteLine(ex_DirNotFound.ToString());
            }
        }

        static void Main(string[] args)
        {
            oku();
        }
    }
}


Exception.Message sana aşağıdaki gibi bir çıktı verir:
Alıntı YapCould not find a part of the path 'c:\temp\MyTest.txt'.

Exception.ToString() ise:
Alıntı YapSystem.IO.DirectoryNotFoundException: Could not find a part of the path 'c:\temp\MyTest.txt'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean checkHost)
   at System.IO.StreamReader..ctor(String path)
   at mySplitConsole.Program.oku() in C:\Users\mucit23\Documents\PicProje\mySplitConsole\mySplitConsole\Program.cs:line 13

Gördüğün gibi ToString() sana çok daha detaylı bilgi veriyor. Son satırına lütfen dikkat et. Exception'ın hangi dosyadan, hangi fonksiyondan ve hangi satırdan geldiğini sana söylüyor.

Dediğim gibi kullanıcıya bunu yansıtmak çok hoş olmaz. Çok istersen Exception.Message'ı yansıtabilirsin. Ama kendin için bir log oluşturmak istiyorsan bunun için Exception.ToString() kullanmanı şiddetle tavsiye ederim.

controller

Bence SQLITE kullan, dosya işlemleriyle uğraşmazsın. SQL sorguları ile tüm işini halledersin.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Mucit23

@vitruvius ve Muhittin hocam cevaplarınız için teşekkür ederim.
Yaptığım uygulama profesyonel bir uygulama değil bu yüzden basit çözümler ile ilgileniyorum. TXT dosyası fazlasıyla işimi görüyor.

Hocam Message Box'ları düzenledim. Bunun için ayrıca teşekkür ederim. Çok vakit harcıyorsunuz.

Şimdi Split işlemini anladım. Fakat işlem sonucundaki string parçaları bir textbox'a yazamadım.

string[] ile string arasında ne fark var?

Split işlemi kullanabilmek için string[] şeklinde tanımlama yapmak gerekiyor.

Textbox içerisine bir string göndermek için string şeklinde tanımlama yapmak gerekiyor.

Aşağıdaki kullanımların hepsinde hata veriyor.
string[] yazi="Merhaba" 
textbox1.text=yazi;     
string text = rxdata.Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries);

Sırayla SD karttan satır okuyup Parçalayıp excel'e yazmak için düzgün bir algoritma kurmam lazım.

Birde Şu konsol bende açılmıyor. Bunu açmak için birkaç ayar varmış. Output Mode'yi değiştirmek gerekiyor fakat ozamanda yaptğım tasarım açılmıyor. İkisini aynı anda kullanabiliyormuyuz?

Mucit23

Yahu diziymiş ya.  :o String dizileri olduğunu unutmuşum. Bu durumda benim benim stringlerim text[0], text[1], text[2].....

vitruvius

Alıntı yapılan: Mucit23 - 06 Ocak 2017, 21:08:13
Birde Şu konsol bende açılmıyor. Bunu açmak için birkaç ayar varmış. Output Mode'yi değiştirmek gerekiyor fakat ozamanda yaptğım tasarım açılmıyor. İkisini aynı anda kullanabiliyormuyuz?

Project -> Properties -> Application -> Output Type -> Console Application

Böyle yaparsan programı çalıştırdığında hem konsol açılır hem de form. Ama hoş bir görüntü değil. Eğer sırf burada verilen örnekleri denemek istiyorsan MessageBox'a da yazdırabilirsin.

Bu arada MessageBox demişken :) MessageBox.Show'un üçüncü ve dördüncü parametrelerine de bakarsan çok daha şık bir MessageBox'ın olur :) Dördüncü ve beşinci parametrelere de bir göz gezdirebilirsin :)

MessageBox.Show("Do you really want to delete this file?", "Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);



Mucit23

Hocam teşekkür ederim. Sizi yakalamışken  :) bugünkü son sorum savefiledialog ile ilgili.

Savefilediyalog da bir dosya oluşturduğumuzda ilk önce aynı isimde başka dosya varmı ona bakıyor. Var ise yenisi ile değiştireyimmi diye soruyor. Bende de durum aynı şekilde buraya kadar problem yok. Fakat ben eskisi ile değiştir dediğimde, değiştirmeyip verilerimi eski dosyanın üzerine yazıyor sistem. Bu neden olur?

vitruvius

Örnek bir kod parçası alalım mı?  :)

Mucit23

Hocam daha çok eksiğim var bu c# konusunda.

Örneğin aşağıdaki kod parçacığından savefiledialog ile bir txt dosyası oluşturuyorum.
                saveFileDialog1.Filter = "Text Files | *.txt";
                saveFileDialog1.Title = "Kayıt Yeri";
                saveFileDialog1.DefaultExt = "txt";
                DialogResult result = saveFileDialog1.ShowDialog();
                
                if (result == DialogResult.OK)
                {
                    ProjectFolder = saveFileDialog1.FileName;
                    textBox2.Text = ProjectFolder;
                    FileStream folder = new FileStream(ProjectFolder, FileMode.CreateNew, FileAccess.ReadWrite);
                    StreamWriter Kaydet = new StreamWriter(folder);
                    Kaydet.Close();
                }

vitruvius

SaveFileDialog çok hakim olduğum bir konu değil ama MSDN'den bakınca önce bir OpenFile() yapmak gerektiğini anladım.

Aşağıdaki gibi kullanırsan bir sıkıntı olmamalı.

private void button1_Click(object sender, EventArgs e)
{
    Stream myStream;            
    saveFileDialog1.DefaultExt = "txt";

    string[] lines = { "First line", "Second line", "Third line" };

    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        if ((myStream = saveFileDialog1.OpenFile()) != null)
        {
            myStream.Close();  // Dosyaya yazmak icin once kapamak gerekiyor.

            using (StreamWriter file = new StreamWriter(saveFileDialog1.FileName))
            {
                foreach (string line in lines)
                {
                    file.WriteLine(line);
                }
            }
        }
    }
}


Dosyayı bir kere oluştur ve içine bak. string[] lines'daki elemanlar olacak. Sonra string lines[]'ın elemanlarını değiştir ve butona tıklayığ aynı dosyayı seç. Göreceksin ki üzerine sıfırdan yazacak.

Mucit23

Vitruvius teşekkürler savefiledialog işini hallederim artık. Dün bir sorun ile karşılaştım ama çözemedim. Şimdi tekrar bakıyorum.
text dosyasından okuyup excel'e yazmak için aşağıdaki gibi bir fonksiyon oluşturmuştum.

        public bool read_and_write_excel()
        {

            string rxdata;
            int rowCnt = 0;

            try
            {
                using (StreamReader file = new StreamReader(ProjectFolder, true))
                {
                    rxdata = file.ReadLine();
                    rowCnt = 1;
                    while (rxdata != null)
                    {
                        string[] text = rxdata.Split(new char[] { '|', '#' }, StringSplitOptions.RemoveEmptyEntries);
    
                        for (int i = 0; i < 65; i++)
                        {
                            Excel.Range bolge = (Excel.Range)ExcelSayfa.Cells[rowCnt, i+1];
                            bolge.Value2 = text[i];
                        }

                        rxdata = file.ReadLine();
                        rowCnt++;
                    }
                }
                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;
            }

        }


Split işlemi sorununda 65 adet string parçacığı oluşuyor. Benim bunları excel'deki ilgili hücrelere yazmam lazım. yukarıdaki kodu çalıştırdığımda aşağıdaki satırda hata veriyor

bolge.Value2 = text;

Verdiği hata mesajı : Dizin, dizi sınırlarının dışındaydı

buradan şunu anlıyorum. text diye bir dizi yok. Yada split işlemi çalışmıyor yada 65 adet dizi elemanı oluşmuyor.

text isimli dizinin elemanlarını bir textbox'a yazsamda aynı sorun oluyor. . TXT dosyasında okuduğum satır ise düzgün bir şekilde okunuyor. rxdata istediğim formatta geliyor.

Sorun ne olabilir sizce?

vitruvius

Dün akşam söylemeyi unuttum, bu aralar bir unutkanlık var :)

FileStream folder = new FileStream(ProjectFolder, FileMode.CreateNew, FileAccess.ReadWrite);


Dersen, eğer dosya zaten varsa exception oluşturması lazım. En azından ben dün akşam denerken öyleydi. Onun yerine FileMode.OpenOrCreate şeklinde yap o yapıyı kullanacaksan.

------------------------------------------------------------------------------------------------------------------

Evet aldığın exception bir dizinin var olmayan elemanına ulaşmak istediğinde oluşan bir exception türü. Mesela:

string[] myText = { "bu bir", "bu iki" };

for (int i = 0; i < 3; i++)
{
     MessageBox.Show(myText[i]);
}


Dersen, myText[2]'ye de erişmeye çalışacaktır kod. Ancak bizim dizimizin boyutu o kadar değil, öyle bir eleman da yok.

Onun yerine:

for (int i = 0; i < myText.Count(); i++)
{
     MessageBox.Show(myText[i]);
}


Dersen dizinin boyutu kadar döngüye girersin.

Excel ile ilgili tanımlamalarını da verirsen daha detaylı bakarız akşam.

PROTECH_

Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

muhittin_kaplan

yeri gelmişken söyleyeyim,
eğer verilerinizin multiplatform olmasını istiyorsanız (linux, win, mac) ve bir çok program tarafından açılmasını, webde yayaınlamak vs istiyorsanız XML yapın.