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

 

 

posted on 2014-02-05 23:01  xalion  阅读(2006)  评论(0编辑  收藏  举报