unidac 访问sql server 字符查询参数失效问题及解决办法

  在帮朋友调试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 的同学,如果遇见类似这样的问题,可以参考一下。

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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已经支持直接在控件中设置上面属性,不用修改源码了。

posted @ 2019-07-01 23:27  业容天  阅读(59)  评论(0)    收藏  举报