2012-01-05 22 views
6

Estoy tratando de insertar un registro de base de datos dentro de un ciclo en C#.ExecuteNonQuery dentro del ciclo

funciona cuando codificar los valores de esta manera:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);"; 
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
    sqlConnection3.Open(); 

    for (int i = 0; i < arrItemsPlanner.Length; i++) 
    { 
     try 
      { 
       cmd3.ExecuteNonQuery(); 
      } 
      catch 
      { 
       return "Error: Item could not be saved"; 
      } 
      finally 
      { 
       //Fail 
      } 
     } 

Pero cuando se utiliza consultas parametrizadas no funciona - incluso si codificar un valor en la consulta parametrizada como esto:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
    sqlConnection3.Open(); 

    for (int i = 0; i < arrItemsPlanner.Length; i++) 
    { 
     try 
      { 
       cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); 
       cmd3.Parameters["@room_id"].Value = 222; 
       cmd3.ExecuteNonQuery(); 
      } 
      catch 
      { 
       return "Error: Item could not be saved"; 
      } 
      finally 
      { 
       //Fail 
      } 
     } 

¿Alguien puede ver dónde me está yendo mal aquí?

¡Muchas gracias!

Respuesta

4

Parece que va a agregar a la colección de parámetros del comando una y otra vez. Límpielo con cada iteración.

También sugeriría arrojar la excepción real para que pueda ver cuál es el problema.

+0

Gracias - ¡He estado rascándome la cabeza con eso por AGES! Les toma a ustedes segundos descubrirlo. Muchas gracias a todos. – Dan

+0

@Dan - ¡no hay problema! Por cierto, sugiero que actualice su código para usar la disposición adecuada con una declaración 'using' (como lo sugiere la publicación de Austin Salonen). –

1

Lo que está haciendo es agregar un parámetro cada iteración de bucle. En el siguiente código, agrega el parámetro una vez, y simplemente modifica el valor del parámetro único. Prueba esto:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
cmd3.Parameters.Add("@room_id", SqlDbType.Int); 

sqlConnection3.Open(); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
     { 
      cmd3.Parameters["@room_id"].Value = 222; 
      cmd3.ExecuteNonQuery(); 
     } 
     catch 
     { 
      return "Error: Item could not be saved"; 
     } 
     finally 
     { 
      //Fail 
     } 
    } 
1

Sí, no añada el parámetro en el circuito, sólo se establece su valor:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3); 
sqlConnection3.Open(); 

cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
     { 
      cmd3.Parameters["@room_id"].Value = 222; 
      cmd3.ExecuteNonQuery(); 
     } 
     catch 
     { 
      return "Error: Item could not be saved"; 
     } 
     finally 
     { 
      //Fail 
     } 
    } 
1
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int); 

// no seguir añadiendo que en el bucle sea

cmd3.Parameters["room_id"].Value = 222; 

Sin @needed en la colección de parámetros whne utilizando SQL Server

3

Esto no se ha probado pero debería funcionar como una alternativa. Solo agrégalo una vez y actualiza continuamente su valor.

.... 
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
     { 
      cmd3.Parameters["@room_id"].Value = 222; 
      cmd3.ExecuteNonQuery(); 
     } 
.... 

Como acotación al margen, su SqlCommand debe estar dentro de un bloque using, así como su SqlConnection. No se muestra el código completo, así que no sé si tu conexión se realizó de esa manera.

using (var conn = new SqlConnection(...)) 
using (var cmd = new SqlCommand(..., conn)) 
{ 

} 
4

Te digo una solución simple & para asegurarse de que funciona. Si está utilizando parámetros en el bucle, debe borrar los parámetros después de la ejecución de la consulta. para que pueda usar que

cmd3.executeNonQuery(); 
cmd3.parameters.clear(); 
0

Otra solución para aquellos que están buscando en este hilo. Crea dos conexiones. Uno para su ciclo y otro para enviar sus declaraciones NonQuery. Esto funcionó para mí.

Cuestiones relacionadas