繁体   English   中英

SQL Server中的tinyint到C#中的byte

[英]tinyint in SQL Server to byte in C#

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

在我的场景中,我在表中存储了一个存储值{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);

是的,如果只存储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 NULLALTER TABLE语句时,它会改变现场TINYINT NULL ,如果该字段不是目前NOT NULL ,那么就把那部分留下来)

我编写了以下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。

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

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

它将许多值类型转换为字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM