none
Ejecutar SP, Error al establecer la conexión. RRS feed

  • Pregunta

  • Buenas noches, Estoy intentando ejecutar SP desde SQLServer, pero me arroja el error de que la conexcion no se a inicializado correctamente, siendo que abro la misma antes de ejecutar el SP.

            Try
                Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    
                    Using comando As New SqlCommand
                        cn.Open()
                        With comando
                            .CommandType = CommandType.StoredProcedure
                            .CommandText = "BorrarCompra"
                            .Parameters.AddWithValue("@id", CInt(IDComprasLabel1.Text))
                            Dim msgParam As New SqlParameter("@msg", SqlDbType.VarChar)
                            msgParam.Direction = ParameterDirection.Output
                            .Parameters.Add(msgParam)
                            '  MsgBox("El registro se elimino " & CStr(msgParam.Value))
                        End With
                        comando.ExecuteNonQuery()
                    End Using
                End Using
            Catch ex As Exception
                MsgBox("Ocurrio el siguiente error " & ex.ToString, vbCritical)
            End Try
    
        End Sub

    sábado, 24 de noviembre de 2012 3:20

Respuestas

  • "J. Karlos" escribió:

    > Estoy intentando ejecutar SP desde SQLServer, pero me arroja el error
    > de que la conexcion no se a inicializado correctamente, siendo que
    > abro la misma antes de ejecutar el SP.
    >
    >  Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    >    Using comando As New SqlCommand
    >      cn.Open()
    >      With comando
    >       .CommandType = CommandType.StoredProcedure
    >       .CommandText = "BorrarCompra"
    >       .Parameters.AddWithValue("@id", CInt(IDComprasLabel1.Text))
    >       Dim msgParam As New SqlParameter("@msg", SqlDbType.VarChar)
    >       msgParam.Direction = ParameterDirection.Output
    >       .Parameters.Add(msgParam)
    >       '  MsgBox("El registro se elimino " & CStr(msgParam.Value))
    >      End With
    >      comando.ExecuteNonQuery()
    >    End Using
    >  End Using

    Hola:

    Es normal que obtengas ese mensaje de error, porque tal y como tienes escrito tu código, el objeto SqlCommand no sabe qué conexión u objeto SqlConnection debe de utilizar para conectarse con la base de SQL Server. Es decir, te falta asignar el valor de la propiedad Connection del objeto SqlCommand:

       ' Le asignamos la conexión
       '
       comando.Connection = cn

    Esa asignación te la puedes ahorrar si creas el objeto SqlCommand como te indico a continuación:

      Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    
          ' Creamos el comando
          '
          Using comando As SqlCommand = cn.CreateCommand()
    
              ' Resto del código
    
          End Using
    
      End Using

    Esto es lo que yo suelo utilizar cuando deseo crear un comando, y es lo que recomiendo que se haga, evitando tener que ejecutar la siguiente sobrecarga del método SqlCommand:

         Using comando As New SqlCommand("BorrarCompra", cn)

    Personalmente no me gusta esa sobrecarga, porque si bien en éste caso el texto del comando es corto ("BorrarCompra"), imagina una consulta SQL cuya sintaxis fuera demasiado grande. Tendrías que declarar una variable alfanumérica que almacenara el texto de la consulta SQL, y esa variable alfanumérica sería la que le pasaras al constructor del objeto SqlCommand.

    Queda muchísimo mejor, y más claro, crear el comando de ésta manera:

         Using comando As SqlCommand = cn.CreateCommand()

    Y el texto de la consulta SQL, o el nombre del procedimiento almacenado, iría en la propiedad CommandText, evitando así tener que declarar una nueva variable alfanumérica para ese cometido.

    Aunque también comprendo que para gustos están los colores. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    sábado, 24 de noviembre de 2012 10:14
    Moderador
  • hola

    yo uso esta estructura de codigo

    Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    	cn.Open()
    
    	Using comando As New SqlCommand("BorrarCompra", cn)
    		comando.CommandType = CommandType.StoredProcedure
    
    		comando.Parameters.AddWithValue("@id", CInt(IDComprasLabel1.Text))
    		Dim msgParam As New SqlParameter("@msg", SqlDbType.VarChar)
    		msgParam.Direction = ParameterDirection.Output
    		comando.Parameters.Add(msgParam)
    
    		comando.ExecuteNonQuery()
    	End Using
    	
    End Using

    marco en negrita donde asigno query y conexion al comando

    como veras queda muy prolija declarando la info en el constructor

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 24 de noviembre de 2012 10:48

Todas las respuestas

  • hola

    Pero cual es la cadena de conexión que tienes, porque puede que la tengas mal.

    Saludos.


    Cristian Torres
    Blog Cristian Torres

    El Salvador - San Salvador

    sábado, 24 de noviembre de 2012 4:53
  • No es tanto que mi cadena de conexion este mal, ya que la llamo desde My.Setting ya sea utilizando un TableAdaptes o lo llame sin table adapter, cuando me falla es al momento de usar una operación ya sea un insert, update o delete usando un SP
    sábado, 24 de noviembre de 2012 5:49
  • "J. Karlos" escribió:

    > Estoy intentando ejecutar SP desde SQLServer, pero me arroja el error
    > de que la conexcion no se a inicializado correctamente, siendo que
    > abro la misma antes de ejecutar el SP.
    >
    >  Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    >    Using comando As New SqlCommand
    >      cn.Open()
    >      With comando
    >       .CommandType = CommandType.StoredProcedure
    >       .CommandText = "BorrarCompra"
    >       .Parameters.AddWithValue("@id", CInt(IDComprasLabel1.Text))
    >       Dim msgParam As New SqlParameter("@msg", SqlDbType.VarChar)
    >       msgParam.Direction = ParameterDirection.Output
    >       .Parameters.Add(msgParam)
    >       '  MsgBox("El registro se elimino " & CStr(msgParam.Value))
    >      End With
    >      comando.ExecuteNonQuery()
    >    End Using
    >  End Using

    Hola:

    Es normal que obtengas ese mensaje de error, porque tal y como tienes escrito tu código, el objeto SqlCommand no sabe qué conexión u objeto SqlConnection debe de utilizar para conectarse con la base de SQL Server. Es decir, te falta asignar el valor de la propiedad Connection del objeto SqlCommand:

       ' Le asignamos la conexión
       '
       comando.Connection = cn

    Esa asignación te la puedes ahorrar si creas el objeto SqlCommand como te indico a continuación:

      Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    
          ' Creamos el comando
          '
          Using comando As SqlCommand = cn.CreateCommand()
    
              ' Resto del código
    
          End Using
    
      End Using

    Esto es lo que yo suelo utilizar cuando deseo crear un comando, y es lo que recomiendo que se haga, evitando tener que ejecutar la siguiente sobrecarga del método SqlCommand:

         Using comando As New SqlCommand("BorrarCompra", cn)

    Personalmente no me gusta esa sobrecarga, porque si bien en éste caso el texto del comando es corto ("BorrarCompra"), imagina una consulta SQL cuya sintaxis fuera demasiado grande. Tendrías que declarar una variable alfanumérica que almacenara el texto de la consulta SQL, y esa variable alfanumérica sería la que le pasaras al constructor del objeto SqlCommand.

    Queda muchísimo mejor, y más claro, crear el comando de ésta manera:

         Using comando As SqlCommand = cn.CreateCommand()

    Y el texto de la consulta SQL, o el nombre del procedimiento almacenado, iría en la propiedad CommandText, evitando así tener que declarar una nueva variable alfanumérica para ese cometido.

    Aunque también comprendo que para gustos están los colores. ;-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    sábado, 24 de noviembre de 2012 10:14
    Moderador
  • hola

    yo uso esta estructura de codigo

    Using cn As New SqlConnection(My.Settings.DB_PruebaConnectionString)
    	cn.Open()
    
    	Using comando As New SqlCommand("BorrarCompra", cn)
    		comando.CommandType = CommandType.StoredProcedure
    
    		comando.Parameters.AddWithValue("@id", CInt(IDComprasLabel1.Text))
    		Dim msgParam As New SqlParameter("@msg", SqlDbType.VarChar)
    		msgParam.Direction = ParameterDirection.Output
    		comando.Parameters.Add(msgParam)
    
    		comando.ExecuteNonQuery()
    	End Using
    	
    End Using

    marco en negrita donde asigno query y conexion al comando

    como veras queda muy prolija declarando la info en el constructor

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 24 de noviembre de 2012 10:48
  • Perdon por tardar en responder.

    Estube revisando y haciendo las modificaciones que me indican, y todo bien despues de hacerlas, solo que al momento de ejecutar el SP me marca un error, le e dado vueltas al asunto a mas no poder mas no logro encontrar el origen del mensaje.

    jueves, 29 de noviembre de 2012 4:11
  • "J. KarLos" escribió:

    > Estube revisando y haciendo las modificaciones que me
    > indican, y todo bien despues de hacerlas, solo que al
    > momento de ejecutar el SP me marca un error, ...
    >
    > la propiedad Size tiene un tamaño no válido de 0
    > en ExecuteNonQuery() en Prueba_Net.Form1.sp_insertar()
    > en C:\...\Prueba Net\Form1.vb:línea 203

    ¡Vamos a ver! Este mensaje de error no tiene nada que ver con el que obtenías al iniciar esta conversación, que te recuerdo era:

    [...] me arroja el error de que la conexcion no
          se a inicializado correctamente [...]

    Sería conveniente que iniciaras una nueva conversación para éste nuevo error, y de camino, no estaría de más que indicaras el código que se está ejecutando en el procedimiento sp_insertar existente en Form1.

    No obstante te aconsejaría que comprobaras bien si los parámetros que le pasas a tu procedimiento almacenado, tienen un valor  y tamaño adecuados.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    jueves, 29 de noviembre de 2012 7:08
    Moderador