Puedo hacer un delete, insert y update en mi programa y trato de hacer una inserción por llamar a un procedimiento almacenado de la base de datos.

Este botón insertar puedo hacer el trabajo bien.

private void btnAdd_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(dc.Con);
        SqlCommand cmd = new SqlCommand("Command String", con);

        da.InsertCommand = new SqlCommand("INSERT INTO tblContacts VALUES (@FirstName, @LastName)", con);
        da.InsertCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
        da.InsertCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;

        con.Open();
        da.InsertCommand.ExecuteNonQuery();
        con.Close();

        dt.Clear();
        da.Fill(dt);
    } 

Este es el comienzo de el botón para llamar al procedimiento denominado sp_Add_contact para agregar un contacto. Los dos parámetros para sp_Add_contact(@FirstName,@LastName). He buscado en google por algún buen ejemplo, pero no he encontrado nada interesante.

private void button1_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(dc.Con);
        SqlCommand cmd = new SqlCommand("Command String", con);
        cmd.CommandType = CommandType.StoredProcedure;

        ???

        con.Open();
        da. ???.ExecuteNonQuery();
        con.Close();

        dt.Clear();
        da.Fill(dt);
    }
  • Sólo un poco más de info – usted no debe el nombre de la aplicación de los procedimientos almacenados con un prefijo sp_, como antes, con sp_Add_contact. el prefijo sp_ es un sistema de procedimientos almacenados convención de nomenclatura, que, cuando SQL ve, va a buscar a través de todos los procedimientos almacenados del sistema antes de cualquier aplicación o el espacio de usuario almacenados procs. Como una cuestión de rendimiento, si la atención acerca de que en su aplicación, el prefijo sp_ se degradan sus tiempos de respuesta.
InformationsquelleAutor FrankSharp | 2011-09-24

