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

本文介绍了一种在使用UniDAC连接SQLServer时遇到的参数类型不匹配导致查询失败的问题及解决方案。通过设置'SpecificOptions.Values['DescribeParams']'为'True',可以使SQLServer正确解析字符串形式的整数参数。

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值