繁体   English   中英

Oracle ADO.NET中的绑定Guid参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM