VB.NET - Inserting/Deleting 通过 ODBC 连接

VB.NET - Inserting/Deleting via ODBC Connection

我正在通过 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 中出现一个错误:

ERROR [22003][Micro Focus][RUMBA Data Access][S1023934]Numeric value out of range. 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

有人看到我遗漏的东西或对如何找到我的问题有任何想法吗?

谢谢!

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

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

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


此外,我强烈建议您使用命令参数而不是字符串连接:请参阅