[英]Binding Guid parameter in Oracle ADO.NET
我有一个C#应用程序(.NET Framework 4.0),该应用程序使用Instant Client(v.2.1.2.1)从Oracle使用Oracle.DataAccess.dll提供程序访问Oracle数据库。
我的表有2列:Id(RAW类型)和Name(VARCHAR2类型)。
我可以运行SELECT并正确绑定Id参数。 但是,当我在Update中尝试完全相同的绑定类型时,该行将永远不会更新。
这是一个示例程序来演示我的问题。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Oracle.DataAccess.Client;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Transactions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string connectString = ConfigurationManager.ConnectionStrings["testOracle"].ConnectionString;
Guid id = Guid.Parse("590704389D204D979A8BA775F000F300");
using (OracleConnection connection = new OracleConnection(connectString))
{
connection.Open();
using (OracleCommand command = connection.CreateCommand())
{
command.CommandType = CommandType.Text;
command.CommandText = "SELECT Id, Name FROM Enterprise WHERE Id = :Id";
command.Parameters.Add(":Id", id.ToString("N").ToUpper());
using (OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Trace.WriteLine(string.Format("ID: {0}, Name: {1}",
new Guid((byte[])reader["Id"]),
reader["Name"]));
}
}
}
using (OracleCommand command = connection.CreateCommand())
{
command.CommandType = CommandType.Text;
command.CommandText = "UPDATE Enterprise SET Name = :Name WHERE Id = :Id";
command.Parameters.Add(":Id", id.ToString("N").ToUpper());
command.Parameters.Add(":Name", "xxxx");
Trace.WriteLine(string.Format("Rows affected: {0}", command.ExecuteNonQuery()));
}
using (OracleCommand command = connection.CreateCommand())
{
command.CommandType = CommandType.Text;
command.CommandText = "SELECT Id, Name FROM Enterprise WHERE Id = :Id";
command.Parameters.Add(":Id", id.ToString("N").ToUpper());
using (OracleDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Trace.WriteLine(string.Format("ID: {0}, Name: {1}",
new Guid((byte[])reader["Id"]),
reader["Name"]));
}
}
}
}
}
}
}
我的程序始终输出:
ID: 38040759-209d-974d-9a8b-a775f000f300, Name: bbbbb
Rows affected: 0
ID: 38040759-209d-974d-9a8b-a775f000f300, Name: bbbbb
我也尝试了以下语句,但仍然失败
UPDATE Enterprise SET Name = :Name WHERE rowid = (SELECT rowid FROM Enterprise WHERE Id = :Id)
如何绑定我的Id参数,以便我的更新开始工作?
我终于弄明白了。
事实证明,Oracle的默认行为是按照在查询中定义的顺序绑定参数。
因此,为了使我的示例程序正常工作,我有两个解决方案。
1-切换参数绑定的顺序
更改
command.CommandType = CommandType.Text;
command.CommandText = "UPDATE Enterprise SET Name = :Name WHERE Id = :Id";
command.Parameters.Add(":Name", "toto");
command.Parameters.Add(":Id", id.ToString("N").ToUpper());
至
command.CommandType = CommandType.Text;
command.CommandText = "UPDATE Enterprise SET Name = :Name WHERE Id = :Id";
command.Parameters.Add(":Id", id.ToString("N").ToUpper());
command.Parameters.Add(":Name", "toto");
2-使用BindByName
将BindByName
属性设置为true
。
command.CommandType = CommandType.Text;
command.BindByName = true;
command.CommandText = "UPDATE Enterprise SET Name = :Name WHERE Id = :Id";
command.Parameters.Add(":Id", id.ToString("N").ToUpper());
command.Parameters.Add(":Name", "toto");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.