2014-09-24 89 views
1

我们在从我们的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固定长度的文本格式的数据,哗哗就是我们的一些其他数据导入

感谢所有帮助

回答

6

你的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

+4

注意那里的OP的代码不仅仅是'“2014年8月为燃料的Co.van''多个字符串然而,数据库在2014年抛出错误的原因是DB2 for i支持隐式转换。所以,一个单词字符串“PS”,“GBP”隐含地转换为“CHAR”。直到遇到多字符串时,数据库才确定要做什么。最佳做法是明确引用您的字符串。 – Charles 2014-09-24 14:44:03

+0

非常感谢这么多人,我完全错过了我在墙后的iSeries大喊大叫的15分钟内一遍又一遍地尖叫**它是SQL该死的,接受它** – 2014-09-24 20:29:38

+0

同意SQL注入的事情,但它是一个封闭的网络......据我所知,我们的插入到iSeries消息队列中,然后用控制语言编写的另一个程序是否将记录加载到文件中。 – 2014-09-24 20:33:33

3

问题在于你的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