Вызов хранимой процедуры Oracle из ASP.NET - PullRequest
0 голосов
/ 02 февраля 2011

Я пытаюсь обновить таблицу с помощью хранимой процедуры из asp.net. Я получаю следующее сообщение об ошибке: «неверный номер или типы аргументов при вызове UPDATE_DIRECT_BILL_DETL_SP»

Я просто не могу понять, что не так. Я полагаю, что я не могу использовать правильные типы переменных Oracle в моих операторах Cmd.Parameter.Add.

Я ценю любую помощь, которая может быть оказана!

Спасибо.

Вот подробности:

Я использую 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)

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

вы определяете rowCnt в sproc, но используете numRecUpdated в вашей функции ..

Попробуйте

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

И

Dim recsUpdated As Int32 = _
    Convert.ToInt32(Me.Cmd.Parameters("rowCnt").Value.ToString())
0 голосов
/ 02 февраля 2011

Ваши имена параметров не совпадают с «rowCnt» и «numRecUpdated».Кроме того, вы указываете тип как Int в вашем вызове, но сохраненный процесс определяет его как число, которое отображается в десятичную.Поэтому вам нужно будет указать его как тип OracleDbType.Decimal, а не как int.Или измените свой сохраненный параметр proc на INTEGER http://download.oracle.com/docs/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...