Поставщик Oracle .NET: Почему мой сохраненный процесс не работает? - PullRequest
0 голосов
/ 23 марта 2010

Я использую поставщик Oracle .NET и вызываю хранимую процедуру в пакете. Я получаю сообщение «Неправильный номер или тип звонка». Я убедился, что порядок добавления параметров находится в правильном порядке, и я тщательно изучил OracleDbType, хотя подозреваю, что именно в этом моя проблема. Вот код позади:

// настройка начального содержимого, соединения и команды строка msg = string.Empty; string oraConnString = ConfigurationManager.ConnectionStrings ["OracleServer"]. ConnectionString; OracleConnection oraConn = новый OracleConnection (oraConnString); OracleCommand oraCmd = новый OracleCommand ("PK_MOVEMENT.INSERT_REC", oraConn); oraCmd.CommandType = CommandType.StoredProcedure;

    try
    {
        //iterate the array
        //grab 3 items at a time and do db insert, continue until all items are gone. Will always be divisible by 3.
        for (int i = 0; i < theData.Length; i += 3)
        {
            //3 items hardcoded for now
            string millCenter = "0010260510";
            string movementType = "RECEIPT";
            string feedCode = null;
            string userID = "GRIMMETTM";
            string inventoryType = "INGREDIENT"; //set to FINISHED for feed stuff
            string movementDate = theData[i + 0];
            string ingCode = System.Text.RegularExpressions.Regex.Match(theData[i + 1], @"^([0-9]*)").ToString();
            string pounds = theData[i + 2].Replace(",", "");

            //setup parameters
            OracleParameter p1 = new OracleParameter("A_MILL_CENTER", OracleDbType.NVarchar2, 10);
            p1.Direction = ParameterDirection.Input;
            p1.Value = millCenter;
            oraCmd.Parameters.Add(p1);

            OracleParameter p2 = new OracleParameter("A_INGREDIENT_CODE", OracleDbType.NVarchar2, 50);
            p2.Direction = ParameterDirection.Input;
            p2.Value = ingCode;
            oraCmd.Parameters.Add(p2);

            OracleParameter p3 = new OracleParameter("A_FEED_CODE", OracleDbType.NVarchar2, 30);
            p3.Direction = ParameterDirection.Input;
            p3.Value = feedCode;
            oraCmd.Parameters.Add(p3);

            OracleParameter p4 = new OracleParameter("A_MOVEMENT_TYPE", OracleDbType.NVarchar2, 10);
            p4.Direction = ParameterDirection.Input;
            p4.Value = movementType;
            oraCmd.Parameters.Add(p4);

            OracleParameter p5 = new OracleParameter("A_MOVEMENT_DATE", OracleDbType.NVarchar2, 10);
            p5.Direction = ParameterDirection.Input;
            p5.Value = movementDate;
            oraCmd.Parameters.Add(p5);

            OracleParameter p6 = new OracleParameter("A_MOVEMENT_QTY", OracleDbType.Int64, 12);
            p6.Direction = ParameterDirection.Input;
            p6.Value = pounds;
            oraCmd.Parameters.Add(p6);

            OracleParameter p7 = new OracleParameter("INVENTORY_TYPE", OracleDbType.NVarchar2, 10);
            p7.Direction = ParameterDirection.Input;
            p7.Value = inventoryType;
            oraCmd.Parameters.Add(p7);

            OracleParameter p8 = new OracleParameter("A_CREATE_USERID", OracleDbType.NVarchar2, 20);
            p8.Direction = ParameterDirection.Input;
            p8.Value = userID;
            oraCmd.Parameters.Add(p8);

            OracleParameter p9 = new OracleParameter("A_RETURN_VALUE", OracleDbType.Int32, 10);
            p9.Direction = ParameterDirection.Output;
            oraCmd.Parameters.Add(p9);

            //open and execute
            oraConn.Open();
            oraCmd.ExecuteNonQuery();
            oraConn.Close();

        }
    }
    catch (OracleException oraEx)
    {
        msg = "An error has occured in the database: " + oraEx.ToString();
    }
    catch (Exception ex)
    {
        msg = "An error has occured: " + ex.ToString();
    }
    finally
    {
        //close connection
        oraConn.Close();

    }

    return msg;

Ответы [ 3 ]

1 голос
/ 23 марта 2010

Я думаю, что ваша проблема может быть связана с вашим 9-м параметром. Если это возвращаемое значение из хранимой процедуры, тогда тип возвращаемого значения должен быть установлен на ParameterDirection.ReturnValue.

Надеюсь, это поможет.

1 голос
/ 23 марта 2010

Может ли быть так, что любое из значений параметров, которые вы назначаете, на самом деле null? Я не слишком уверен в случае с Oracle, но для SQL Server назначение null для параметра приведет к тому, что этот параметр не будет отправлен при выполнении процедуры (что приведет к жалобе процедуры на количество параметров). Вместо null вы должны передать DBNull.Value:

p1.Value = millCenter ?? DBNull.Value;
0 голосов
/ 30 марта 2010

Я в основном наступил здесь на собственные пальцы ... Я устанавливал параметры в цикле, а затем не очищал их после каждой итерации.Теперь я в порядке.

...