2015-10-06 72 views
1

我通過ODBC連接連接到AS/400。當我嘗試從文件中插入和刪除時,出現了古怪的錯誤。首先,我發現構造查詢stirng格式是這樣的:VB.NET - 通過ODBC連接插入/刪除

"DELETE FROM <library>.<filename> WHERE <field> = <value>" 

因此,基於這一點,我寫了這個:

"DELETE FROM RM#AVLIB.AV90909JWB WHERE MBR_NUM = " & mbr_num 

它扔約不順心刪除錯誤,奇怪的是,但我得到了它的消失,如果我完全去除庫:

"DELETE FROM AV90909JWB WHERE MBR_NUM = " & mbr_num 

我猜它只是不喜歡的#符號,沒有圖書館,因爲我的默認librar工作y和我在這裏使用的是一樣的。但現在我得到我的INSERT一個錯誤,說:

ERROR [22003] [微聚焦] [RUMBA數據存取] [S1023934]數值超出範圍。 SQLCODE = -420

經過我傳遞的所有值後,我沒有看到任何比字段長度更長的值,所以我不確定這是從哪裏來的。

這裏是我的代碼,因爲它位於現在:

delQry = "DELETE FROM AV90301JWB WHERE MBR_CD = '" & MBR_CD & "' AND LOC_CD = '" & LOC_CD & "' AND PRP_ITM = '" & PRP_ITM & "'" 
pushQry = "INSERT INTO AV90301JWB (" & _ 
    "MBR_NUM, " & _ 
    "LOC_CD, " & _ 
    "AVBLD_CLMT, " & _ 
    "ADDRESS1, " & _ 
    "ADDRESS2, " & _ 
    "CITY, " & _ 
    "STATE, " & _ 
    "ZIPCODE, " & _ 
    "AVBLD_DOS, " & _ 
    "CNST_QLTY, " & _ 
    "SEISMIC, " & _ 
    "WIND, " & _ 
    "AVBLD_DSC, " & _ 
    "AVBLD_DSC1, " & _ 
    "AVBLD_DSC2, " & _ 
    "AVBLD_DSC3, " & _ 
    "MISC_ADJ, " & _ 
    "SEC_ID, " & _ 
    "AVCOS_RC, " & _ 
    "YR_BUILT, " & _ 
    "NBR_STORY, " & _ 
    "SQR_FT, " & _ 
    "SUBCLASS, " & _ 
    "OCC_CD1, " & _ 
    "OCC_DSC1, " & _ 
    "OCC_PCT1, " & _ 
    "STORY_HT1, " & _ 
    "OCC_CD2, " & _ 
    "OCC_DSC2, " & _ 
    "OCC_PCT2, " & _ 
    "STORY_HT2, " & _ 
    "OCC_CD3, " & _ 
    "OCC_DSC3, " & _ 
    "OCC_PCT3, " & _ 
    "STORY_HT3, " & _ 
    "OCC_CD4, " & _ 
    "OCC_DSC4, " & _ 
    "OCC_PCT4, " & _ 
    "STORY_HT4, " & _ 
    "OCC_CD5, " & _ 
    "OCC_DSC5, " & _ 
    "OCC_PCT5, " & _ 
    "STORY_HT5, " & _ 
    "HEAT_SYS, " & _ 
    "COOL_SYS, " & _ 
    "PWALL_EXT, " & _ 
    "ROOF_MAT, " & _ 
    "SPRINKLER, " & _ 
    "MANL_FIRE, " & _ 
    "AUTO_FIRE, " & _ 
    "CNST_PCT1, " & _ 
    "CNST_PCT2, " & _ 
    "CNST_PCT3, " & _ 
    "CNST_PCT4, " & _ 
    "CNST_PCT5) " & _ 
    "VALUES (" & _ 
    "'" & MBR_NUM & "', " & _ 
    "'" & LOC_CD & "', " & _ 
    "'" & AVBLD_CLMT & "', " & _ 
    "'" & ADDRESS1 & "', " & _ 
    "'" & ADDRESS2 & "', " & _ 
    "'" & CITY & "', " & _ 
    "'" & STATE & "', " & _ 
    "'" & ZIPCODE & "', " & _ 
    "'" & AVBLD_DOS.ToShortDateString() & "', " & _ 
    "'" & CNST_QLTY & "', " & _ 
    "'" & SEISMIC & "', " & _ 
    "'" & WIND & "', " & _ 
    "'" & AVBLD_DSC & "', " & _ 
    "'" & AVBLD_DSC1 & "', " & _ 
    "'" & AVBLD_DSC2 & "', " & _ 
    "'" & AVBLD_DSC3 & "', " & _ 
    "'" & MISC_ADJ & "', " & _ 
    "'" & SEC_ID & "', " & _ 
    "" & Math.Round(AVCOS_RC, 2, MidpointRounding.AwayFromZero) & ", " & _ 
    "'" & YR_BUILT & "', " & _ 
    "'" & NBR_STORY & "', " & _ 
    "'" & SQR_FT & "', " & _ 
    "'" & SUBCLASS & "', " & _ 
    "'" & OCC_CD1 & "', " & _ 
    "'" & OCC_DSC1 & "', " & _ 
    "'" & OCC_PCT1 & "', " & _ 
    "'" & STORY_HT1 & "', " & _ 
    "'" & OCC_CD2 & "', " & _ 
    "'" & OCC_DSC2 & "', " & _ 
    "'" & OCC_PCT2 & "', " & _ 
    "'" & STORY_HT2 & "', " & _ 
    "'" & OCC_CD3 & "', " & _ 
    "'" & OCC_DSC3 & "', " & _ 
    "'" & OCC_PCT3 & "', " & _ 
    "'" & STORY_HT3 & "', " & _ 
    "'" & OCC_CD4 & "', " & _ 
    "'" & OCC_DSC4 & "', " & _ 
    "'" & OCC_PCT4 & "', " & _ 
    "'" & STORY_HT4 & "', " & _ 
    "'" & OCC_CD5 & "', " & _ 
    "'" & OCC_DSC5 & "', " & _ 
    "'" & OCC_PCT5 & "', " & _ 
    "'" & STORY_HT5 & "', " & _ 
    "'" & HEAT_SYS & "', " & _ 
    "'" & COOL_SYS & "', " & _ 
    "'" & PWALL_EXT & "', " & _ 
    "'" & ROOF_MAT & "', " & _ 
    "'" & SPRINKLER & "', " & _ 
    "'" & MANL_FIRE & "', " & _ 
    "'" & AUTO_FIRE & "', " & _ 
    "'" & CNST_PCT1 & "', " & _ 
    "'" & CNST_PCT2 & "', " & _ 
    "'" & CNST_PCT3 & "', " & _ 
    "'" & CNST_PCT4 & "', " & _ 
    "'" & CNST_PCT5 & "')" 

