2012-07-23 15 views
5

Aquí creo tabla en la base de datos dinámicamente. El usuario ingresa el nombre como lo desea y selecciona el idioma del botón de radio. Entonces, el problema es que después de ejecutar el valor de cmd.ExecuteNonQuery de mi entero va de -1 a 0. Y muestra que no se pudo crear la tabla, pero cuando voy a la base de datos, ya se creo correctamente. Por favor, hágame saber dónde estoy haciendo mal. ¡Gracias por adelantado!cmd.ExecuteNonQuery valor de i entero va -1 desde 0

protected void btnpaper_Click(object sender, EventArgs e) 
    { 
     try 
     {     
       string conn = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString; 
       SqlConnection con = new SqlConnection(conn); 
       con.Open(); 
       char[] arr = new char[] {'n','g','l','i','s','h'}; 
       string str = "CREATE TABLE " + Label1.Text.Trim() + 
          txtpaperset.Text.Trim()+ rbtnEng.Text.TrimEnd(arr) + 
          "(" + "quesNo int NOT NULL PRIMARY KEY, " + 
          "question varchar(1000) NOT NULL," + 
          "ansA varchar(500) NOT NULL, " + 
          "ansB varchar(500) NOT NULL, " + 
          "ansC varchar(500) NOT NULL, " + 
          "ansD varchar(500) NOT NULL, " + 
          "rightAns varchar(50) NOT NULL " + ")";      
       SqlCommand cmd = new SqlCommand(str, con); 
       int i = cmd.ExecuteNonQuery(); 
       if (i > 0) 
       { 
        lblerrormsg.Visible = true; 
        con.Close(); 
       } 
       else 
       { 
        lblerrormsg.Text = "Table Not Created Please Try with Different Name!";       
        con.Close(); 
       }     

     } 
     catch (System.Exception excep) 
     { 
      MessageBox.Show(excep.Message); 
     }  
    } 
+1

¿Es esto una invitación para la inyección de SQL? Use SQL-Parameters! Aparte de eso, siempre cierre una conexión cuando haya terminado con ella, lo mejor es usar 'using-statement':' using (var con = new SqlConnection (conn)) {con.Abierto(); // ...} '(cerrará la conexión implícitamente, incluso en el caso de una excepción). –

+2

@TimSchmelter: No estoy seguro de que el SQL parametrizado funcione para DDL ... –

Respuesta

8

Toma de MSDN Observaciones sobre SqlCommand.ExecuteNonQuery

Para UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un desencadenante en una tabla que se está insertando o actualizando, el valor devuelto incluye el número de las filas afectadas por la operación de inserción o actualización y el número de las filas afectadas por el activador o activadores. Para todos los demás tipos de declaraciones , el valor de retorno es -1. Si se produce un retroceso, el valor de retorno también es -1.

7

De la documentación para SqlCommand.ExecuteNonQuery (el énfasis es mío):

Para UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un desencadenante en una tabla que se inserta o actualiza, el valor de retorno incluye el número de filas afectadas por la operación de inserción o actualización y el número de filas afectadas por el desencadenante o desencadenantes. Para todos los demás tipos de declaraciones, el valor de retorno es -1. Si ocurre una reversión, el valor de retorno también es -1.

¿Es su declaración una instrucción UPDATE, INSERT o DELETE? Nop. Por lo tanto, obtienes -1.

No está claro lo que quiere decir por el valor de i va a -1 "de" 0. Nunca es 0. No tiene un valor hasta que se le asigna uno de los resultados de ExecuteNonQuery.

+0

Quiero que el usuario sepa si la creación de tabla se realizó con éxito o no. Por lo tanto, he usado i entero. Por favor ayuda con si puedo usar de otra manera. –

+0

@rickevans: supongo que si la creación de la tabla falla, en realidad obtendrá una excepción. Pruébelo: vea qué sucede si intenta recrear una tabla que ya existe. –

0

¿Es de diseño?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

y también:

cmd.executenonquery is returning -1 in vb.net windows application

que está diciendo que está recibiendo -1, correcto?

de edición: para responder a la última parte de su pregunta, consulte la siguiente:

Check if table exists in SQL Server

+0

Estoy obteniendo -1. todo lo que quiero hacer es notificar al usuario que la creación de la tabla lo ha hecho con éxito. –

+0

crear una consulta adicional para verificarlo. – johnny

+0

¿puedes por favor elaborar? –

-2

Shared Function público Insert (ByVal SProcedure como secuencia, parámetros ByVal() Como SqlParameter) As Boolean El uso de CNN New SqlConnection (Emplooyes) Pruebe

  Dim cmd As SqlCommand = New SqlCommand(SProcedure, cnn) 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Parameters.AddRange(parameters) 

      If cnn.State = ConnectionState.Closed Then 
       cnn.Open() 
      End If 

      Dim Ls As Integer 
      Ls= cmd.ExecuteNonQuery() 
      If Ls = -1 Then 
       Return False 
      Else 
       Return True 
      End If 

     Catch ex As Exception 
      Return False 
     Finally 
      cnn.Close() 
     End Try 
    End Using 
End Function 
+0

¡Bienvenido a Stack Overflow! ¿Consideraría agregar alguna narración para explicar por qué funciona este código y qué hace que sea una respuesta a la pregunta? Esto sería muy útil para la persona que hace la pregunta y para cualquier otra persona que se presente. –

Cuestiones relacionadas