SQL Server中的tinyint到C#中的byte

时间:2014-10-13 22:31:29

标签: c# sql sql-server

在数据库管理和应用程序开发中,我们必须注意空间和内存要求。我一直被教导使用占用空间最少的数据类型。

在我的场景中,我在表中有一列存储值{0,1,2,3,4}(SQL Server 2012)。为此,我选择使用tinyint数据类型。这些值从数据库中提取到C#应用程序中。目前,我无法将此tinyint数据类型转换为字节。当我尝试时,我得到一个错误"不能隐式地将int转换为byte"。如果我将应用程序中的数据类型更改为整数,我可以将它拉得很好。与字符串相同。

出于性能目的,在我通常使用byte的整个应用程序中使用整数是否可以?如果不是,如何将整数转换为字节?

这是我使用的代码,它给出了一个错误:

string strSQL = "SELECT securityLevel FROM security WHERE employeeID=@empID;";

using (SqlConnection dbConn = new SqlConnection(connParam))
{
  dbConn.Open();

  byte level = 0;

  using (SqlCommand dbCommand = new SqlCommand(strSQL, dbConn))
  {

    dbCommand.CommandType = System.Data.CommandType.Text;
    dbCommand.Parameters.AddWithValue("@empID", "12345");

    using (SqlDataReader dbReader = dbCommand.ExecuteReader())
    {
      while (dbReader.Read())
      {
        level = dbReader.GetByte(0);
      }
    }

  }

  Console.WriteLine(level);
  Console.ReadLine();

}    

我也尝试过:

level = (byte)dbReader.GetValue(0);

3 个答案:

答案 0 :(得分:5)

是的,如果您只存储0 - 4,那么选择TINYINT作为数据类型是正确的。

是的,TINYINT等同于.Net中的byte。您可以在此处查看映射列表: http://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx

不,您在创建表时实际上并未使用TINYINT,否则您将不会收到此错误。有关源数据类型为INT的错误消息非常具体。

不,请勿使用INT来存储这些值。这是不必要的,你正在尝试做的事情(即TINYINTbyte)是完全有效的,我已多次完成。

假设您在该表中没有数百万行数据并且不断对其进行点击,请运行以下命令:

ALTER TABLE [security] ALTER COLUMN [securityLevel] TINYINT NOT NULL;

(我假设该列目前是NOT NULL,在这种情况下,如果您不在NOT NULL语句中的ALTER TABLE,它会将字段更改为{{1如果该字段当前不是TINYINT NULL,那么只需关闭该部分

答案 1 :(得分:3)

我编写了以下LinqPad(针对SqlServer express)来验证您是否可以使用.NET和SqlServer将tinyint作为一个字节读取:

var cb = new SqlConnectionStringBuilder { DataSource = @".\Sqlexpress", InitialCatalog = "Medallion_OData_Tests_CustomersContext251990930203", IntegratedSecurity = true };
using (var c = new SqlConnection(cb.ConnectionString))
{
    c.Open();   

    var cmd = c.CreateCommand();
    cmd.CommandText = "SELECT CAST(1 AS tinyint)";
    var reader = cmd.ExecuteReader();
    reader.Read();
    reader.GetByte(0).Dump();
}

这告诉我数据库中的实际securityLevel列不是TINYINT类型。要验证,为什么不临时修改您的选择查询以包含CAST到TINYINT,如我的示例中所示?如果这样做,那将确认表模式是问题。

检查实际表模式的其他方法包括查询sys.columns或在SqlServer Management Studio中突出显示表的名称并按下ALT + F1。

答案 2 :(得分:0)

我认为最安全的方法是使用Convert.ToByte Method

level = Convert.ToByte(dbReader.GetValue(0));

它从许多值类型转换为byte。