xalion 2014-02-05 574浏览量
在帮朋友调试kbmmw 服务器的时候,发现用uindac 访问sql server作为后台时,碰见一个问题。
具体如下:
cx.Close; cx.sql.add('select * from T where id=:id'); // 这里id 是整数字段 cx.Prepare; cx.ParamByName('id').AsString:='1475'; cx.Open;
这一句运行时不出现错误,但是返回结果为空,很是奇怪。
cx.Close; cx.sql.add('select * from T where id=:id'); // 这里id 是整数字段 cx.Prepare; cx.ParamByName('id').Asinteger:=1475; cx.Open;
当改成这样的化,就可以返回正常结果。
经过查询devart 的论坛,发现这是sql server 本身的问题。
要使第一段代码正常工作,需要增加一行代码。
cx.SpecificOptions.Values['DescribeParams'] := 'True'; cx.Close; cx.sql.add('select * from T where id=:id'); // 这里id 是整数字段 cx.Prepare; cx.ParamByName('id').AsString:='1475'; cx.Open;
这样sql server 就可以正常解析参数了。
在kbmmw 中使用unidac 访问sql server 的同学,如果遇见类似这样的问题,可以参考一下。
q := TUniQuery.Create(nil); q.Options.FieldsOrigin := True; SetSpecificOptions(q.SpecificOptions); q.Connection := c.Database; q.SQL.Assign(CookedQuery); q.SpecificOptions.Values['DescribeParams'] := 'True'; // 这一句对sql server 很重要 q.Prepare; UniDACCopyInputParamsValueAndType(Params,q.Params, Connection.ConnectionPool.MetaData.UnicodeOptions); q.Open; // After the query is open, also remember to get the resulting params from it. Params.Assign(q.Params); Result:=q;
2017.3.8
最新kbmmw已经支持直接在控件中设置上面属性,不用修改源码了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
分享数据库前沿,解构实战干货,推动数据库技术变革