在db2数据库上插入失败(在iSeries上)
问题描述:
我们在从我们的VB.NET 2010应用程序中将记录插入到iSeries上的文件/表时遇到问题。在db2数据库上插入失败(在iSeries上)
Windows XP上运行旧的系统没有问题,但我们正试图运行在Windows 7 64位框中的代码(insode VS 2010),和OS400 V5.4
以下是错误信息
ERROR [42000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Token 2014 was not valid. Valid tokens:) ,.
这里是代码的相关部分:
sConStr = "Driver={Client Access ODBC Driver (32-bit)};" & _
"System=" & sAS400Server & ";" & _
"Uid=" & UCase(sAS400UserName) & ";" & _
"Pwd=" & UCase(sAS400UserPwd) & ";" & _
"DBQ=" & UCase$(sAS400Library) & _
IIf(Trim$(sLibraryOther) <> "", "," & sLibraryOther, "") & _
";COMPRESSION=1;ALLOWUNSCHAR=1;TRANSLATE=1;"
conOdbc = New Odbc.OdbcConnection(sConStr)
conOdbc.Open()
我们创造出INSERT语句看起来像这样:通过驱动程序返回
"INSERT INTO kerry.YSEPF(YSESID, YSESAN, YSESCC, YSECCY, YSENEGP, YSEAMA, YSESPOD, YSEVFR, YSESNAR, YSELMBY, YSELMPC, YSECRBY, YSECRPC) VALUES (0002109416, 12345678, PS , GBP, C, 000000000006851, 1140918, 1140831, August 2014 Fuel for Co.van , N , 'profile ','DPVO ','profile ','DPVO ')"
然后我们尝试如下插入:
iSubmitItems += 1
Try
iRetVal = cmdOdbc.ExecuteNonQuery()
iSubmitItemsSuccess += 1
Catch ex As Exception
iSubmitItemsFail += 1
和我们每次收到错误消息。
有什么我们缺少的,如驱动程序(它是一个32位的驱动程序,但安装在不同的地方Win64上?)
编辑 只是想提一提,另外,目标文件包装或压缩,这就是为什么我们不能在FTP固定长度的文本格式的数据,哗哗就是我们的一些其他数据导入
感谢所有帮助
答
你的SQL无效做到:
[..snip...]6851, 1140918, 1140831, August 2014 Fuel for Co.van [...snip...]
^^^^^^^^^^^^^^^^^^^^^^^^^^
字符串必须封装在引号内,例如:
[..snip...]6851, 1140918, 1140831, 'August 2014 Fuel for Co.van' [...snip...]
^---------------------------^---
并给予这个简单/新手的错误,我会说,你也容易受到SQL injection attacks。
答
问题在于你的INSERT语句。你缺少一些值的引号。我不确定你的列的数据类型,所以我将假设它们都是varchar。
此:
"INSERT INTO kerry.YSEPF(YSESID, YSESAN, YSESCC, YSECCY, YSENEGP, YSEAMA, YSESPOD, YSEVFR, YSESNAR, YSELMBY, YSELMPC, YSECRBY, YSECRPC) VALUES (0002109416, 12345678, PS , GBP, C, 000000000006851, 1140918, 1140831, August 2014 Fuel for Co.van , N , 'profile ','DPVO ','profile ','DPVO ')"
应该是这样的:
"INSERT INTO kerry.YSEPF(YSESID, YSESAN, YSESCC, YSECCY, YSENEGP, YSEAMA, YSESPOD, YSEVFR, YSESNAR, YSELMBY, YSELMPC, YSECRBY, YSECRPC) VALUES ('0002109416', '12345678', 'PS' , 'GBP', 'C', '000000000006851', '1140918', '1140831', 'August 2014 Fuel for Co.van', 'N' , 'profile','DPVO','profile','DPVO')"
+0
谢谢我会检查什么时候回到办公室 – 2014-09-24 20:30:27
注意那里的OP的代码不仅仅是'“2014年8月为燃料的Co.van''多个字符串然而,数据库在2014年抛出错误的原因是DB2 for i支持隐式转换。所以,一个单词字符串“PS”,“GBP”隐含地转换为“CHAR”。直到遇到多字符串时,数据库才确定要做什么。最佳做法是明确引用您的字符串。 – Charles 2014-09-24 14:44:03
非常感谢这么多人,我完全错过了我在墙后的iSeries大喊大叫的15分钟内一遍又一遍地尖叫**它是SQL该死的,接受它** – 2014-09-24 20:29:38
同意SQL注入的事情,但它是一个封闭的网络......据我所知,我们的插入到iSeries消息队列中,然后用控制语言编写的另一个程序是否将记录加载到文件中。 – 2014-09-24 20:33:33