Nesne başvurusu bir nesnenin örneğine ayarlanmadı hatası

paristanbulima (228) 8 yıl önce sordu

Nesne başvurusu bir nesnenin örneğine ayarlanmadı hatası alıyorum. Veritabanındaki alan 1 ise checkbox ı seçili yapmaya çalışıyorum. Alanın verisini alıyor i değişkenine doğru bir şekilde. Ama if'in içine girdiği zaman checkbox işleminde hata alıyorum.

SqlCommand cmd = new SqlCommand("Select * from Reminder_Info where UserId='" + UserId + "'", connection);
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                        int i = Convert.ToInt32(dr[14]);
                        
                        if (i == 1)
                        {
                            CheckBox chk = (CheckBox)DLRemindings.FindControl("chckincessant");
                            chk.Checked = true;
                        }
                        else if (i == 0)
                        {
                            CheckBox chk = (CheckBox)DLRemindings.FindControl("chckincessant");
                            chk.Checked = false;
                        }
                    }

Toplam 1 cevap


alattin (16999) 8 yıl önce cevapladı

Bu kodda pek çok hata olabilir. 

Olabilir diyorum çünkü beklediğiniz değerler boş, null geliyor olabilir.

Örneğin UserId değeri geliyor mu?

Ayrıca string birleştirme yerine SqlParameter kullanırsanız çok daha iyi olur:

SqlCommand cmd = new SqlCommand("Select * from Reminder_Info where UserId=@pUserID", connection);
cmd.Parameters.AddWithValue("@pUserID", UserID);

Yine dr[14])  null geliyor olabilir. 

Çoğunlukla Nesne başvurusu bir nesnenin örneğine ayarlanmadı. hatası, değerni null olan bir nesnenin özelliğine erişilmek istenildiğinde alınır.

Mesela;

CheckBox chk = (CheckBox)DLRemindings.FindControl("chckincessant");
chk.Checked = true;

Burada chk bulunamazsa ne olur?

İşte o zaman  Nesne başvurusu bir nesnenin örneğine ayarlanmadı. hatası alırsınız.

Hatayı gidermek için adım adım, BreakPoint kullanarak, nesneler değer alıyor mu kontrol edin.

Ayrıca bağlantı açıyorsunuz değil mi?
 

  var connection = new SqlConnection("server=.\\Sqlexpress; database=uzmanimnet; Integrated security=SSPI");
            SqlCommand cmd = new SqlCommand("Select * from Posts Where UserId=8", connection);
            connection.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                var i = dr[1];

               
            }
            connection.Close();

 

paristanbulima 8 yıl önce

Merhaba. Kontrol ettim. Bütün değerler geliyor. Onda problem yok. Fakat bir problemi keşfettim; ilk değerleri alıyor, 2. satıra geçmiyor. döngü kayıt sayısı kadar dönüyor ama hep ilk satırın değerlerini alıyor. yani döngü her döndüğünde i değişkeni 1 değerini alıyor. 0 alması gerektiğinde de ilk değeri yani 1i alıyor. Kodu da biraz değiştirdim ama yine hata var. Sorun aynı. Nesne başvurusu...

alattin 8 yıl önce

Sizin kodunuzu kopyaladım biraz değiştirdim, yukarıda cevabı güncelledim. dr[14] satırında bir hatanız yoksa sorunsuz çalışmalı. Yukarıdaki örnekte 2. kolon değeri (saymaya 0 dan başlıyoruz) ekrana geliyor.

paristanbulima 8 yıl önce

Benim sorunum for döngümde sanırım. Çünkü hep ilk kaydın değerlerini alıyor. 2. kayda geçmiyor. Ama döngü kayıt sayısı kadar dönüyor. Bakınız kod; while (dr.Read()) { DataListItemCollection dlic = DLRemindings.Items; for (int i = 0; i <= dlic.Count; i++) { int a = Convert.ToInt32(dr[14]); int b = Convert.ToInt32(dr[15]); if (a == 0 & b == 0) { ((CheckBox)DLRemindings.Controls[i].FindControl("chckincessant")).Checked = false; ((CheckBox)DLRemindings.Controls[i].FindControl("chckshift")).Checked = false; } else if (a == 1 & b == 1) { ((CheckBox)DLRemindings.Controls[i].FindControl("chckincessant")).Checked = true; ((CheckBox)DLRemindings.Controls[i].FindControl("chckshift")).Checked = true; } else if (a == 0 & b == 1) { ((CheckBox)DLRemindings.Controls[i].FindControl("chckincessant")).Checked = false; ((CheckBox)DLRemindings.Controls[i].FindControl("chckshift")).Checked = true; } else if (a == 1 & b == 0) { ((CheckBox)DLRemindings.Controls[i].FindControl("chckincessant")).Checked = true; ((CheckBox)DLRemindings.Controls[i].FindControl("chckshift")).Checked = false; } } }

paristanbulima 8 yıl önce

Anlaşılmıyor mu?

alattin 8 yıl önce

While döngüsünde bir sorun yok. for döngüsüne gerek yok diye düşünüyorum. hata sanırım burada. For döngüsünü kaldırın. int i =0 tanımlayın while'dan önce. While son satırında i++ yapın.

paristanbulima 8 yıl önce

Peki (CheckBox)DLRemindings.Controls[i] 'nde Controls[i] mi olmalı? i yerine başka bişe mi gelmeli? çünkü ifleri kaldırdığımda doğru çalıştı orada problem var NullReferenceException was caught diyo bu sefer de.

paristanbulima 8 yıl önce

Birde çalışıyor musun sen? Çalışmıyorsan çalışmayı düşünür müsün? Bize biri lazım. Eğer istersen ve yakınsan ve düşünürsen bir görüşelim.

paristanbulima 8 yıl önce

Yaptım. Ordaki i yerine i+1 yazdım oldu. Çok teşekkürler.

alattin 8 yıl önce

Tebrikler! Teklif için çok teşekkürler, çalışıyorum :)

paristanbulima 8 yıl önce

:) teşekkürler