假设我有这个 SQL 语句,并且已经执行了一个 SQL 命令来获取一个数据读取器:
看起来在C#中,你需要精确匹配SQL类型进行转换。例如,如果SQL类型是bigint,则只能转换为long。如果SQL类型是int,则只能转换为int。不允许混合使用。
我想要的是无论C#请求和SQL返回的整数类型如何,只要理论上可以将一个类型转换为另一个类型,就能得到可行的结果。所以,如果SQL Server给我一个浮点类型,而我要求一个整型,我想要从执行这个转换得到的截断整数。
我的目标是使这个函数适用于泛型,这样当泛型参数与SQL Server中的数据类型不完全匹配时,该函数也能够工作。
有没有相对简单的方法来完成这个任务?
"select 1 union select 2"
//.....
var rdr = cmd.ExecuteReader();
现在我想要读取第一行第一列的值:
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
看起来在C#中,你需要精确匹配SQL类型进行转换。例如,如果SQL类型是bigint,则只能转换为long。如果SQL类型是int,则只能转换为int。不允许混合使用。
我想要的是无论C#请求和SQL返回的整数类型如何,只要理论上可以将一个类型转换为另一个类型,就能得到可行的结果。所以,如果SQL Server给我一个浮点类型,而我要求一个整型,我想要从执行这个转换得到的截断整数。
我的目标是使这个函数适用于泛型,这样当泛型参数与SQL Server中的数据类型不完全匹配时,该函数也能够工作。
List<T> GetFirstColumn<T>(string sql) where T : struct
{
//get connection, execute reader
// loop:
// lst.Add( (T) rdr.GetValue(0));
}
我希望这适用于两个语句:
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);
有没有相对简单的方法来完成这个任务?