Bevor Sie diese Frage als ein Duplikat markieren, hier ist der schwierige Teil, den ich nicht verstehe. Dieser Fehler ist sporadisch, ich glaube, dass der Code korrekt ist und er funktioniert immer und ich behandle die möglichen Fehler mit einer if else-Bedingung innerhalb des Reader-Teils. Hier ist der Code:Code nicht synchronisiert werfen Index war außerhalb der Grenzen Array?
public static Tuple<int, string> GetIDAndString(string term)
{
try
{
using (SqlConnection con = GetConnection())
using (cmd = new SqlCommand())
using (myReader)
{
int ID = 0;
string status = string.Empty;
cmd.Connection = con;
con.Open();
cmd.CommandText = @"SELECT t.TableID, t.Status
FROM Table t WITH (NOLOCK) /* I know NOLOCK is not causing the mistake as far as I know */
WHERE t.Term = @term";
cmd.Parameters.AddWithValue("@term", term);
myReader = cmd.ExecuteReader();
while(myReader.Read())
{
ID = myReader.IsDBNull(0) ? 0 : myReader.GetInt32(0);
status = myReader.IsDBNull(1) ? string.Empty : myReader.GetString(1).Trim();
}
myReader.Close();
return new Tuple<int, string>(ID, status);
}
}
catch (Exception)
{
throw;
}
}
Ich weiß, ich sollte eine Klasse anstelle eines Tuple werden, aber ich kann nicht, dass die vorhandenen Code ändern und wie Sie sehen können. Das Hauptproblem ist also, dass es auf dem Produktionsserver eine Index out of bounds array exception
in dieser Methode gab, aber ich kann nicht identifizieren, was das Problem ist.
Auch wenn der Begriff in der Abfrage nicht gefunden wird, wird der myReader nicht eingegeben und ich gebe die ID = 0, status = string.Empty zurück. Manchmal, wenn ich Code debugge und an der develpment server
arbeite, beginnt mein Code überall zu stürzen, zeigt mir Ausnahmen, wo Code getestet wird, und ich muss die Lösung erneut öffnen, um das zu vermeiden (ich habe keine Lösung dafür gefunden, nicht einmal Reinigung der Lösung).
Also ich hoffe, jemand hat Erfahrung mit so etwas in einer production server
. Ich habe keine Spezifikationen für den Produktionsserver, daher weiß ich nichts über den Server.
Erstellen Sie neue Datenleser teilen Sie es nicht! Das könnte dir Probleme bereiten! – mybirthname
Stimmen Sie dem vorherigen Kommentar zu, entweder erstellen Sie eine neue Instanz oder synchronisieren Sie den Zugriff darauf. –
@mybirthname, Ich bin neu in der Programmierung, Sie sagten, den DataReader nicht zu teilen. Sie meinen, keine Klasse zu verwenden, in der ich einen geschützten statischen SqlDataReader deklarierte und ihn dann in einem using-Block verwendete? –