2010-10-12 21 views
6

Hola Estoy tratando de insertar null en una columna de base de datos dependiendo de un valor de datakeys gridview (si es "" insertar nulo en la base de datos) Sin embargo, estoy obteniendo un espacio '' dentro de la columna de la base de datos.¿Cómo insertar null en la base de datos?

string sbcId = gvTest.DataKeys[gr.RowIndex]["myColumn"].ToString(); 
insgnp.Parameters.Add(new OleDbParameter("EMPID", (sbcId==""?DBNull.Value.ToString():sbcId))); 
+0

¿Vio lo real T-SQL se está ejecutando? (es decir, con SQL Profiler). El ToString probablemente ingrese el ''. Pero tu dices que hay un espacio '', que no puedo ver cómo podría suceder. Más probablemente sbcId! = "", Es == "". – RPM1984

+0

Gracias RPM1984. Estoy usando DB2. Parece que el uso de ToString() se tradujo de alguna manera en '' dentro de la columna de la base de datos. –

Respuesta

17

Tienes que volver a escribir el código:

if(string.IsNullOrEmpty(sbcId)) 
    Parameters.Add(new OleDbParameter("EMPID", DBNull.Value)); 
else 
    Parameters.Add(new OleDbParameter("EMPID", sbcId)); 

El problema con el ternario si la declaración de que usted tiene es que su returntype debe siempre será el mismo, por lo que no se puede utilizar (cuerda y DBNull.Value no son compatibles)

+0

Gracias klausbyskov. Eso funcionó maravillosamente! =). ¿Tiene alguna pista de por qué la columna en la base de datos tiene valor '' incluso si la cadena tiene ''. –

1

Trate a continuación mediante la eliminación de ToString() después de DBNull.Value

string sbcId = gvTest.DataKeys[gr.RowIndex]["myColumn"].ToString(); 
insgnp.Parameters.Add(new OleDbParameter("EMPID", (sbcId==""?DBNull.Value:sbcId))); 
+0

Eso no funcionará con el operador ternario pero solucioné el problema. Gracias Pranay. –

8

Uso DBNull.Value, no DBNull.Value.ToString. (Con otros tipos de colección de parámetros en .NET simplemente usando null también funcionaría, pero no estoy 100% seguro acerca de OleDbParameter).

En cuanto al operador terciario. No echar a la cadena, pero echar la cadena de objetar:

sbcId=="" ? DBNull.Value : (object)sbcId 
+0

Gracias Jon. Tienes razón, el único problema es el lanzamiento en cadena. –

+1

Ah. Se agregó algo en el casting. –

+0

Gracias, eso también fue útil. I +1 usted como respuesta ya está marcado. –

3

es necesario utilizar DBNull.Value no DBNull.Value.ToString()

DBNull.Value.ToString() es ''

Este programa da

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("'{0}'", DBNull.Value.ToString()); 
     } 
    } 
} 

alt text

+0

Gracias Preet aunque el problema está resuelto, sin embargo, estoy desconcertado ¿por qué la columna de la base de datos tenía '' aunque la cadena era ''? –

+0

¿cuál es el ddl para la tabla? ¿Tiene un gatillo? –

+0

no es una instrucción de inserción simple con parámetros. –

0

Si inserta un valor distinto cadena en la base de datos de acceso que pueda escribir la consulta de inserción de esta manera

Insertar en valores tableName (column1, column2) (NULL, NULL);

pero que desea insertar un valor nulo en texto corto o un campo de texto largo en el acceso que pueda escribir la consulta de inserción de esta manera

Insertar en nombreTabla (columna 1, columna2) valores ('', '');

-2

su cadena como que

string value = ""; 

ahora añadir siguiente línea

if (value == ""){ 

    value = "NULL"; 
    } 

Inserta ahora en dB y comprobar que tiene valor nulo su lógico

0

SQLString.Null debe hacer el trabajo igual bien :)

0

Prefiero usar una método de extensión para manejar en lugar de múltiples sentencias if. Esto le permite contabilizar valores de cadena nulos o vacíos. También permite que sea reutilizable.

public static object GetDBNullOrValue<T>(this T val) 
    { 
     bool isDbNull = true; 
     Type t = typeof(T); 

     if (Nullable.GetUnderlyingType(t) != null) 
      isDbNull = EqualityComparer<T>.Default.Equals(default(T), val); 

     else if (t.IsValueType) 
      isDbNull = false; 

     else if (t == typeof(string) && val != null) 
     { 
      string temp = val as String; 
      isDbNull = (temp == String.Empty); 
     } 

     else 
      isDbNull = (val == null); 

     return isDbNull ? DBNull.Value : (object)val; 
    } 

Posteriormente, se podría utilizar

 Parameters.Add(new OleDbParameter("EMPID", sbcId.GetDBNullOrValue())); 
Cuestiones relacionadas