2011-02-25 15 views
9

Tengo un archivo de texto que leo en una tabla de datos y luego realizo una inserción masiva en una tabla de SQL Server. Es bastante rápido y funciona de maravilla cuando todos los valores importados se tratan como cadenas (fechas, cadenas, entradas, etc. se importan en campos de cadenas).Configuración de un elemento de DataRow para anular

Ahora que tengo el concepto resuelto, volveré a asignar los tipos de datos reales en la base de datos y mi código. La base de datos tiene los tipos correctos asignados a los campos. Estoy trabajando en el código ahora.

Tengo un problema con las fechas. Como mencioné, todo es una cadena y se convierte al tipo correcto. En el siguiente código, quiero probar si el valor de la cadena que representa una fecha es nulo o en blanco. Si no es nulo, entonces use el valor existente. De lo contrario, establézcalo en nulo.

row[i] = !string.IsNullOrWhiteSpace(data[i]) ? data[i] : DBNull.Value; 

He intentado utilizar null pero obtendrá un error que me dice que use DBNull lugar. Cuando uso DBNull, recibo un mensaje que me dice que no hay una conversión implícita entre cadena y System.DBNull.

Las columnas de la tabla de datos se han especificado los tipos de datos (en este caso, DataType = Type.GetType("System.DateTime")) y establecer AllowDBNull = true para esta columna

¿Cómo puedo manejar esto?

Gracias!

Respuesta

10

El problema es debido a la operación que está utilizando. Como DBNull.Value no es una cadena, no puede usar el operador condicional. Esto es porque, desde el conditional operator docs:

O bien el tipo de first_expression y second_expression debe ser la misma, o una conversión implícita debe existir de un tipo a otro. Haciendo esto

Probar:

if (!string.IsNullOrWhiteSpace(data[i])) 
    row[i] = data[i]; 
else 
    row[i] = DBNull.Value; 

Esto evita los requisitos de conversión para ambos lados sean iguales. Alternativamente, puede convertir ambos a un System.Object explícitamente, y aún usar el operador condicional.

6

, es necesario especificar los dos para objetos de este modo:

row[i] = !string.IsNullOrWhiteSpace(data[i]) ? (object)data[i] : (object)DBNull.Value; 
+5

Sólo tiene que echar a uno de ellos a 'object'. – SLaks

1

estoy trabajando en Asp.Net MVC 5 de aplicación de C# Web y lo hizo así y funciona bien

rw[6] = (qry.PODate != null) ? qry.PODate : (object)DBNull.Value; 
Cuestiones relacionadas