none
PROGRAM GEÇ AÇILMA SORUNU RRS feed

  • Soru

  • Program açıldığında load da veritabanlarından bilgiler çekiyor.Veri tabanımda tablomun içinde 6000 satır var bunu tek seferde çekiyor muhtemelen buda programın ekranın geç açılmasına sebep oluyor bunu çözmek için thread kullandım  fakat program cs dosyasında Application.Run(new Form1());(System.NullReferenceException: 'Object reference not set to an instance of an object.') hatasını alıyorum ve pointer ile takip ettiğimde bu hatayı DataGridView.DataSource = ds.Tables[0];  veriyor dahada tuğafı try-catch içinde olmasına rağmen catch dosyasına gitmiyor bile doğrudan program cs gidiyor ve yukarıda gösterdiğin hatayı veriyor.Bu hatayı sadece thread ile çalıştırırsam veriyor bilginize normal şekilde load dosyasına yazarsam bu hatayı almıyorum.Bunun çözümü için yardımlarını bekliyorum.
    • Düzenleyen Mağrur 17 Aralık 2018 Pazartesi 16:37
    17 Aralık 2018 Pazartesi 16:36

Tüm Yanıtlar

  • Hangi veritabanını kullanıyorsun ve  bağlantı kodlarını görebilirmiyiz.


    17 Aralık 2018 Pazartesi 17:05
  • Sqlite veri tabanını kullanıyorum  bağlantı kodu da şu:

    try{

    • SQLiteConnection con= new SQLiteConnection("Data Source = veriler.sqlite"); //Bağlatı kodum
    • con.Open();
      SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM sitevericek", con);
      DataSet ds = new DataSet();
      dta.Fill(ds, "Bilgi");
      DataGridView.DataSource = ds.Tables[0];
      con.Close();

    }

    catch{ return; }

    // dataGridView1.DataSource = ds.Tables[0]; thread kullandığımda hata aldığım yer



    • Düzenleyen Mağrur 17 Aralık 2018 Pazartesi 17:27
    17 Aralık 2018 Pazartesi 17:25
  • Thread'i nerede başlatıyorsunuz? Ve DataGridView.DataSource = ds.Tables[0]; nerede? Belli ki zamanlama konusunda hatanız var. 

    www.cihanyakar.com

    17 Aralık 2018 Pazartesi 18:19
  • Sqlite veri tabanını kullanıyorum  bağlantı kodu da şu:

    try{

    • SQLiteConnection con= new SQLiteConnection("Data Source = veriler.sqlite"); //Bağlatı kodum
    • con.Open();
      SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM sitevericek", con);
      DataSet ds = new DataSet();
      dta.Fill(ds, "Bilgi");
      DataGridView.DataSource = ds.Tables[0];
      con.Close();

    }

    catch{ return; }

    // dataGridView1.DataSource = ds.Tables[0]; thread kullandığımda hata aldığım yer



          Sqlite'ın birden fazla versiyonu var , ve şuan sizin kullandığınız 1.0 yada 1.x olmalı.Versiyon uzantısından anlaşılıyor.Ya ben yanlış biliyorum yada siz yanlış yapıyorsunuz :) muhtemelen bir arayüz programı ile oluşturduğunuz için veritabanını çok fazla uzantı seçeneği yok.
    17 Aralık 2018 Pazartesi 20:49
  • Sqlite veri tabanını kullanıyorum  bağlantı kodu da şu:

    try{

    • SQLiteConnection con= new SQLiteConnection("Data Source = veriler.sqlite"); //Bağlatı kodum
    • con.Open();
      SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM sitevericek", con);
      DataSet ds = new DataSet();
      dta.Fill(ds, "Bilgi");
      DataGridView.DataSource = ds.Tables[0];
      con.Close();

    }

    catch{ return; }

    // dataGridView1.DataSource = ds.Tables[0]; thread kullandığımda hata aldığım yer



          Sqlite'ın birden fazla versiyonu var , ve şuan sizin kullandığınız 1.0 yada 1.x olmalı.Versiyon uzantısından anlaşılıyor.Ya ben yanlış biliyorum yada siz yanlış yapıyorsunuz :) muhtemelen bir arayüz programı ile oluşturduğunuz için veritabanını çok fazla uzantı seçeneği yok.

    mehmet bey sqlite sürümü 3.10.1 sqlite sürümü ile alakalı olduğunu zannetmiyorum

    18 Aralık 2018 Salı 13:26
  • Cihan bey ,

    threadı load da başlatıyorum /// DataGridView.DataSource = ds.Tables[0]; bu kodu nasıl göremediniz anlayamadım  :)

    kod tekrarı:

    try{

    • SQLiteConnection con= new SQLiteConnection("Data Source = veriler.sqlite"); //Bağlatı kodum
    • con.Open();
      SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM aaa", con);
      DataSet ds = new DataSet();
      dta.Fill(ds, "Bilgi");
      DataGridView.DataSource = ds.Tables[0];
      con.Close();

    }

    catch{ return; }

    ve zamanda kastınızı ne yazık ki anlayamadım

    18 Aralık 2018 Salı 13:37
  • Çok içerideki kodu gönderiyorsunuz. Dolayısıyla neyi hangi sırada çağırdığınızı göremiyorum... "Load da başlatıyorum" benim için açıklayacı değil maalesef. Sizin önemli görmediğiniz bir detay daha yukarıda olabilir. Bu sebeple daha geniş şekilde kod paylaşmanız size yardımcı olabilir.

    www.cihanyakar.com

    18 Aralık 2018 Salı 14:25
  • Sqlite veri tabanını kullanıyorum  bağlantı kodu da şu:

    try{

    • SQLiteConnection con= new SQLiteConnection("Data Source = veriler.sqlite"); //Bağlatı kodum
    • con.Open();
      SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM sitevericek", con);
      DataSet ds = new DataSet();
      dta.Fill(ds, "Bilgi");
      DataGridView.DataSource = ds.Tables[0];
      con.Close();

    }

    catch{ return; }

    // dataGridView1.DataSource = ds.Tables[0]; thread kullandığımda hata aldığım yer



          Sqlite'ın birden fazla versiyonu var , ve şuan sizin kullandığınız 1.0 yada 1.x olmalı.Versiyon uzantısından anlaşılıyor.Ya ben yanlış biliyorum yada siz yanlış yapıyorsunuz :) muhtemelen bir arayüz programı ile oluşturduğunuz için veritabanını çok fazla uzantı seçeneği yok.

    SqLite dosyalarının versiyon, uzantı gibi bir baglantisi yok. Dosya ismini siz verirsiniz:

    myData.db

    myData.s3db

    myData.sqlite

    myData.dat

    ...

    ne isterseniz size bagli. 

    18 Aralık 2018 Salı 14:33
    Yanıtlayıcı
  • SQLite ile 6000 kaydın gelmesi gecikme nedeni arayacaginiz yer olmamalı. Olsa olsa 1sn etkiler. Formunuzdan bagimsiz olarak bu kodunuzu zamanladınız mi (mesela pratik olarak LinqPad ile)? Yine de etkili oldugunu dusunuyorsaniz, ADO.Net yerine Linq kullanabilirsiniz ya da DataGridView icin virtual mode kullanabilirsiniz. 
    18 Aralık 2018 Salı 14:38
    Yanıtlayıcı
  • Çetin Bey DataGridView.DataSource = ds.Tables[0]; bu kod 5 sn ye sürüyor 1 sn sürmüyor ne yazıkki ve loadın bitirmesi tam olarak 8 sn sürüyor.

    Cihan Beye cevap olarak da 

    formun load kısmı:

    form_load()

    {

    control.checkforIllegalcrossthreadcalls = false;

    Bu kısım veri tabanlarının kontrol ediyorum tablo varmı yokmu varsa oluştur tarzında bu zımbrtıdan 7 adet var

    con.Open();

    SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM aaa", con);
    DataSet ds = new DataSet();
    dta.Fill(ds, "Bilgi");
    DataGridView.DataSource = ds.Tables[0];
    con.Close();

    }

    catch{ return; }

    //thread th = new thread(asd);

    //th.Isbackground = true;

    //th.start();

    }

    //void kısmı

    private void asd()

    {

    try{

    control.checkforIllegalcrossthreadcalls = false;

    Bu kısım veri tabanlarının kontrol ediyorum tablo varmı yokmu varsa oluştur tarzında bu zımbrtıdan 7 adet var

    con.Open();

    SQLiteDataAdapter dta = new SQLiteDataAdapter("SELECT a,s,d,f,g,h,j,k,l,o,i FROM aaa", con);
    DataSet ds = new DataSet();
    dta.Fill(ds, "Bilgi");
    DataGridView.DataSource = ds.Tables[0];
    con.Close();

    }

    catch{ return; }

    }

    threadı aktiftirirsem program cs de Application.Run(new Form1());(System.NullReferenceException: 'Object reference not set to an instance of an object.') hatasını alıyorum





    • Düzenleyen Mağrur 19 Aralık 2018 Çarşamba 12:49
    19 Aralık 2018 Çarşamba 12:46
  • control.checkforIllegalcrossthreadcalls = false;


    bunun varlığını unut, bu sizi kötü koddan korumaya çalışan mekanizmayı iptal ediyor ve kendi topuğunuza sıkıyorsunuz. Benzer şekilde karşınıza BackgroundWorker çıkabilir onu da unutun.

    Thread açıyorsanız veya arkaplanda iş yapıyorsanız, bunlar arayüz elemanlarına veya başka threadlerin nesnelerine erişmeye çalışmamalı.   Task (TPL) , Async/Await  yapılarını öğrenmenizi, kullanmanızı öneririm.  


    www.cihanyakar.com

    19 Aralık 2018 Çarşamba 14:07
  • Ne yazık ki sorumun cevabı olmamış. O tabloyu projenizden bağımsız sorgulasanız yine de 5sn sürüyor mu? Sürüyorsa, çok fazla sayıda kolon mu var? Neden o kadar yavaş? Ben olsam önce onu araştırırdım. Yavaşlık kaçınılmaz ise, ikinci soru tüm kayıtları getirmeniz gerekiyor mu? Gerekiyorsa, virtual mode seçenek değil mi?
    19 Aralık 2018 Çarşamba 14:09
    Yanıtlayıcı