2016-04-06 13 views
0

Ich versuche unten Code zum Einfügen von Datensätzen in die Datenbank über eine gespeicherte Prozedur.Aktivieren Sie zum Einfügen von Daten in SQL Server mithilfe einer gespeicherten Prozedur

Zum ersten Mal Schleife erfolgreich Datensatz einfügen, aber nach dem zweiten Mal seines zeigt mir Fehler auf ExecuteNonQuery:

Prozedur oder Funktion SP_FUNCTIONAL_TITLE_MASTER_INSERT angegeben zu viele Argumente hat.

Bitte helfen Sie.

public int InsertData(DataTable objLst) 
{ 
    string query = "SP_FUNCTIONAL_TITLE_MASTER_INSERT"; 

    try 
    { 
     SqlCommand cmdCommand = new SqlCommand(query, ConnectionClass.openConnection()); 

     foreach (DataRow dr in objLst.Rows) 
     { 
      cmdCommand.CommandType = CommandType.StoredProcedure; 
      cmdCommand.Parameters.AddWithValue("@CODE",Convert.ToInt64(dr["Code"])); 
      cmdCommand.Parameters.AddWithValue("@Designation", dr["Designation"]); 
      cmdCommand.Parameters.AddWithValue("@Group", dr["Group"]); 

      cmdCommand.ExecuteNonQuery(); 
      IsSavedCount += 1; 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     ConnectionClass.CloseConnection(); 
    } 

    return IsSavedCount; 
} 
+1

Können Sie Ihre sp Code hier posten too – Izzy

+0

Der Fehler ist ziemlich klar, Sie geben der gespeicherten Prozedur zu viele Parameter an. Geben Sie nur die an, die es benötigt. (Beachten Sie, dass Sie die Parameter * in einer Schleife * hinzufügen, also fügen Sie für jede Zeile in 'objLst' drei Parameter hinzu. Wenn es 10 Zeilen gibt, hat die gespeicherte Prozedur wirklich 30 Parameter mit wiederholten Namen?) – David

+0

Ja. Lieber Mohammed, kannst du lesen? LESEN SIE DIE DEFINITION DES SP. Sehen Sie, welche Parameter benötigt werden. Dann erkenne, dass Programmieren nicht wie Geld ist. Während Sie nie zu viel Geld haben können, können Sie zu viele Parameter haben. – TomTom

Antwort

3

Dies würde "beheben".

 foreach (DataRow dr in objLst.Rows) 
     { 
      cmdCommand.Parameters.Clear(); 

Aber Sie wären besser dran, dies zu tun

(Erstellen Sie die Parameter außerhalb der Schleife und die Parameter in der Schleife)

command.Parameters.Add(new SqlParameter("@CODE", SqlDbType.BigInt)); /* fix to your datatype here */ 
command.Parameters.Add(new SqlParameter("@Designation", SqlDbType.VarChar, 128)); /* fix to your datatype and optional "size" here */ 
command.Parameters.Add(new SqlParameter("@Group", SqlDbType.VarChar, 128)); /* fix to your datatype and optional "size" here */ 

    foreach (DataRow dr in objLst.Rows) 
    { 
    command.Parameters["@CODE"].Value = Convert.ToInt64(dr["Code"]); 
    command.Parameters["@Designation"].Value = dr["Designation"]; 
    command.Parameters["@Group"].Value = dr["Group"]; 
    command.ExecuteNonQuery(); 
    } 
+0

Korrigieren Sie, aber denken Sie daran, die Parameter mit dem richtigen Datentyp zu erstellen. Die erste Zeile _new SqlParameter ("@ CODE", 0) _ ist bekanntermaßen eine Quelle von Problemen. – Steve

+0

Guter Punkt. Ich benutzte "Pseudo-Code" aus dem Speicher ... um die Antwort zu schreiben. Aber zu OP hat Steve Recht. Erstellen Sie den richtigen Daten-Typ-Parameter von der get-go. – granadaCoder

+0

Ich bearbeitet, um richtige Datentypen von Get-Go zu verwenden. – granadaCoder

Verwandte Themen