[英]grid column representing value saved in sql server in tinyint and enum in c# not showing selected item in conbobox
[英]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
来存储这些值。 这是不必要的,你试图做的事情(即TINYINT
和byte
)是完全有效的,我做了很多次。
假设您在该表中没有数百万行数据并且不断对其进行命中,请运行以下命令:
ALTER TABLE [security] ALTER COLUMN [securityLevel] TINYINT NOT NULL;
(我假定此列当前NOT NULL
,并在这种情况下,如果你离开关NOT NULL
的ALTER 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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.