Liny_@NotePad

沉迷ACG中

十分诡异的字符串传参被截断..

YOYO posted @ 2010年12月24日 19:44 in 【C#】 with tags OleDb ODBC DB2 , 4435 阅读

仍是上次的调用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长字符串是可以的),再到存储过程里查询……

Head_small
YOYO 说:
2010年12月25日 17:53

我用C#调用DB2存储过程遇到的很诡异的问题


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter