17 Temmuz 2010 Cumartesi

IndexOutOfRangeException Hatası Çözümü

IndexOutOfRangeException was unhandled
Selamlar herkese C#(CSharp) üzerinde bir proje geliştiriyorum.Fakat bilgilerim yeterince taze değil ve çok sık problem yaşamaktayım.Fakat yaşadığım problemin sebebini öğrenince ben neden böyle bir hataya düştüm diye kendimi yiyorum :)

İşte çözdüğümde ya bu muymuş ben nasıl yaparım böyle hatayı dediğim problemlerden birisi daha

Visual Studio 2008 C# IndexOutOfRangeException hatası
IndexOutOfRangeException was unhandled
Asıl Hata Mesajı
Index was outside the bounds of the array.

Mesajın Devamı

System.IndexOutOfRangeException was unhandled
Message="Index was outside the bounds of the array."
Source="System.Data"
StackTrace:
at System.Data.OleDb.OleDbDataReader.DoValueCheck(Int32 ordinal)
at System.Data.OleDb.OleDbDataReader.GetValue(Int32 ordinal)
at System.Data.OleDb.OleDbDataReader.get_Item(Int32 index)
at WindowsFormsApplication1.Form1.guncellelıst_MouseDoubleClick(Object sender, MouseEventArgs e) in C:\Documents and Settings\PC2010\Desktop\BasitWindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 445
at System.Windows.Forms.Control.OnMouseDoubleClick(MouseEventArgs e)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsFormsApplication1.Program.Main() in C:\Documents and Settings\PC2010\Desktop\BasitWindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

Hatanın Anlamı Gelen değerler index dışına çıkıyor.Bu yüzden IndexOutOfRangeException Hatası alıyorum. Kodlarımı inceledim hatayı yaşadığımdaki kodlarım şu şekilde

OleDbCommand vtKomut = new OleDbCommand("select kelime from kelimeler WHERE kelime='" + kelimeguncelletxt.Text + "'", vtBaglanti);
vtBaglanti.Open();
OleDbDataReader vtkayit;
vtkayit = vtKomut.ExecuteReader();
if (vtkayit.Read())// kayıt yoksa okuma işlemi olmuyor varsa oluyor
{
guncelleanlam1txt.Text = vtkayit[0].ToString();
guncelleanlam2txt.Text = vtkayit[1].ToString();
guncelleanlam3txt.Text = vtkayit[2].ToString();
guncelleanlam4txt.Text = vtkayit[3].ToString();
guncelleanlam5txt.Text = vtkayit[5].ToString();
}

vtKomut isminde database üzerinde sorgular yapmamı sağlayacak Oledbcommand nesnesi tanımladım.Amacım sorgu ile istediğim kelimenin devamı olan es anlamlı kelimelerin db'den beraberinde getirilmesiydi. ve Nesnem olan vtKomut'a sql sorgumu yükledim sorgum şu şekilde :
"select kelime from kelimeler WHERE kelime='" + kelimeguncelletxt.Text + "'"
Daha sonra bağlantımı açıp database'de sorgulama sonucu gelecek değerleri okuma yeteneğine sahip olan bir OleDbDataReader nesnesi tanımladım.Nesnemizin adı vtkayit'tir.

daha sonra sql sorgumu çalıştırıyor ve gelen değerleri okuma yeteneğine sahip olan vtkayıt nesneme yüklüyorum.

vtkayit = vtKomut.ExecuteReader();

yükleme işlemi yapılıyor ve ben bu kayıtları okuması için vtkayıt'a read() fonksiyonunu çağırarak emrediyorum.Bu okuma işlemi gerçekleşirse istediğim işlemleri yaptırmak için ise if karşılaştırma ifadesi içine alıyorum.

if (vtkayit.Read())

vtkayıt içerisindeki değerler okunabildi ise tüm gelen esanlamlı sözcüklerimi (5 adet) gerekli textboxlarıma aktarıyorum.

guncelleanlam1txt.Text = vtkayit[0].ToString();
guncelleanlam2txt.Text = vtkayit[1].ToString();
guncelleanlam3txt.Text = vtkayit[2].ToString();
guncelleanlam4txt.Text = vtkayit[3].ToString();
guncelleanlam5txt.Text = vtkayit[5].ToString();

tex boxlara gelen alanlar vtkayit[0] (sql'den gelen ilk değer) , vtkayit[1] (sql'den gelen 2. değer) , vtkayit[2] (sql'den gelen 3. değer) , vtkayit[3] (sql'den gelen 4. değer) vtkayit[5] (sql'den gelen 6. değer)'tir.

F5 ile programımı çalıştırıyorum ve IndexOutOfRangeException Hatası alıyorum.Daha sonra hatayı yorumluyorum.Gelen değerler index dışına çıkıyor.Peki nedir bu index dışı olayı. Elimize 3 elma geliyor fakat biz 5 elma ile işlem yapmaya çalışıyoruz.Programda bizi sana 3 elma geliyor 5 elma ile işlem yapamazsın diyor IndexOutOfRangeException Hatası bizde bunu zorda olsa geç farkediyoruz ve bükemediğimiz eli öpüyoruz ve tekrar tekrar inceliyoruz.Sonra SQL sorgumuza gözümüz kayıyor birde bakıyoruz ki biz dbden gerçekten 3 elma isemişiz ama program içerisinde 5 elma ile iş yapmaya çalışıyoruz.Hemen ya bumuydu uff be ben bunun içinmi bu kadar can çekiştim lafları arasında sql sorgumuzu
düzenliyoruz.

Eski sorgumuz : (Gelen elma sayısı 1)
"select kelime from kelimeler WHERE kelime='" + kelimeguncelletxt.Text + "'"
Yeni sorgumuz :(Gelen elma sayısı 5)
"select esanlam1, esanlam2, esanlam3, esanlam4, esanlam5 from kelimeler WHERE kelime='" + kelimeguncelletxt.Text + "'"
Problemimizi çözüyoruz neşe ile kodlara devam ediyoruz
Bilmeyen arkadaşlare Faydalı olması dileğiyle :)

Eğer sizde bu bilgiyi faydalı buluyorsanız yorum olarak bizlere iletin

2 yorum:

Selçuk Dursun HEPSOY dedi ki...

Teşekkürler kardeşim sağolasın

Adsız dedi ki...

Çok Sağol Usta Teşekkür Ederim.