日期:2014-05-18  浏览次数:20752 次

请教SqlDbType枚举与.NET Framework SqlTypes 中的类型区别
请问System.Data空间下的SqlDbType枚举和System.Data.SqlTypes空间下的类型枚举,它们之间有何区别?
在什么地方用哪中枚举比较好?

------解决方案--------------------
在使用 SQL Server 数据类型时,在 DataSet 中直接使用 System.Data.SqlTypes 具有多种优点。System.Data.SqlTypes 支持与 SQL Server 本机数据类型相同的语义。 使用 System.Data.SqlTypes 还可以避免在转换十进制或数值数据类型时可能造成的精度损失。 

示例
以下代码创建 DataTable 对象,使用 System.Data.SqlTypes(而不是 CLR 类型)显式定义 DataColumn 数据类型。 代码用 SQL Server 2005 中 AdventureWorks 数据库的 Sales.SalesOrderDetail 表中的数据填充 DataTable。 

C# code
 
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();
  }
}



控制台窗口中显示的输出显示每个列的数据类型以及从 SQL Server 检索的值。

------解决方案--------------------
SqlDbType 枚举指定要用于 SqlParameter 中的字段和属性的 SQL Server 特定的数据类型。