none
INSERCIONES A LA BASE DE DATOS CON CADENAS VACÍAS RRS feed

  • Pregunta

  • Buen dia.

    Explicando mi problemática, resulta que lo que tengo como código en el sistema en ciertas ocasiones me inserta un campo sin nada en una las tablas de la base de datos; las inserciones las hago a través de un ciclo, ya que requiero insertar varios datos a la vez, y en dicho en arreglo, de 8 posiciones (por decir algo, ya que puede contener más o menos), me inserta correctamente los primeros 3 recorridos después los siguientes 3 recorridos me envía un campo vacío y las ultimas 2 inserciones las hace correctas (esto puede variar dependiendo el tamaño del arreglo), así mismo no lo hace siempre, un día me puede trabajar de lo más normal el sistema haciendo correctamente las inserciones y al siguiente día puede ocurrir el problema con la inserción.

    Este es el código que manejo para insertar:

            public SqlCommand consultasql(string cadenaconsulta)
            {
                consulta = new SqlCommand();
                consulta.CommandText = cadenaconsulta;
                consulta.CommandType = CommandType.Text;
                consulta.Connection = conexion;
                if (conexion.State == ConnectionState.Closed)
                {
                    conexion.Open();
                }
                consulta.CommandTimeout = 90000;
                consulta.ExecuteNonQuery();
                conexion.Close();
                return consulta;                 
            }

    Este método lo tengo en una clase llamada: SqlQuery, la parte donde inserto es la siguiente:

            SqlQuery mibd = new SqlQuery();
            DataTable datos = new DataTable();
            //La siguente variable es la que ocaciones me envia vacia
            //Cabe mencionar que es llenada por el usario desde un control txt en el form
            string folio = "F000001";
            private void Insertar()
            {
                for (int i = 0; i < datos.Rows.Count; i++)
                {
                    mibd.consultasql("INSERT INTO NAME_TABLE VALUES('" + datos.Rows[i][0].ToString() + "','" + datos.Rows[i][1].ToString() + "','" + datos.Rows[i][2].ToString() + "','" + datos.Rows[i][3].ToString() + "','" + folio + "')");
                }
            }

    La BD manejo SQL server 2008.

    Alguna causa a mi problema, y que solución le puedo dar?



    jueves, 4 de junio de 2015 18:34

Respuestas

  • hola

    el problema que veo es que no usas parametros  yeso esta mal, tu codigo deberia tener la estructura

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {      
    	conn.Open();      
    	string query = "INSERT INTO NAME_TABLE (campo1, campo2, ...) VALUES( @param1, @param2, ...";     
    	SqlCommand cmd = new SqlCommand(query, conn);  
    	
    	if(datos.Rows[i][0].ToString() == "")
    	    cmd.Parameters.AddWithValue("@param1", DbNull.Value);
    	else
    	    cmd.Parameters.AddWithValue("@param1", datos.Rows[i][0].ToString());     
    	
    	cmd.Parameters.AddWithValue("@param2", datos.Rows[i][1].ToString()); 
    	.
    	.
    	
    	cmd.ExecuteNonQuery();   
    }

    define los campos en el INSERT

    usa siempre parametros, asi en caso de un valor este vacio puedes enviar un dbnull

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 4 de junio de 2015 20:02
  • otro tema un datatable lo podrias recorrer usando

    foreach(DataRow row in datos.Rows){

    //usarias row[0] para acceder al valor del campo

    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de junio de 2015 20:03

Todas las respuestas

  • Hola L - J - R deberías de verificar los campos de tu tabla de sql si algunos permiten nulos o no, también deberías depurar tu codigo al momento de ejecutar la inserción durante el bucle verificar también que el DataTable este cargado con datos validos.

    Deberías especificar en tu insert que campos de que tablas son a las que se les va a insertar el dato.

    Insert into MiTable(Columna01,Columna02)
    Values
    (ValorColumna01,ValorColumna02)
    
    Espero haberte ayudado.

    Saludos.

    jueves, 4 de junio de 2015 18:45
  • Muy bien, por lo primero planteado de verificar null en la tabla, prácticamente ya lo hice y “supuestamente” ninguno lo permite, al hacer las búsquedas en sql de los datos que me muestra vacíos realizo las siguientes consultas:

    SELECT *FROM MiTabla WHERE colunma001 IS NULL >>> De la cual no obtengo resultados. Ahora bien que si hago la consulta asi: SELECT *FROM MiTabla WHERE colunma001 = '' >>> Es como logro ver los datos que me deja vacíos.

    Por otra parte con el DataTable no he tenido problemas pero aprovechare tu consejo y lo verificare como así mismo hare la depuración al código de inserción como lo planteas y observare si hay cambios.

    De antemano Gracias

    jueves, 4 de junio de 2015 18:57
  • hola

    el problema que veo es que no usas parametros  yeso esta mal, tu codigo deberia tener la estructura

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {      
    	conn.Open();      
    	string query = "INSERT INTO NAME_TABLE (campo1, campo2, ...) VALUES( @param1, @param2, ...";     
    	SqlCommand cmd = new SqlCommand(query, conn);  
    	
    	if(datos.Rows[i][0].ToString() == "")
    	    cmd.Parameters.AddWithValue("@param1", DbNull.Value);
    	else
    	    cmd.Parameters.AddWithValue("@param1", datos.Rows[i][0].ToString());     
    	
    	cmd.Parameters.AddWithValue("@param2", datos.Rows[i][1].ToString()); 
    	.
    	.
    	
    	cmd.ExecuteNonQuery();   
    }

    define los campos en el INSERT

    usa siempre parametros, asi en caso de un valor este vacio puedes enviar un dbnull

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 4 de junio de 2015 20:02
  • otro tema un datatable lo podrias recorrer usando

    foreach(DataRow row in datos.Rows){

    //usarias row[0] para acceder al valor del campo

    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de junio de 2015 20:03
  • Gracias Leandro, hare las pruebas y comentare...
    jueves, 4 de junio de 2015 20:59