Как вернуть rowid из ExecuteOracleNonQuery в C #

2

Я использую ExecuteOracleNonQuery в С# для INSERT записи в мою базу данных Oracle с помощью хранимой процедуры, но, похоже, не может вернуть ROWID.

В С#...

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?

EDIT - теперь я изменил код так, как указано выше, но не возвратил ROWID. Кроме того, вставляется только одна запись.

Спасибо.

Теги:

2 ответа

2

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

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

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

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

  • 0
    Спасибо за информацию, Гэри. Я попытался передать его сам как выходной параметр, но безрезультатно (исходный код был опубликован с этим). C # имеет ключевое слово out, которое используется для возврата rowid в этом случае. От MSDN: «ExecuteOracleNonQuery отличается от ExecuteNonQuery тем, что он возвращает rowid в качестве выходного параметра, если вы выполняете оператор INSERT, DELETE или UPDATE, который влияет только на одну строку. Это позволяет вам однозначно идентифицировать строку в базе данных Oracle, которая может позволяют повысить производительность в последующих связанных запросах. " Однако они не упоминают, как это возвращается!
1

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

  • 0
    Это то, о чем я думал, поэтому я изначально не заявлял об этом. Тем не менее, я до сих пор не получил ничего обратно.
  • 0
    Вы абсолютно уверены, что SP затрагивает ровно 1 строку; документация предполагает, что он не может быть возвращен, если нет ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню