在帮朋友调试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已经支持直接在控件中设置上面属性,不用修改源码了。