SqlTypes y DataSet (ADO.NET)
Actualización: November 2007
ADO.NET 2.0 incorporó compatibilidad mejorada de tipos con el DataSet mediante el espacio de nombres System.Data.SqlTypes. Los tipos de System.Data.SqlTypes se han diseñado para proporcionar tipos de datos con la misma semántica y precisión que los de una base de datos SQL Server. Cada tipo de datos de System.Data.SqlType tiene un tipo de datos equivalente en SQL Server, con la misma representación de datos subyacente.
El uso de System.Data.SqlTypes directamente en un DataSet otorga varias ventajas cuando se trabaja con tipos de datos de SQL Server. System.Data.SqlTypes admite la misma semántica que los tipos de datos nativos de SQL Server. La especificación de uno de los System.Data.SqlTypes en la definición de un objeto DataColumn elimina la pérdida de precisión que se produce al convertir tipos de datos decimales o numéricos en uno de los tipos de datos de Common Language Runtime (CLR).
Ejemplo
En el siguiente ejemplo se crea un objeto DataTable, que define explícitamente los tipos de datos DataColumn utilizando System.Data.SqlTypes en lugar de tipos CLR. El código llena la DataTable con los datos de la tabla Sales.SalesOrderDetail de la base de datos AdventureWorks de SQL Server. El resultado que aparece en la ventana de la consola muestra el tipo de datos de cada columna y los valores recuperados de SQL Server.
Private Sub GetSqlTypesAW(ByVal connectionString As String)
' Create a DataTable and specify the
' SqlType for each column.
Dim table As New DataTable()
Dim icolumnolumn As DataColumn = _
table.Columns.Add("SalesOrderID", GetType(SqlInt32))
Dim priceColumn As DataColumn = _
table.Columns.Add("UnitPrice", GetType(SqlMoney))
Dim totalColumn As DataColumn = _
table.Columns.Add("LineTotal", GetType(SqlDecimal))
Dim columnModifiedDate As DataColumn = _
table.Columns.Add("ModifiedDate", GetType(SqlDateTime))
' Open a connection to SQL Server and fill the DataTable
' with data from the Sales.SalesOrderDetail table
' in the AdventureWorks sample database.
Using connection As New SqlConnection(connectionString)
Dim queryString As String = _
"SELECT TOP 5 SalesOrderID, UnitPrice, LineTotal, ModifiedDate " _
& "FROM Sales.SalesOrderDetail WHERE LineTotal < @LineTotal"
' Create the SqlCommand.
Dim command As SqlCommand = New SqlCommand(queryString, connection)
' Create the SqlParameter and assign a value.
Dim parameter As SqlParameter = _
New SqlParameter("@LineTotal", SqlDbType.Decimal)
parameter.Value = 1.5
command.Parameters.Add(parameter)
' Open the connection and load the data.
connection.Open()
Dim reader As SqlDataReader = _
command.ExecuteReader(CommandBehavior.CloseConnection)
table.Load(reader)
' Close the SqlDataReader
reader.Close()
End Using
' Display the SqlType of each column.
Dim column As DataColumn
Console.WriteLine("Data Types:")
For Each column In table.Columns
Console.WriteLine(" {0} -- {1}", _
column.ColumnName, column.DataType.UnderlyingSystemType)
Next column
' Display the value for each row.
Dim row As DataRow
Console.WriteLine("Values:")
For Each row In table.Rows
Console.Write(" {0}, ", row("SalesOrderID"))
Console.Write(" {0}, ", row("UnitPrice"))
Console.Write(" {0}, ", row("LineTotal"))
Console.Write(" {0} ", row("ModifiedDate"))
Console.WriteLine()
Next row
End Sub
static private void GetSqlTypesAW(string connectionString)
{
// Create a DataTable and specify a SqlType
// for each column.
DataTable table = new DataTable();
DataColumn icolumnolumn =
table.Columns.Add("SalesOrderID", typeof(SqlInt32));
DataColumn priceColumn =
table.Columns.Add("UnitPrice", typeof(SqlMoney));
DataColumn totalColumn =
table.Columns.Add("LineTotal", typeof(SqlDecimal));
DataColumn columnModifiedDate =
table.Columns.Add("ModifiedDate", typeof(SqlDateTime));
// Open a connection to SQL Server and fill the DataTable
// with data from the Sales.SalesOrderDetail table
// in the AdventureWorks sample database.
using (SqlConnection connection = new SqlConnection(connectionString))
{
string queryString =
"SELECT TOP 5 SalesOrderID, UnitPrice, LineTotal, ModifiedDate "
+ "FROM Sales.SalesOrderDetail WHERE LineTotal < @LineTotal";
// Create the SqlCommand.
SqlCommand command = new SqlCommand(queryString, connection);
// Create the SqlParameter and assign a value.
SqlParameter parameter =
new SqlParameter("@LineTotal", SqlDbType.Decimal);
parameter.Value = 1.5;
command.Parameters.Add(parameter);
// Open the connection and load the data.
connection.Open();
SqlDataReader reader =
command.ExecuteReader(CommandBehavior.CloseConnection);
table.Load(reader);
// Close the SqlDataReader.
reader.Close();
}
// Display the SqlType of each column.
Console.WriteLine("Data Types:");
foreach (DataColumn column in table.Columns)
{
Console.WriteLine(" {0} -- {1}",
column.ColumnName, column.DataType.UnderlyingSystemType);
}
// Display the value for each row.
Console.WriteLine("Values:");
foreach (DataRow row in table.Rows)
{
Console.Write(" {0}, ", row["SalesOrderID"]);
Console.Write(" {0}, ", row["UnitPrice"]);
Console.Write(" {0}, ", row["LineTotal"]);
Console.Write(" {0} ", row["ModifiedDate"]);
Console.WriteLine();
}
}
Vea también
Conceptos
Asignar tipos de datos de SQL Server (ADO.NET)
Configurar parámetros y tipos de datos de parámetros (ADO.NET)