2011-02-02 228 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())