VB.NET - 通过ODBC连接插入/删除

时间:2015-10-06 16:27:03

标签: vb.net odbc ibm-midrange

我通过ODBC连接连接到AS / 400。当我尝试从文件中插入和删除时,我得到了古怪的错误。首先,我在构建查询激活时找到的格式如下:

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

所以,基于此,我写了这个:

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

奇怪的是,它抛出了一个关于不喜欢DELETE的错误,但是如果我完全删除了库,我就把它弄掉了:

"DELETE FROM AV90909JWB WHERE MBR_NUM = " & mbr_num

我猜它只是不喜欢#符号并且没有使用库,因为我的默认库与我在这里使用的相同。但现在我在INSERT中收到错误消息:

  

错误[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 个答案:

答案 0 :(得分:2)

标准ANSI SQL在标识符中转义无效字符或转义与保留关键字冲突的标识符的方法是将其放在双引号中:

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

显然,您在where子句中插入或使用的值之一超出了为该列定义的范围。例如。如果某列已定义为NUMERIC(2),则无法插入100

此外,我强烈建议您使用命令参数而不是字符串连接:请参阅https://stackoverflow.com/a/2092851/880990