Есть ли способ заставить OracleCommand.BindByName должно быть true по умолчанию для ODP.NET?
с
6 ответов
Я знаю, что этот поток старый, но у меня была та же проблема сегодня, и я думал, что поделюсь своим решением, если у кого-то еще есть эта проблема. Поскольку OracleCommand запечатан (что отстой), я создал новый класс, который инкапсулирует OracleCommand, установив bindbyname в true при создании экземпляра. Вот часть реализации:
public class DatabaseCommand
{
private OracleCommand _command = null;
public DatabaseCommand(string sql, OracleConnection connection)
{
_command = new OracleCommand(sql, connection)
{
BindByName = true
};
}
public int ExecuteNonQuery()
{
return _command.ExecuteNonQuery();
}
// Rest of impl removed for brevity
}
тогда все, что мне нужно было сделать для очистки команд, это выполнить поиск OracleCommand и заменить DatabaseCommand и test.
Я не пробовал, но,
Я видел что-то вроде
"cmd.GetType().GetProperty("BindByName").SetValue(cmd,true,null);
"
в PetaPoco.cs файл.
возможно, это может помочь.
У меня была такая же проблема с командами обновления SqlDataSource после переноса кода ASPX в Oracle.DataAcees.Клиент и решил его, изменив OracleCommand.Свойство BindByName в обработчике Sqldatasource OnUpdating выглядит следующим образом:
protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
Oracle.DataAccess.Client.OracleCommand b_OracleCommand =
(Oracle.DataAccess.Client.OracleCommand)e.Command;
b_OracleCommand.BindByName = true;
}
добавьте частичный класс для вашего TableAdapter и добавьте метод или свойство, как вы хотите, с этим кодом:
for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1))
{
if ((this.CommandCollection[i] != null))
{
((global::Oracle.DataAccess.Client.OracleCommand)(this.CommandCollection[i])).BindByName = value;
}
}
Я решил эту проблему, установив свойство BindByName в обработчике события обновления SqlDataSource:
protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true;
// ...
}
для уменьшения # строк кода
VB.NET
Dim command As OracleCommand = New OracleCommand(query, connection) With {.CommandType = CommandType.StoredProcedure, .BindByName = True}
C#
OracleCommand command = new OracleCommand(query, connection) { CommandType = CommandType.StoredProcedure, BindByName = true };