La consulta parametrizada no puede insertar valor con c# y SQL Server

Tengo una consulta parametrizada y funcionaba bien, pero cuando elimino la base de datos y la vuelvo a crear, con los mismos valores y todo, arroja una excepción que dice que no puede insertar el valor NULL con el valor sexo, pero todos los valores son asignado, aquí está el código:

    try{
      var cmdPersona_Log = new SqlCommand();
      cmdPersona_Log.Parameters.Clear();
      cmdPersona_Log.Connection = mySqlConnection;
      cmdPersona_Log.CommandType = CommandType.Text;
      cmdPersona_Log.CommandText = @"INSERT INTO [Tomin].[TominRH].[Persona_Log] "
       + "([Id_Action],[Id_User],[Id_Date],[Id_Entidad],[Nombre],[Paterno],[Materno],[Sexo],[Id_Nacionalidad])"
       + " Values (1, 'Admin', @fecha, @id_entidad, @nombre, @paterno, @materno, @sexo, 52)";
      cmdPersona_Log.Parameters.AddWithValue("@fecha", DateTime.Now);
      cmdPersona_Log.Parameters.AddWithValue("@id_entidad", dbRow["CUENTA"].ToString().Trim());
      cmdPersona_Log.Parameters.AddWithValue("@nombre", nombre ?? string.Empty);
      cmdPersona_Log.Parameters.AddWithValue("@paterno", paterno ?? string.Empty);
      cmdPersona_Log.Parameters.AddWithValue("@materno", materno ?? string.Empty);
      cmdPersona_Log.Parameters.AddWithValue("@sexo", 1);
      cmdPersona_Log.ExecuteNonQuery();
   }
   catch(Exception e) 
   {
      MessageBox.Show(dbRow["CUENTA"] + " Persona_log  " + e.ToString());
   } 

Revisé la base de datos y no parece ser el problema, ¿alguna sugerencia?

preguntado el 31 de agosto de 12 a las 22:08

¿De qué tipo son nombre, paterno y materno? -

cuerda, pero el problema es con el sexo, se me olvidó decir que... -

intenta usar true en lugar de 1 con AddWithValue -

Exactamente el mismo problema, el tipo de dato es poco booleano, no se si es lo mismo, pero creo que es algo con los valores parametrizados... -

No hay Boolean escribir SQL. La bit en SQL se traduce a bool en .NET y viceversa. -

3 Respuestas

Es posible que se encuentre con un caso en el que AddWithValue no está infiriendo su tipo de parámetro de bit adecuadamente. Usar true/false en lugar de 1/0:

cmdPersona_Log.Parameters.AddWithValue("@sexo", true);

Respondido 31 ago 12, 23:08

Sí, que no puedo insertar valor NULL - poz2k4444

@ poz2k4444 Y si se deshace del parámetro y cambia el sql para usar 1 en lugar del parámetro sexo, ¿qué sucede? - LarsTech

La misma excepción, de hecho, cambié a consulta parametrizada porque tenía lo que dices: poz2k4444

No sé por qué, pero ya no hay problema, dejé el proyecto unos días y de repente todo funciona bien :S, de todos modos, gracias por la ayuda... - poz2k4444

+1 habiendo hablado con el autor original, esta recomendación, como ambos esperábamos, solucionó el problema. ver comentarios adjuntos a mi respuesta. Sospecho (aunque no está probado) que los cambios de código no se construyeron entre ejecuciones. - Yoztástico

Asegúrese de que todos los campos de la tabla que se supone que no son nulos se enumeran en la cláusula INSERT

Respondido 31 ago 12, 22:08

Comprobado... La tabla tiene 10 parámetros y 9 no pueden ser NULL y esos son los parámetros que envío... - poz2k4444

@ poz2k4444 ¿Puede dar la expresión sql que crea la tabla? - O. Charyshkin

No sé por qué, pero ya no hay problema, dejé el proyecto unos días y de repente todo funciona bien :S, de todos modos, gracias por la ayuda... - poz2k4444

¿Has probado a usar este formulario? cmd.Parameters.Add("@SomeID", SqlDbType.Int, 4).Value = ¿Dónde puede ser explícito sobre SqlDbType?

Respondido 31 ago 12, 23:08

No sé por qué, pero ya no hay problema, dejé el proyecto unos días y de repente todo funciona bien :S, de todos modos, gracias por la ayuda... - poz2k4444

He tenido este problema en el pasado en el que el proyecto realmente no ejecutaba los cambios reconstruidos realizados en su código, por lo que volvía a ejecutar el código roto incluso una vez que lo había solucionado. En algún momento, esto puede conducir a romper el código aún más con ediciones que aparentemente no conducen a ningún cambio en el comportamiento. Solo por interés, ¿su código de trabajo es exactamente el mismo que su publicación original? Creo que algunos de nosotros pensamos cmdPersona_Log.Parameters.AddWithValue("@sexo", 1); no funcionaría. - Yoztástico

MI código funciona con cmdPersona_Log.Parameters.AddWithValue("@sexo", true); ese fue el último cambio que hice y luego dejé el proyecto por unos días... ¿Cómo podría saber cuándo se está ejecutando el código con los cambios que hice? - poz2k4444

Reconstruir Todo. Además, si sospecha que sus últimos cambios no se están utilizando, rómpalos deliberadamente lanzando una excepción en el código que debe ejecutarse. Si no se lanza ninguna excepción, los cambios de código no se utilizan. Tanto @user:1081897 como yo sospechábamos que necesitabas cambiar cmdPersona_Log.Parameters.AddWithValue("@sexo", 1); a cmdPersona_Log.Parameters.AddWithValue("@sexo", true); y he comentado como tal. De su respuesta parece que no funciona. Creo que vale la pena editar y votar a D Stanley para ayudar a los futuros espectadores de esta pregunta. - Yoztástico

cambié cmdPersona_Log.Parameters.AddWithValue("@sexo", 1); a cmdPersona_Log.Parameters.AddWithValue("@sexo", true); Este es el último cambio que hice, y cuando lanza una excepción, siempre lanza la excepción mencionada, y de repente no lo hace, no sé por qué, pero el código ya funciona perfecto, de todos modos agradezco su ayuda. , ¡muchas gracias! - poz2k4444

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.