c# – Dapper参数不起作用
我正在尝试使用Dapper orm以下简单查询:
var sqlString = new StringBuilder(); sqlString.Append("select a.acct AccountNumber,"); sqlString.Append(" b.first_name FirstName,"); sqlString.Append(" b.last_name LastName,"); sqlString.Append(" a.rr RrNumber,"); sqlString.Append(" c.addr1 AddressLine1,"); sqlString.Append(" c.addr2 AddressLine2,"); sqlString.Append(" c.addr3 AddressLine3,"); sqlString.Append(" c.addr4 AddressLine4,"); sqlString.Append(" c.addr5 AddressLine5,"); sqlString.Append(" c.addr6 AddressLine6,"); sqlString.Append(" c.addr7 AddressLine7,"); sqlString.Append(" c.addr8 AddressLine8 "); sqlString.Append("from (pub.mfclac as a left join pub.mfcl as b on a.client=b.client) "); sqlString.Append("left join pub.mfclad as c on a.client=c.client "); sqlString.Append("where a.acct = '@ZYX'"); var connection = new OdbcConnection(_connectionString); var result = connection.Query(sqlString.ToString(),new { ZYX = accountNumber }); 但是,当我使用已知存在的accountNumber执行此操作时,dapper不返回任何内容.所以我尝试删除引号以验证参数实际上是否被帐号替换,但是从服务器返回的错误表示“@ZYX”周围的语法错误.这意味着dapper没有用它给定的值替换参数.任何想法为什么会这样?从有限的文档中,这应该“正常工作”. EDIT1 无法让这个工作.使用string.format将参数作为解决方法插入. 解决方法
这里有两个问题;首先(尽管你在你的问题中注意到这一点),在SQL规则下,a.acct =’@ ZYX’没有使用任何参数 – 它看起来与恰好包含@符号的文字字符串相匹配.对于SQL-Server(请参阅下面的注释),正确的用法是a.acct = @ZYX.
然而!由于您使用的是OdbcConnection,因此命名参数不适用.如果您实际连接到SQL-Server之类的东西,我强烈建议使用纯ADO.NET客户端,它们具有比ODBC更好的功能和性能.但是,如果ODBC是您唯一的选择:它不使用命名参数.直到几天前,这将代表一个主要问题,但是根据Passing query parameters in Dapper using OleDb,代码(但还不是NuGet包)现在支持ODBC.如果您从源构建(或等待下一个版本),您应该能够使用: ... where a.acct = ? 在你的命令中,和: var result = connection.Query(sqlString.ToString(),new { anythingYouLike = accountNumber }); 请注意,ODBC不使用名称(anythingYouLike),因此可以…您喜欢的任何内容.在更复杂的场景中,例如: .Execute(sql,new { id = 123,name = "abc",when = DateTime.Now }); dapper使用一些关于如何实现匿名类型的知识来理解值的原始顺序,以便它们以正确的顺序(id,name,when)添加到命令中. 最后一点观察:
Dapper永远不会用给定的值替换参数.这根本不是参数化sql的正确方法:参数通常是单独发送的,确保: >没有SQL注入风险 请注意,一些ADO.NET / ODBC提供程序理论上可以选择通过替换在内部实现 – 但这与dapper是分开的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Flex 相关
- c# – 属性上的XElement默认命名空间提供了意外行为
- c# – 对象集合的Object Initializer
- ajax+js+json+dom+php+mysql实现一个聊天室
- Flash Builder4.7 更新Air SDK及FlashPlayer
- 非Ajax下用JavaScript获取文件大小(兼容IE及FireFox)
- React Native:target has has hash string’android-X’no
- Dojo关于dijit/form/CheckBox序列化的疑问?请大侠指教
- ruby-on-rails – 自定义rails_admin控制器操作的Rspec测试
- 正则表达式 – 在两个不同模式之间提取字符串的一部分