2017-03-14 2 views
0

Ich versuche, die MySQL Datenbank von einer c# Anwendung abzufragen. Unten ist der Code, hier sind parameterized query bin mitMySql.Data.MySqlClient.MySqlException trat in MySql.Data.dll auf

public static void ValidateName(MySqlConnection conn,List<Employee> EmpList, string Group) 
{ 
    string selectQuery = "Select Name from Employee where Group = @Group AND @Name in (FirstName, LastName);"; 
    using (MySqlCommand cmd = new MySqlCommand(selectQuery, conn)) 
    { 
    for (int i = 0; i < EmpList.Count; i++) 
     { 
     cmd.Parameters.Add("@Group", MySqlDbType.VarChar).Value = Group; 
     cmd.Parameters.Add("@Name", MySqlDbType.VarChar).Value = EmpList[i].Name; 
     var reader = cmd.ExecuteReader(); 
     List<string> lineList = new List<string>(); 
     while (reader.Read()) 
     { 
      lineList.Add(reader.GetString(0)); 
     } 
     if (lineList.Count <=0) 
     { 
      WriteValidationFailure(EmpList[i], "Failed"); 
     } 
}  
} 

Aber die obigen Code-Fehler in Zeile unterhalb wirft

cmd.Parameters.Add("@Group", MySqlDbType.VarChar).Value = Group; 

Eine nicht behandelte Ausnahme des Typs ‚MySql.Data.MySqlClient.MySqlException sagen ' aufgetreten in MySql.Data.dll' @Gruppe wurde bereits definiert

Antwort

2

Dies geschieht, weil Sie die hinzufügen gleicher Parametersatz in jeder Iteration. Sie können dann entweder in jeder Iteration löschen oder sie vor dem Start der Schleife hinzufügen und den Wert des vorhandenen Parameters während jeder Iteration ändern. Ich denke, die zweite Option wäre großartig. Eine weitere Sache, die ich hier angeben muss, ist über den Leser, Sie müssen Leser als eine verwendende Variable verwenden, so dass jedes Mal es am Ende des verwendenden Blockes entsorgt wird und Ihr Code gut funktioniert. Was bedeutet, dass Sie etwas wie folgt ausprobieren können:

using (MySqlCommand cmd = new MySqlCommand(selectQuery, conn)) 
{ 
    cmd.Parameters.Add(new MySqlParameter("@Group", MySqlDbType.VarChar)); 
    cmd.Parameters.Add(new MySqlParameter("@Name", MySqlDbType.VarChar)); 
    for (int i = 0; i < EmpList.Count; i++) 
    { 
     cmd.Parameters["Group"].Value = group; 
     cmd.Parameters["Name"].Value = EmpList[i].Name; 
     // rest of code here 
     using (MySqlDataReader reader = cmd.ExecuteReader()) 
     { 
      // Process reader operations 
     } 

    } 
} 
+0

Muss ich hinzufügen cmd.Prepare(); vor jedem cmd.Pramaters.value verbessert es die Leistung des Codes – xyz

+0

Kannst du mir bitte vorschlagen, wenn die Verwendung von Prepare-Anweisungen die Leistung verbessert – xyz

+0

@xyz: Hoffen, dass [dieser Thread] (http://StackOverflow.com/Questions/ 20972375/how-to-right-and-efficient-reuse-ein-vorbereiteter-statement-in-c-sharp-net-sql) kann es gut erklären –

Verwandte Themen