Dim connectionString As String = ConfigurationManager.AppSettings("iSeriesConnString") 
Dim insCommand As New OdbcCommand(pushQry) 
Dim delCommand As New OdbcCommand(delQry) 
Dim da As New OdbcDataAdapter 

Using myConn As New OdbcConnection(connectionString) 
    insCommand.Connection = myConn 
    delCommand.Connection = myConn 
    myConn.Open() 
    da.InsertCommand = insCommand 
    da.DeleteCommand = delCommand 
    da.DeleteCommand.ExecuteNonQuery() 
    da.InsertCommand.ExecuteNonQuery() 
End Using 

有誰看到我丟失的東西還是有關於如何找到我的問題的任何想法?

謝謝!

+1

避免建立動態SQL語句。這是SQL注入攻擊發生的方式。改用參數化查詢。此外,請務必用分號分隔您的個人陳述。 –

+0

你是什麼意思「確保用分號分隔你的個人陳述」? – TheIronCheek

+0

我誤解了,並認爲你在同一個查詢語句中同時執行了刪除和插入語句。我知道,如果您不在相同查詢字符串中的多個語句之間放置語句末尾分號,AS/400會發出抱怨。 –

回答

2

在標識符逸出無效字符或逃脫其衝突使用一個保留關鍵字是把它放在雙引號標識符的標準ANSI SQL方式:

DELETE FROM "RM#AVLIB".AV90909JWB WHERE ... 

顯然的值之一您正在插入或者您在where子句中使用的內容超出了爲該列定義的範圍。例如。如果列已定義爲NUMERIC(2),則不能插入100


此外,我強烈建議你,而不是使用字符串連接命令參數:見https://stackoverflow.com/a/2092851/880990

+0

感謝您的幫助。我正在尋找類似你的例子的東西 - 在'NUMERIC(2)'中插入'100' - 但實際上我在'NUMERIC(2)'中插入了一個空白的'String',所以我發現它有些麻煩......你的答案幫助我找到解決方案,所以我將它標記爲這樣。 – TheIronCheek

+1

如果對列有'NOT NULL'約束,則必須插入值**;手動或列可以有一個默認值定義'DEFAULT 123'。'CREATE TABLE mytable(mycolumn NUMERIC(5)DEFAULT -1 NOT NULL,...)' –

+1

當然,你不能插入一個字符串(空或不是)到一個數字列;但是,如果列中沒有NOT-NULL約束或定義了DEFAULT值,則可以將NULL插入到列中。 –