我正在使用Dapper从StoredProcedure检索SQL Server中的数据而我收到错误
Specified cast is not valid.
和细节:
Error parsing column 4 (SubTotal=0.00 - Decimal)
在SQL Server端,列SubTotal
为decimal(18, 2) NULLABLE
,在.NET端为decimal?
。检索的数据是0.00
。
我检查了这个答案:Dapper,decimal to double? Error parsing column X
根据答案,我更换了
il.Emit(OpCodes.Ldtoken, unboxType);
与
il.Emit(OpCodes.Ldtoken, Nullable.GetUnderlyingType(unboxType) ?? unboxType);
在第2360行,仍然得到同样的错误。
任何人对此都有任何想法?感谢。
更新:
我尝试使列不可为空。还尝试将列更改为float
(在SQL Server上)和double
(在.NET端)。这些都没有奏效,我得到了同样的错误。然后我将列更改为int
,现在代码工作正常。但是,我正在使用货币值,并希望使用浮点数。将进一步调查......
我正在执行如下的存储过程
var transaction = this.db.Query<PaymentTransactions>("usp_PaymentTransactionsGetSingleIfPaid", new { registrationId }, commandType: CommandType.StoredProcedure);
返回信息的存储过程的相关部分如下所示。
SELECT * FROM PaymentTransactions WHERE RegistrationId = @registrationId AND TransactionStatus = 'SUCCESS';
更新2 :
Dapper工作正常。也许我的开发环境出了问题。所有这一切都是VS重启。
答案 0 :(得分:2)
似乎这不是Dapper特有的,因为我刚刚验证了下面的代码片段按预期工作。
尝试明确枚举列名(而不是select *),以便过程准确返回应映射到PaymentTransactions
的内容。可能还有另一个错误名称的非十进制列?
这是在.Net45上使用Dapper v1.13:
步骤:
create procedure dbo.Test
as
select [SubTotal] = cast('0.01' as decimal(18,2))
union all
select null;
Linqpad:
void Main()
{
using (IDbConnection cnn = GetOpenConnection())
{
var users = cnn.Query<Sale>("yak.dbo.test", new { }, commandType: CommandType.StoredProcedure);
users.Dump();
}
}
public static readonly string connectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=True";
public static IDbConnection GetOpenConnection()
{
var connection = new SqlConnection(connectionString);
connection.Open();
return connection;
}
public class Sale
{
public decimal? SubTotal;
}
返回:
答案 1 :(得分:1)
这个问题已经解决了......