由于System.Data.OracleClient库已deprecated,我们正在迁移代码库以使用Oracle Data Provider for .NET(ODP.NET)。我们遇到的一个问题是System.Data.OracleClient使用参数名绑定而不是按位置绑定,并且所有代码都直接访问System.Data.OracleClient.OracleCommand而不是使用中间数据层。
由于存在相当多的代码,是否有一种简单的方法可以强制ODP.NET OracleCommand.BindByName默认为true,或者我们必须在每次使用它时设置值?如果失败了,有没有一种简单的方法可以在Visual Studio 2008中插入这行代码?
答案 0 :(得分:12)
我没试过,但是,
我见过类似
的内容 “cmd.GetType().GetProperty("BindByName").SetValue(cmd,true,null);
”
在PetaPoco.cs文件中。
也许它可以提供帮助。
答案 1 :(得分:8)
我知道这个帖子已经过时了,但我今天遇到了同样的问题并且认为我会分享我的解决方案以防其他人遇到这个问题。由于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替换并测试。
答案 2 :(得分:4)
在将ASPX代码移植到Oracle.DataAcees.Client之后,我遇到了与SqlDataSource Update命令相同的问题,并通过更改SqlDataSource OnUpdating处理程序中的OracleCommand.BindByName属性解决了这个问题:
protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
Oracle.DataAccess.Client.OracleCommand b_OracleCommand =
(Oracle.DataAccess.Client.OracleCommand)e.Command;
b_OracleCommand.BindByName = true;
}
答案 3 :(得分:0)
为您的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;
}
}
答案 4 :(得分:0)
我解决了这个问题,在SqlDataSource Updating事件的处理程序中设置了BindByName属性:
protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true;
// ...
}
答案 5 :(得分:0)
使用Oracle.ManagedDataAccess.Client,可以在app.config中进行配置:
<oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
</dataSources>
<settings>
<setting name="BindByName" value="True"/>
</settings>
</version></oracle.manageddataaccess.client>
答案 6 :(得分:-2)
减少#行代码
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 };