dan*_*dan 4 c# sql-server ado.net
假设我有这个 sql 语句,并且我已经执行了 sql 命令来获取数据读取器:
"select 1 union select 2"
//.....
var rdr = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
现在我想读取第一行第一列中的值:
var myInt = (int)rdr.GetValue(0); //great this works
var myLong = (long)rdr.GetValue(0); //throws cast exception, even though you can cast int to long
Run Code Online (Sandbox Code Playgroud)
因此,您在 C# 中转换的类型似乎需要与 SQL 类型完全匹配。IE如果sql类型是bigint,则只能强制转换为long。如果sql类型是int,则只能强制转换为int。没有混搭...
我只是想得到一些可以工作的东西,不管 c# 要求的整数类型和 sql 返回的类型如何,只要理论上你可以将一个转换为另一个。因此,如果 SQL Server 给我一个浮点类型,并且我要求一个 int,我想要通过该转换获得的截断 int。
我的目标是使此功能与泛型一起工作,因此当泛型参数与 sql server 中的数据类型不完全匹配时,我可以让此函数工作:
List<T> GetFirstColumn<T>(string sql) where T : struct
{
//get connection, execute reader
// loop:
// lst.Add( (T) rdr.GetValue(0));
}
Run Code Online (Sandbox Code Playgroud)
我希望这适用于这两个语句:
var sql1 = "Select 1"; //sql int
var sql2 = "Select cast(1 as bigint)"; //sql equivalent of a long
var lst1 = GetFirstColumn<int>(sql1);
var lst2 = GetFirstColumn<int>(sql2);
Run Code Online (Sandbox Code Playgroud)
有没有人有一种相对无痛的方法来做到这一点?
就像 Fredrik 所说,SqlDataReader 的值被装箱。您可以将装箱值转换为 with int,Convert.ToInt32例如:
int i = Convert.ToInt32(read[0]);
Run Code Online (Sandbox Code Playgroud)
即使 SQL Server 返回 bigint 或小数,这也会尝试进行转换。