簡體   English   中英

為什么我會收到 ORA-01722(無效號碼)?

[英]Why am I getting an ORA-01722 (invalid number)?

我一直在使用參數化查詢將值插入到 Oracle 表中,如下所示:

var q = "insert into MyTable(Field1, Field2...) values(:Field1, :Field2...)";
var cmd = new OracleCommand(q, conn); // conn is a pre-existing connection
cmd.Parameters.Add("Field1", field1Val); 
cmd.Parameters.Add("Field2", field2Val);
// etc...
cmd.ExecuteNonQuery();

這一直工作正常,但突然停止工作,我收到 Oracle 錯誤 ORA-01722(無效數字)。 我檢查了參數,所有數字都是毫無疑問的有效數字。 我什至用虛擬值替換了任何空值,但仍然出現錯誤。 我在直接 sql(使用 OraDeveloper Studio)中嘗試了相同的查詢,即使使用相同的參數,它也能工作。

我如何追蹤這個?

編輯:根據評論中的請求,這是創建表語句:

CREATE TABLE ALPHA.VISITFINDINGS (
  ID NUMBER(12),
  VISITID NUMBER(12) NOT NULL,
  DESCRIPTION VARCHAR2(100),
  CUSTOMIMAGE CLOB,
  VISUALFINDINGSSECTIONMAPID NUMBER(12),
  FINDINGSID NUMBER(12),
  CONSTRAINT FK_VISITFINDINGS_AREA FOREIGN KEY (VISUALFINDINGSSECTIONMAPID)
    REFERENCES ALPHA.VISUALFINDINGSSECTIONMAP(VISUALFINDINGSSECTIONMAPID),
  CONSTRAINT FK_VISITFINDINGS_FINDINGS FOREIGN KEY (FINDINGSID)
    REFERENCES ALPHA.FINDINGS(FINDINGSID),
  CONSTRAINT FK_VISITFINDINGS_VISIT FOREIGN KEY (VISITID)
    REFERENCES ALPHA.VISITS(VISITID),
  CONSTRAINT PK_VISITFINDINGS PRIMARY KEY (ID))
TABLESPACE USERS
STORAGE (
  INITIAL 64K
  MAXEXTENTS UNLIMITED
)
LOGGING;

我已經給出了答案,但我認為這里值得一提的是我的問題的根源是什么,以防其他人在尋找自己問題的答案時找到了這個項目。

問題在於,Oracle 參數化查詢的 C# 實現包含一個嚴重且具有潛在危險的錯誤 - 一個真正的“公共領域的坑”:

參數的名稱無關緊要; 它們必須按照它們在查詢中出現的順序添加。

在此處查看更多信息

當您說您檢查了參數時,您的意思是 SqlCommand 類上的Parameters集合嗎? 您可能會在 SqlParameter 頁面上與此注釋發生沖突

使用 SqlParameter 構造函數的此重載指定整數參數值時要小心。 由於此重載采用 Object 類型的值,因此當該值為零時,您必須將整數值轉換為 Object 類型,如以下 C# 示例所示。 復制

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));

如果不執行此轉換,編譯器會假定您正在嘗試調用 SqlParameter (string, SqlDbType) 構造函數重載。

我建議你使用類似的東西

cmd.Parameters.Add(
   new SqlParameter("Field1", SqlDbType.Int32) { Value = field1Val });

而是顯式設置類型。

command.BindByName = true;

請看這個解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM