因工作需要,近期将PB9连接MSSQL的数据接口由专用的"MSS Microsoft SQL Server"改为“ODBC”,结果出现了一堆的问题,项目告一段落进行一下问题汇总。
1、SQL子查询中有参数则该SQL不能执行
SELECT * FROM T1 WHERE ID IN(SELECT ID FROM T2 WHERE T2.NAME = :S)
该语句在子查询中使用了一个参数,如果该SQL用于数据窗口中,则无法检索数据,包括EXISTS子查询也是如此
解决方法:
SQLCA.DBMS = "ODBC"
SQLCA.Database = ls_param[10]
SQLCA.ServerName = ls_param[7]
SQLCA.LogId = ls_param[8]
SQLCA.LogPass = ls_param[9]
SQLCA.AutoCommit = False
SQLCA.Lock = "RC"
SQLCA.DBParm = "ConnectString='" + &
"UID=" + ls_param[8] + ";" + &
"PWD=" + ls_param[9] + ";" + &
"Driver={SQL Server Native Client 10.0};" + &
"Server=" + ls_param[7] + ";" + &
"Database=" + ls_param[10] + ";" + &
"APP=MYAPP;" + &
"WSID=" + gs_computer + "'," + &
"CommitOnDisconnect='No',StaticBind=0,DisableBind=1"
在SQLCA.DBPARM的结尾处增加StaticBind=0,DisableBind=1两个选项即可
2、SELECTBLOB一个IMAGE字段时,仅能返回32767字节
这个问题网上搜到的结果全部都是修改PBODB90.INI中的PBMaxBlobSize='32767'和PBMaxTextSize='32767'两项,删除、注释、修改为0等方法,尝试过N次不行后,发现需要把pbodb90.dll文件复制到程序所在文件夹下就可以了,因为是一个老项目,该放入的DLL基本上都已经放入了,所以没考虑过DLL文件的问题,走了一夜的弯路。
3、当字段类型为VARCHAR(MAX)时,数据窗口不能识别数据宽度,检索不到数据
SQL2008的VARCHAR类型宽度范围是1-8000,NVARCHAR类型宽度范围是1-4000,当使用MAX时可以达到2G,但数据窗口不能识别超过8000的字段,所以数据宽度会显示为char(0),并且无数据返回。只能修改表结构,不要使用MAX或使用IMAGE字段存储