2014-09-24 106 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