Я использую 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. Кроме того, вставляется только одна запись.
Спасибо.
Почему вы ожидаете, что он вернет 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 или преобразовать процедуру в функцию.
Хм, вам действительно нужно указать rowid как параметр out в вашей хранимой процедуре? Я думал, что ExecuteOracleNonQuery автоматически возвращает его как переменную С# out.