7 Comentarios

  1. 240

    Es prácticamente el mismo que ejecutar una consulta. En su código original está creando un objeto de comando, de ponerlo en el cmd variable, y nunca lo uso. Aquí, sin embargo, tendrá el uso que en lugar de da.InsertCommand.

    También, el uso de un using para todos los objetos desechables, por lo que están seguros de que son eliminados correctamente:

    private void button1_Click(object sender, EventArgs e) {
      using (SqlConnection con = new SqlConnection(dc.Con)) {
        using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
          cmd.CommandType = CommandType.StoredProcedure;
    
          cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
          cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
    
          con.Open();
          cmd.ExecuteNonQuery();
        }
      }
    }
    • pero si este procedimiento no devuelve datos, ¿cómo puedo tomar en C#?
    • A continuación, utilice ExecuteReader o ExecuteScalar llamarlo.
    • En realidad me lo imaginé, primero usted tiene que utilizar el «cmd» para declarar e inicializar un SqlDataAdapter como: [SqlDataAdapter da = new SqlDataAdapter(cmd);], entonces [da.SelectCommand = cmd;], y, finalmente, [da.Fill(ds);] donde «ds» es un conjunto de datos que previamente han declarado.. Entonces usted puede utilizar este conjunto de datos para leer los datos de todos modos te deseo 🙂
    • Sí, que es otra forma de hacer la misma cosa. El adaptador de datos de usos ExecuteReader.
    • Con respecto a su sugirió modificar; no Existe un «estándar de C# horquillado de formato», y todos los soportes que no son estrictamente necesarios en caso de no ser eliminado.
    • Sólo un poco más de info – usted no debe el nombre de la aplicación de los procedimientos almacenados con un prefijo sp_, como antes, con sp_Add_contact. el prefijo sp_ es un sistema de procedimientos almacenados convención de nomenclatura, que, cuando SQL ve, va a buscar a través de todos los procedimientos almacenados del sistema antes de cualquier aplicación o el espacio de usuario almacenados procs. Como una cuestión de rendimiento, si la atención acerca de que en su aplicación, el prefijo sp_ se degradan sus tiempos de respuesta.
    • Estoy vwry bien consciente de eso, pero no creo que para hacer un comentario sobre él en el momento. Usted debe dirigir ese comentario a la OP, ya que es ahí donde el procedimiento viene su nombre.
    • debería haber sido ‘arriba en la OP’ – no me refiero a dirigir a ti… Este fue el aceptado contestar, así que he publicado mi comentario aquí – lo siento, voy a poner esto en virtud de la OP próxima vez… 🙂
    • ¿los parámetros el caso de la materia? son @FirstName y @FIRSTNAME la misma?
    • Que depende de la configuración de base de datos. La configuración predeterminada es que los identificadores no son sensetive.
    • ¿te refieres a la configuración de SQL Server/SQL Developer, o en Visual Studio Server Explorer?
    • Es la configuración de intercalación de la base de datos que determina si los identificadores caso sensetive.
    • Hola a todos, esta respuesta sólo me ayudó a salir. Mi única pregunta es: ¿la escritura de su nombre de procedimiento almacenado como un parámetro en el SqlCommand constructor de resolver automáticamente el procedimiento almacenado en la base de datos sin tener que decir que el C# aplicación lo que es de alguna manera?

  2. 31

    Tienes que añadir parámetros, ya que es necesario para el SP para ejecutar

    using (SqlConnection con = new SqlConnection(dc.Con))
    {
        using (SqlCommand cmd = new SqlCommand("SP_ADD", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@FirstName", txtfirstname);
            cmd.Parameters.AddWithValue("@LastName", txtlastname);
            con.Open();
            cmd.ExecuteNonQuery();
        }            
    }
    • AddWithValue es una mala idea; SQL Server no siempre el uso de la longitud correcta para nvarchar o varchar, causando una conversión implícita a ocurrir. Es mejor especificar el parámetro de longitud de forma explícita y, a continuación, agregue el valor por separado utilizando parameter.Value = txtfirstname.
  3. 10

    cmd.Parameters.Add(String parameterName, Object value) es obsoleto ahora. En lugar de utilizar cmd.Parameters.AddWithValue(String parameterName, Object value)

    Add(String parameterName, Object valor) ha quedado obsoleto. Uso AddWithValue(parameterName de Cadena, de Objetos de valor)

    No hay ninguna diferencia en términos de funcionalidad. La razón por la que
    obsoleto el cmd.Parameters.Add(String parameterName, Object value) en favor de AddWithValue(String parameterName, Object value) es dar más
    la claridad. Aquí está la referencia de MSDN para el mismo

    private void button1_Click(object sender, EventArgs e) {
      using (SqlConnection con = new SqlConnection(dc.Con)) {
        using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
          cmd.CommandType = CommandType.StoredProcedure;
    
          cmd.Parameters.AddWithValue("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text;
          cmd.Parameters.AddWithValue("@LastName", SqlDbType.VarChar).Value = txtLastName.Text;
    
          con.Open();
          cmd.ExecuteNonQuery();
        }
      }
    }
    • ¿Tienes un link o la fuente de la afirmación de que cmd.Parameters.Add está en desuso?
    • href=»https://msdn.microsoft.com/en-us/library/9dd8zze1(v=vs 110).aspx» >Add(String parameterName, Object valor) ha quedado obsoleto. Uso AddWithValue(Cadena parameterName, Object valor) Mismo he actualizado en mi respuesta demasiado
    • El comentario acerca de Agregar siendo depreciado es válido, y que invalida el aceptado respuesta. Cita: «AddWithValue reemplaza el método Add .. que toma una cadena y un objeto en desuso debido a la posible ambigüedad con la SqlParameterCollection.Agregar la sobrecarga de… Uso AddWithValue cada vez que desee agregar un parámetro especificando su nombre y valor.» msdn.microsoft.com/en-us/library/… Corregido sintaxis de ejemplo por @RahulNikate.
    • eso no es cierto, la aceptó respuesta utiliza el preferido de la sobrecarga de Add que tampoco es obsoleto. AddWithValue no es el mejor camino desde que se deduce el tipo de los parámetros de la paramater valor. Esto a menudo conduce a la mala ejecución de los planes o incorrecta de las conversiones. Asimismo, no validar el parámetro en el primer lugar(f.e. tipo si Datetime pero se pasa un String). Usted puede ver aquí que sólo Add que toma una Object como segundo argumento está en desuso.
    • AddWithValue tiene la misma funcionalidad que Add con Object, pero no es el camino preferido. Ambos necesitan para inferir el tipo.
    • Tienes toda la razón, @TimSchmelter. Mi lectura del texto fue defectuosa. Gracias por la corrección. Estoy escribiendo algo nuevo código donde voy a estar usando Add(). Y yo voy a cambiar mi upvote en esta Respuesta a un downvote, como Rahul Nikate estaba tan equivocado como yo.
    • Mi respuesta es específica acerca de Add(String parameterName, Object value) y no sobre todas las sobrecargas del método Add (). Así que no Es justo para downvote mi respuesta. Gracias
    • He cambiado mi respuesta como por Tim Schmelter aconsejar
    • Gracias por su consejo. He editado mi respuesta.

  4. 3

    Como una alternativa, tengo una librería que facilita el trabajo con los procs: https://www.nuget.org/packages/SprocMapper/

    SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
        sqlAccess.Procedure()
             .AddSqlParameter("@FirstName", SqlDbType.VarChar, txtFirstName.Text)
             .AddSqlParameter("@FirstName", SqlDbType.VarChar, txtLastName.Text)
             .ExecuteNonQuery("StoreProcedureName");
  5. 0
    public void myfunction(){
            try
            {
                sqlcon.Open();
                SqlCommand cmd = new SqlCommand("sp_laba", sqlcon);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                sqlcon.Close();
            }
    }
  6. -1

    La adición de los parámetros por separado me dio problemas, así que lo hice y funcionó muy bien:

     string SqlQ = string.Format("exec sp_Add_contact '{0}', '{1}'", txtFirstName.Text, txtLastName.Text);
     using (SqlConnection con = new SqlConnection(dc.Con)) {
       using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) {
    
    
        con.Open();
        cmd.ExecuteNonQuery();
     }
    }
    • Disfrutar peor performnace y el potencial de la inyección de SQL problemas
  7. -1

    El .RED de Proveedores de Datos consisten en un número de clases que se utiliza para conectarse a un origen de datos, ejecutar comandos, y devuelven conjuntos de registros. El Comando Objeto en ADO.NET proporciona un número de Ejecutar los métodos que pueden ser utilizados para realizar las consultas SQL en una variedad de maneras.

    Un procedimiento almacenado es un pre-ejecutable compilado objeto que contiene una o más instrucciones SQL. En muchos casos los procedimientos almacenados de aceptar parámetros de entrada y devolver múltiples valores . Valores de los parámetros pueden ser suministrados si un procedimiento almacenado está escrito para que los acepte. Un ejemplo de procedimiento almacenado con la aceptación de parámetro de entrada es la siguiente :

      CREATE PROCEDURE SPCOUNTRY
      @COUNTRY VARCHAR(20)
      AS
      SELECT PUB_NAME FROM publishers WHERE COUNTRY = @COUNTRY
      GO

    El anterior procedimiento almacenado es aceptar el nombre de un país (@PAÍS VARCHAR(20)) como parámetro y devolver todos los editores de la entrada del país. Una vez que el CommandType se establece en StoredProcedure, usted puede usar la colección de Parámetros para definir los parámetros.

      command.CommandType = CommandType.StoredProcedure;
      param = new SqlParameter("@COUNTRY", "Germany");
      param.Direction = ParameterDirection.Input;
      param.DbType = DbType.String;
      command.Parameters.Add(param);

    El código anterior, pasando país parámetro para el procedimiento almacenado de aplicación C#.

    • Su respuesta no usar con bloques cual es una mejor práctica. Además, no debe ser un bloque try catch para tratar cualquier tipo de excepciones.

Dejar respuesta

Please enter your comment!
Please enter your name here