在数据库管理和应用程序开发中,我们必须注意空间和内存要求。我一直被教导使用占用空间最少的数据类型。
在我的场景中,我在表中有一列存储值{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 :(得分:5)
是的,如果您只存储0 - 4,那么选择TINYINT
作为数据类型是正确的。
是的,TINYINT
等同于.Net中的byte
。您可以在此处查看映射列表:
http://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx
不,您在创建表时实际上并未使用TINYINT
,否则您将不会收到此错误。有关源数据类型为INT
的错误消息非常具体。
不,请勿使用INT
来存储这些值。这是不必要的,你正在尝试做的事情(即TINYINT
和byte
)是完全有效的,我已多次完成。
假设您在该表中没有数百万行数据并且不断对其进行点击,请运行以下命令:
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)