// http://blog.csdn.net/chengg0769 转载保留此行。转载勿修改原文或内加链接。
QQ群请加: 6539042(powerbuilder11&SQL)
本篇文字要解决的问题:
一问:powerbuilder10在用存储器调用时,retrive时出现错误:造型说明无效的字符值
二问:SQLSTATE = 22005
[Microsoft][ODBC SQL Server Driver]对于造型说明无效的字符值
三问:pb中如何调用sql server 2000的存储过程
-------------------------------------------------------------------------------------------------------
很多网友认为无法解决问题,或者讨论众多,但未见解决之。我通过实践,在一年前即解决。当然,这个问题颇费了我一些时间。(据说原因是ODBC的不兼容问题,因为旧版本的直连方式没问题)
1. 编写procedure,如pr_query
2. 新增grid的datawindow,选择procedure方式,选择存储器:pr_query,选择手工设置字段。下一步,完成。
3. 在界面的dw_1的事件sqlpreview中编写如下代码:
/*----------------------------------------------------------------------------*/
string sql
sql="exec pr_query " + right(sqlsyntax,len(sqlsyntax) -30)
dw_1.setsqlpreview(sql)
return 0
/*-------------------------------------------------------------------------------------------------*/
注意:我发觉在此替换掉原来的语句的开头部分,即可成功执行,并运行很好。原因不想深究。
想到这个方式是我在分析器里调试跟踪来的语句,一点问题都没有,即将跟踪的语句原样的用setsqlpreview设置,结果可以执行,隧如此修改,果然奏效。
30是把数据框用:edit source打开,看到的类似以下语句:
procedure="1 execute dbo.pr_query;1 @controls1 = :controls1,@controls2 = :controls2........
30是指这个字符串从开头到第一个参数的长度。当然你完全可以抓"@"符号的index来自动计算:
sql="exec pr_query " + right(sqlsyntax,len(sqlsyntax) -(pos(sqlsyntax,'@') - 1))
//后记。我的程序运行很好。问题解决了。
//20070918补充,ODBC不允许带参数,以上方法是将此过程建立在查询时,即datawindow已经获得参数的实际值后再直接调用执行过程。即可完美解决。如果datawindow无法调用procedure的话,那是非常痛苦的。我曾为此问题苦恼了几天几夜,在此呈现这个简单方法。望大家能用上。
//2013 在PB的dbprofile中,新建一个ODBC连接,然后在sytax标签页,有个strip parameter name选项打勾也可以,直译为剥离参数,有时间我跟踪一下sql语句,原理应该是传送sql时不带参数,与我方法是否相同待确认。