找回密码
 立即注册

QQ登录

只需一步,快速开始

gery
金牌服务用户   /  发表于:2024-12-4 09:32  /   查看:197  /  回复:11
请问一下,我现在针对自研数据库开发ODBC驱动,使用AR的ODBC数据源进行连接,当我添加查询参数进行连接验证的,发现调用函数为SQLBindParameter,SQLExecDirect,这个时候并没有直接将SQL中的? 处理,这个是需要自行处理吗?此时我点击连接验证的时候? 并没有实际入参,这个情形执行SQL就会出现问题。如果不清楚具体调用函数,是否可以提供当点击验证的时调用的:System.Data.Odbc哪些方法?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

11 个回复

倒序浏览
Eden.SunWyn认证
超级版主   /  发表于:2024-12-4 10:44:06
沙发
您好,点击验证的时候,是连接数据库,获取sql执行后的字段列表:


相当于是校验是否可以联通数据库,并获取字段信息:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
gery
金牌服务用户   /  发表于:2024-12-4 11:01:56
板凳
Eden.Sun 发表于 2024-12-4 10:44
您好,点击验证的时候,是连接数据库,获取sql执行后的字段列表:

这里正常是通的,但是如果我使用了查询参数,我定义的SQL是属于预编译SQL,是带有?的,这个时候去执行SQL获取字段信息数据库是无法识别改SQL,因为带有? ,理论上来说需要参数?替换为参数后才可正常执行, 我通过自定义ODBC输出日志可以看到是去调用了SQLBindParams函数接口,可是没有传输值,导致我无法进行下一步处理?的处理
回复 使用道具 举报
Eden.SunWyn认证
超级版主   /  发表于:2024-12-4 11:48:52
地板
gery 发表于 2024-12-4 11:01
这里正常是通的,但是如果我使用了查询参数,我定义的SQL是属于预编译SQL,是带有?的,这个时候去执行SQ ...


您这个大概率,就是SQL语句问题了。应该是参数没有设置进去


您参考下这个:
https://help.grapecity.com.cn/pa ... tion?pageId=5972465


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
gery
金牌服务用户   /  发表于:2024-12-4 17:26:10
5#
当我使用这个预定义的形式,去预览报表,通过日志观察发现不会调用SQL执行语句,直接就是调用SQLMoreResults函数,如果我不添加这个预定义形式,直接就是可执行SQL时,就会去调用SQL执行语句,所以我想要知道这块调用函数的逻辑,以便去针对性调整我的ODBC自定义驱动函数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Felix.LiWyn认证
超级版主   /  发表于:2024-12-5 11:12:24
6#
您好,已经了解到您的需求,我这边也会先去和开发同步问一下。
不过我也搜了一下,
SQLBindParameter好像是 ODBC的直接执行语句。
SQLBindParameter和SQLExecDirect好像都是返回的成功或者失败。
所以我估计校验字段的,应该还是给了参数一个空置或者其他的,不一定返回数据,但是起码字段会返回回来。顺便我也好奇咱们现在加了参数是有报错还是什么的。

其次其实还有一种稳定的方法。就是先不带参数,把可执行的sql执行一遍,这个时候会返回所有字段。然后不用添加参数,直接在查询里面用 :
where time > {@time}

如果查询里面用到 {@参数} ,这个查询语句就不会校验,而是直接确认通过,但是预览时,这个参数还是会被赋值并且以sql执行的形式给ODBC
回复 使用道具 举报
gery
金牌服务用户   /  发表于:2024-12-5 13:43:34
7#
这个方式我也进行了尝试,但是预览时,似乎就不会去调用SQL执行的函数接口,通过我的SQL函数入口日志来看,直接就是调用SQLMoreResults这个函数,导致ODBC并没有执行真正的SQL语句,页面没有数据可渲染,出现如下报错

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Felix.LiWyn认证
超级版主   /  发表于:2024-12-5 15:27:36
8#
在设计时,就是把参数做了这两个:
DbCommand.CreateDbParameter
DbCommand.DbParameterCollction
然后预览的时候,把参数赋值,然后进行CommandText
所以您提到的走SQLMoreResults,估计是在有参数时,或者提交多个sql时,ODBC自己内部走了什么策略,这个我们确实不知道
回复 使用道具 举报
gery
金牌服务用户   /  发表于:2024-12-5 16:46:20
9#
我目前只有一个sql, 如果我直接在查询语句带where条件预览也是正常的,按照你的说法,带查询数据预览的时候就会把参数赋值,那效果应该等同于直接查询语句带where条件,这块赋值过后的处理逻辑和不带参数直接执行的逻辑是一样的吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Felix.LiWyn认证
超级版主   /  发表于:2024-12-5 17:54:55
10#
您好,目前我们估计了一下,问题应该在这里。

首先在sql执行里面如果没有 {} 也就是我们的表达式,就会直接给ODBC,然后ODBC会有执行的那个方法。
如果带了参数,我们也给ODBC定义参数了。所以ODBC会先执行 SQLMoreResults ,这个作用是判断你的sql对不对。如果不对,就会返回并抛出错误,我估计就是您上面截图的报错。
所以这个问题目前排查是您的sql错了。而sql错的原因应该是 {} 翻译的没有单引号。


也就是假如您的 sql表达式如下:
  1. select * from test where col = {@参数}
复制代码
预览输入候,sql翻译得到的结果是:
  1. select * from test where col = 参数
复制代码
但是这种其实是不对的,sql正确的这个应该是 = 字符串类型,也就是:
  1. select * from test where col = '参数'
复制代码
所以sql表达式应该要这么写:
  1. select * from test where col = '{@参数}'
复制代码
同理,如果需要加双引号,或者多值的。也需要处理。如果是多值的参数,表达式还需要加 join:
  1. {join(@参数,",")}
复制代码
这个得到的结果就是 :  A,B,C

最好的是这样,您先把这个表达式不再数据集的输入框写,而是报表里面用一个文本框,把这个sql的写进文本框里,然后最后表达式得到的结果预览就可以看到了,您把预览看到的结果在数据库执行,如果可以正常执行,那就证明这个sql的表达式写的是正确的,就可以写在数据集的里面了,应该也就可以查询到数据了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部