Soran
PROGRAM GEÇ AÇILMA SORUNU

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
Tüm Yanıtlar
-
-
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
-
Thread'i nerede başlatıyorsunuz? Ve DataGridView.DataSource = ds.Tables[0]; nerede? Belli ki zamanlama konusunda hatanız var.
-
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 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
-
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
-
Ç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.
-
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.
-
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.
-
Ç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
-
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.
-
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?