2011-02-02 142 views
0

我試圖通過asp.net中的存儲過程更新表。我收到以下錯誤信息:「錯誤的號碼或參數類型調用‘UPDATE_DIRECT_BILL_DETL_SP’」從ASP.NET調用Oracle存儲過程

我似乎無法弄清楚什麼是錯的。我相信我可能不會在我的Cmd.Parameter.Add語句中使用正確的Oracle變量類型。

我明白,可以提供任何幫助!

謝謝。

下面是詳細信息:

我使用Oracle.DataAccess.dll(ODP.NET)

這裏是我的功能:

Public Function UpdateDirectBill(ByVal invDetID As Int32, ByVal appNum As String, _ 
      ByVal lastUpdtByNm As String) As Int32 

    Dim numRecUpdated As Int32 = 0 

    Cmd.CommandType = CommandType.StoredProcedure 
    Cmd.CommandText = "UPDATE_DIRECT_BILL_DETL_SP" 

    'These are the values I'm using for the params 
    invDetID = 1 
    appNum = "3333" 
    lastUpdtByNm = "N015058" 

    Cmd.Parameters.Add("invDetID", OracleDbType.Int32, invDetID, ParameterDirection.Input) 
    Cmd.Parameters.Add("appNum", OracleDbType.Varchar2, appNum,  ParameterDirection.Input) 
    Cmd.Parameters.Add("lastUpdtByNm", OracleDbType.Varchar2, lastUpdtByNm, ParameterDirection.Input) 
    Cmd.Parameters.Add("numRecUpdated", OracleDbType.Int32, numRecUpdated, ParameterDirection.Output) 

    Conn.Open() 
    Cmd.ExecuteNonQuery() 
    Conn.Close() 

    Dim recsUpdated As Int32 = Convert.ToInt32(Me.Cmd.Parameters("numRecUpdated").Value.ToString()) 

    Return recsUpdated 
End Function 

我的存儲過程:

PROCEDURE UPDATE_DIRECT_BILL_DETL_SP 
    (invDetID  IN invoice_detail.invoice_detail_id%TYPE, 
    appNum  IN invoice_detail.application_num%TYPE, 
    lastUpdateNm IN invoice_detail.last_update_by_nm%TYPE, 
    rowCnt  OUT number) 
    IS 
    BEGIN 
    UPDATE INVOICE_DETAIL A 
    SET 
    A.APPLICATION_NUM=appNum, 
    A.LAST_UPDATE_BY_NM = lastUpdateNm, 
    A.LAST_UPDATE_BY_DT=SYSDATE 
    WHERE A.INVOICE_DETAIL_ID=invDetID; 

    rowCnt := SQL%ROWCOUNT; 
    if rowCnt = 1 then 
     COMMIT; 
    ELSE 
     ROLLBACK; 
    END IF; 
    END UPDATE_DIRECT_BILL_DETL_SP; 

我更新的列有以下幾種類型:

invDetID IN invoice_detail.invoice_detail_id%TYPE  of type Number 
    appNum in invoice_detail.application_num%TYPE   of type Varchar2(10 byte) 
    lastUpdateNm IN invoice_detail.last_update_by_nm%TYPE of type Varchar2(50 byte) 
+0

請使用格式化您的代碼`{}`按鈕。 – GolezTrol 2011-02-02 15:29:00

回答

0

你的參數名稱不匹配 'ROWCNT' 和 'numRecUpdated'。你也可以在你的調用中將類型指定爲Int,但存儲的proc將其指定爲映射到Decimal的Number。所以你需要將它指定爲OracleDbType.Decimal而不是int。或者你的存儲過程的參數更改爲整型http://download.oracle.com/docs/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

Cmd.Parameters.Add("rowCnt", OracleDbType.Decimal, numRecUpdated, ParameterDirection.Output)

+0

我做了這些改變,但它仍然無法正常工作。錯誤信息也是一樣的。 – DFlynn 2011-02-03 02:26:19

1

您在存儲過程定義ROWCNT但在你的函數中使用numRecUpdated ..

嘗試

Cmd.Parameters.Add("rowCnt", OracleDbType.Int32, numRecUpdated, _ 
    ParameterDirection.Output) 

而且

Dim recsUpdated As Int32 = _ 
    Convert.ToInt32(Me.Cmd.Parameters("rowCnt").Value.ToString())