IndexOutOfRangeException

Deletemaster

Erfahrenes Mitglied
Hallo zusammen,

ich habe mein kleines Programm von MySql an MSSQL "angepasst".
Vorher haben alle Querys funktioniert.
Da ich nun mit 2005 arbeite, habe ich einige Neuerungen berücksichtigt.

Statt Parameters.Add("@vrn", str_VRN);
Nun Parameters["vrn"].Values = str_VRN;

Wenn ich nun das Programm debugge bekomme ich folgende Fehlermeldung:
"cmd.Parameters["vrn"]" hat eine Ausnahme vom Typ "System.IndexOutOfRangeException" verursacht.

Weiterhin habe ich den reader abgeändert:

alt: txt_Nachname.Text = reader["nachname"].ToString();

neu:txt_Vorname.Text = (string)reader.GetValue(2); // 2. Spalte in Tabelle

die Query sieht folgendermaßen aus:

Code:
cmd.Parameters["vrn"].Value = str_VRN;
cmd.CommandText = "SELECT * FROM <tabelle> WHERE vrn = @vrn";

SqlDataReader reader = cmd.ExecuteReader();
	while ( reader.Read())
	{
                    ddl_Anrede.SelectedValue   = (string)reader.GetValue(1);
                    txt_Vorname.Text       = (string)reader.GetValue(2);
	}
	reader.Close();

Wie kann ich hier die OutOfRangeException beseitigen?

Danke für Eure Hilfe
 
Guten morgen Norbert,

In der MSDN steht:

Stellen Sie sicher, dass der maximale Index einer Liste kleiner als die Listengröße ist.
Stellen Sie sicher, dass der Index keine negative Zahl ist.
Stellen Sie sicher, dass die Datenspaltennamen korrekt sind.


Zur Zeit steht in der Tabelle nur ein Datensatz.
Das Feld "vrn" ist vom Typ varchar (wegen der führenden "0" der Vorwahl)
Die Spalte heiß definitiv "vrn"

Wie schon oben gepostet:
Ich habe anfangs lediglich beim lauffähigem Programm ODBC mit Data.Sql.Client
ausgetauscht. Dann kamen Warnungen, daß die Methode "Parameters.Add(." veraltet ist und nun anders gehandelt wird.

Danke
 
Hallo!

So wie ich das sehe, liegt das Problem in folgender Zeile:
neu:txt_Vorname.Text = (string)reader.GetValue(2); // 2. Spalte in Tabelle
Du musst hier mit einrechnen, dass den Index den du bei GetValue angibts bei 0 zu zählen beginnt!

Ach ja, schau dir mal die Methoden GetString() und GetSqlString() an, dann musst du nicht explizit casten.

lg
 
Hallo Re_Eagle,
Also am Index liegt es nicht.
die Exception liegt bei Parameters["vrn"].Value = <WERT>
Muss was anderes sein.

Merkwürdig nur, daß bei der Verbindung zur MySql alles funktionierte!

Das Prgramm startet ohne Probleme, nur bekomme ich keinen Datensatz angezeigt.
Die Exception bekomme ich nur angezeigt, wenn ich Haltepunkt setze und in Einzelschritt starte!
 
Also wenn ich die "alte" Parameters.Add-Methode verwende funktioniert es!

Code:
cmd.Parameters.Add("@vrn", str_VRN);
cmd.CommandText = "SELECT * FROM <tabelle> WHERE vrn = @vrn";
txt_Vorname.Text                = (string)reader.GetValue(1);

Vielleicht sind nicht alle Neuerungen im 2.0 ausgereift?
 
Ok, sorry war mein Fehler, bin vorhin erst aufgestanden ;)

Aber jetzt eine andere Frage: Kann mich jemand aufklären, welche Erneuerung dieser Indexer sein soll? (oder täusche ich mich da total)

So wie sich das für mich darstellt, willst du auf eine Collection mittels einem Indexer zugreifen: Parameters["vrn"].Value
Aber wenn du so auf diese Parameters Collection zugreifst, muss der Eintrag vorher erstellt worden sein Parameters.Add(..)

lg
 
Genau, dieser wird vorher erstellt:

cmd.Parameters.Add("@vrn", str_VRN); //"alte" Version (veraltet) aber funktioniert
//cmd.Parameters["vrn"].Value = str_VRN; / "neue" Version erzeugt IndexOutOfRangeException warum auch immer?
cmd.CommandText = "SELECT * FROM <tabelle> WHERE vrn = @vrn";
 
Du fügst mir Parameters.Add("@vrn",....) einen Parameter hinzu und du fragst ihn mit Parameters["vrn"] ab .. schau nochmal ganz scharf hin ... Wenn du es nicht siehst, dann schau auf dir mit IntelliSense oder dem Objectbrowser die Parameternamen der Add-Methode an. Dann sollte es eigentlich KLICK machen ...

Und mit Neuerungen in .NET 2.0 hat das gar nichts zu tun. Die wurden an anderen Stellen gemacht.
 
Zurück