¿Convertir o convertir al recuperar datos de una base de datos?
Pregunta
Al acceder a un objeto en una DataTable recuperada de una base de datos, ¿existen razones para no convertir el objeto en el tipo deseado o existen razones para utilizar convertir? Sé que la regla se establece cuando sabemos con qué tipo de datos estamos trabajando, y la conversión cuando intentamos cambiar el tipo de datos a algo que no es. Suponiendo que sabemos qué tipo de datos se almacena en una columna, la conversión parece apropiada, pero ¿hay algún tipo de problema de base de datos que signifique que no podemos confiar en esto?
Solución
Siempre emitiría, por las razones que indiques. Los errores que tengo en cuenta son:
-
Obviamente, necesitas poder manejar DBNulls (por ejemplo, probando con Convert.IsDBNull)
-
En el caso de ExecuteScalar, creo que debe comprobar si hay null y DBNull.
-
Las funciones de los servidores SQL @@ IDENTITY y SCOPE_IDENTITY devuelven numérico (decimal) incluso para las columnas que se declaran como INT. En este caso, puede emitir dos veces el valor " (int) (decimal) " o manejarlo en el código T-SQL, por ejemplo: .
INSERTAR EN MyTable ... SELECCIONE AutoIdColumn DE MyTable DONDE AutoIdColumn = SCOPE_IDENTITY ()
o
INSERT INTO MyTable ...
SELECT CAST(SCOPE_IDENTITY() AS INT)
Otros consejos
Tanto CAST
como CONVERT
se utilizan para convertir explícitamente una expresión de un tipo de datos a otro. Sin embargo, con CONVERT
también puede especificar el estilo de estilo.
Sintaxis para CAST:
CAST ( expression AS data_type [ (length ) ])
Sintaxis para CONVERTIR:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Al volver a salir de RDBMS, debe permitir que el controlador de la base de datos maneje la clasificación entre el tipo nativo y el solicitado.
CAST está aprobado por los estándares de SQL y funciona en el mayor número de plataformas RDBMS.
CONVERT está disponible en menos plataformas.
Si tiene consideraciones multiplataforma, CONVERTIR se debe usar solo para casos especiales, como el formato personalizado que no se puede realizar con CAST.