Как вернуть rowid из ExecuteOracleNonQuery в C # - PullRequest
2 голосов
/ 10 июля 2009

Я использую ExecuteOracleNonQuery в C #, чтобы ВСТАВИТЬ запись в мою базу данных Oracle с помощью хранимой процедуры, но не могу получить ROWID для возврата.

In C # ...

using (OracleConnection oc= 
    new OracleConnection(AppConfiguration.ConnectionString))
{
    OracleCommand myCommand = new OracleCommand("PKG_TEST.INSERT", oc);
    myCommand.CommandType = CommandType.StoredProcedure;
    myCommand.Parameters.AddWithValue("p_Id", allAssets.Id);
    myCommand.Parameters.AddWithValue("p_Description", allAssets.Description);
    OracleString rowId;
    try
    {
        myConnection.Open();
        result = myCommand.ExecuteOracleNonQuery(out rowId);
        allAssets.RowId = rowId.ToString();
    }
    catch(System.Exception ex)
    {
        Console.WriteLine(ex.StackTrace);
    }
    finally
    {
        myConnection.Close();
    }
}
return result;

Процедура в пакете Oracle ...

PROCEDURE insert (
  p_id               IN   ALL_ASSETS.id%TYPE,
  p_description      IN   ALL_ASSETS.description%TYPE
)
IS
BEGIN
  INSERT INTO ALL_ASSETS
              (id, description)
       VALUES (p_id, p_description);
END insert;

Кто-нибудь может пролить свет на то, как возвращается ROWID, пожалуйста?

РЕДАКТИРОВАТЬ - теперь я изменил код, как указано выше, но по-прежнему нет возврата ROWID. Также вставляется только одна запись.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 июля 2009

Почему вы ожидаете, что он вернет rowid? Не там, где в конце БД вы об этом просили, и процедура не собирается возвращать ROWID и не будет знать, какой из них вернуть в любом случае.

Автоматический возврат ROWID затронутых строк может работать для INSERT / UPDATE / MERGE и, возможно, DELETE (хотя в этом случае я не уверен в этом).

Вы можете использовать INSERT INTO ALL_ASSETS (id, description) VALUES (p_id, p_description) ВОЗВРАЩАЕТСЯ ROWID INTO v_rowid;

v_rowid будет переменной в PL / SQL, и вы можете вернуть ее из базы данных в качестве дополнительного параметра out или преобразовать процедуру в функцию.

1 голос
/ 10 июля 2009

Хммм, вам действительно нужно указывать rowid в качестве параметра out в вашей хранимой процедуре? Я думал, что ExecuteOracleNonQuery автоматически вернул его как переменную c # out.

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