我使用“ASEOLEDB.1”提供程序在Sybase ASE中调用存储过程。
SP采用一个名为@PricePreference的varchar(255)参数,该参数在SP中默认为NULL。
我正在使用Dapper的QueryMultiple方法,并传入DynamicParameters对象:
var parameters = new DynamicParameters();
parameters.Add("@PricePreference", "Foo");
var reader = dbConnection.QueryMultiple("myProcName", parameters, commandType: CommandType.StoredProcedure);
此代码的行为就像我根本没有传递参数一样。看来这是因为Dapper的DynamicParameters类上的AddParameters()方法在我的参数名称上调用了Clean(),它删除了'@'前缀(或其他DBMS的等价物' - 参见MSDN上的'使用参数占位符'{{3 }})。
如果没有'@'前缀,Sybase似乎无法匹配参数。
相反,当我注释掉对Clean()的调用时,我从查询中得到了正确的结果。
删除'@'前缀背后的理由是什么?
答案 0 :(得分:1)
简而言之:它简化了大量代码并检查我们是否只需要担心一个场景。在所有其他RDBMS中:无论有没有它都可以正常工作 - 当然,当您通过对象属性指定参数名称时,它们是:没有 - 所以这是显而易见的方法。如果这不适用于特定的RDBMS,我相信我们可以研究修复它的方法。大概只是信任DynamicParameters而不是清理它们。