十分诡异的字符串传参被截断..
仍是上次的调用DB2存储过程时遇到的问题,我需要传入一串包括引号的字符串(VARCHAR(1000)),
例如
AND StationID IN ('8501','3001','5504','5301','6303','2803','5302','3108','2802','8503','5503','5105','2710','5505','5502','3005','3002','3004','3003','8505','5501','3102','8504','5303','2904')
但是在调试中出现了“{"[DB2/NT] SQL0010N 以 \"'5302\" 起始的字符串常量没有字符串结束定界符。 SQLSTATE=42603"}”这样的问题,找来找去并没有发现引号什么的有错(这中间也是自动生成的 没理由前面对后面错),
后来就自己写参数调试,发现<128字符时就正常,大于时就报错。仔细一看,报错的内容一样,但是起始字符从“ A”开始了。
将参数的SIZE设定为1000,或者在后面加空格还是;、数字或者字母,结果都没有用,它依然截取了正确语句的后128个字符(如果有;的话,会算在正常语句的一部分,因此会往后移一位,但多个分号仍算作一个。)
经测试发现通过OLEDB调用存储过程只能传小于128的字符串(不论CHAR还是VARCHAR),超过128的留下前(length%128)个字符。
师傅说可能是早期的问题,只支持到127个……
后面尝试用直接传Text的CALL命令,依然不行,反而报“[DB2/NT] SQL0444N 例程 "*XX"(特定名 "SQL101224111300780")是用库或路径 "...XX" 中的代码以及不能访问的函数 "SP_XXX" 来实现的。原因码:"4"。 SQLSTATE=42724”的错误。
最后换了ODBC来做,看似正常了,代码如下:
OdbcConnection con =new OdbcConnection(_mCommonClass.DB2ConnectStringOdbc); con.Open(); OdbcCommand cmd = con.CreateCommand(); cmd.CommandText = "{ call SP_XXX(?,?,?)}"; OdbcParameter p1 = cmd.CreateParameter(); p1.Value = dutyDate.ToString("yyyy-MM-dd"); p1.OdbcType = OdbcType.VarChar; cmd.Parameters.Add(p1); OdbcParameter p2 = cmd.CreateParameter(); p2.Value = dutyDate.AddDays(1).ToString("yyyy-MM-dd"); p2.OdbcType = OdbcType.VarChar; cmd.Parameters.Add(p2); OdbcParameter p3 = cmd.CreateParameter(); p3.Value = " AND StationID IN (" + v_strStationIDs + ")"; p3.OdbcType = OdbcType.VarChar; cmd.Parameters.Add(p3); cmd.ExecuteNonQuery();
可是真的很烦 —________— 发现长度似乎只能到922,如果超过922小于943就会出现个奇怪的问题(可能是存储过程编写的问题),然后超过943的话就会被截断……
一时无解,将参数分段拆分成小于900的字符串来做了。
但是由于是执行Text,很容易超时而终断,最后还是建了一个表做中转(INSERT长字符串是可以的),再到存储过程里查询……
2010年12月25日 00:14
这是虾米
2010年12月25日 17:53
我用C#调用DB2存储过程遇到的很诡异的问题