顺序OleDbCommand命名参数,你了解不?

本文通过四个测试案例探讨了在OleDbConnection中使用Oracle数据库时,命名参数在不同顺序下的表现,揭示了命名参数虽然可用,但在某些情况下仍需遵循特定顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    接触到一个老的项目,里面大量使用OleDbConnection进行数据库操作,在执行SQL块语句时,对它的顺序参数、命名参数很不了解。据说不能使用命名参数,但我这里试验了一下,好像是可以的,只是对参数的顺序还是有要求。看看你能知道下面的输出结果吗?

    测试环境:OleDbConnection+Oracle10G   

using System;
using System.Data;
using System.Data.OleDb;
using System.Data.OracleClient;
using System.Text.RegularExpressions;
using System.Text;
using System.Collections;

using System.Diagnostics;
namespace ConsoleApplication1
{
    
/// <summary>
    
/// Class1 的摘要说明。
    
/// </summary>
    class Program
    {


        
private void Test1()
        {
            
using(OleDbConnection conn = new OleDbConnection("Provider=OraOLEDB.Oracle;User ID=oauser;Data Source=oa163;Password=1234;Persist Security Info=True;"))
            {
                
string sql = "begin  delete from B; insert into B(A,B) values(:a,:b); end;";        //很正常的

                OleDbCommand cmd 
= new OleDbCommand(sql,conn);

                cmd.Parameters.Add(
"a",OleDbType.VarChar,100);
                cmd.Parameters[
"a"].Value = "a";

                cmd.Parameters.Add(
"b",OleDbType.VarChar,100);
                cmd.Parameters[
"b"].Value = "b";

                cmd.CommandType 
= CommandType.Text;
                conn.Open();
                cmd.ExecuteNonQuery();

                cmd.CommandText 
= "select a,b from B";
                
using(OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
                {
                    Debug.Assert(dr.Read());

                    Debug.Assert(dr.GetString(dr.GetOrdinal(
"a")) == "a");        //正常结果
                    Debug.Assert(dr.GetString(dr.GetOrdinal("b")) == "b");
                }
                

            }
        }

        
private void Test2()
        {
            
using(OleDbConnection conn = new OleDbConnection("Provider=OraOLEDB.Oracle;User ID=oauser;Data Source=oa163;Password=1234;Persist Security Info=True;"))
            {
                
string sql = "begin delete from B; insert into B(B,A) values(:b,:a); end;";  //这里换一下顺序 

                OleDbCommand cmd 
= new OleDbCommand(sql,conn);

                cmd.Parameters.Add(
"a",OleDbType.VarChar,100);
                cmd.Parameters[
"a"].Value = "a";

                cmd.Parameters.Add(
"b",OleDbType.VarChar,100);
                cmd.Parameters[
"b"].Value = "b";

                cmd.CommandType 
= CommandType.Text;
                conn.Open();
                cmd.ExecuteNonQuery();

                cmd.CommandText 
= "select a,b from B";
                
using(OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
                {
                    Debug.Assert(dr.Read());

                    Debug.Assert(dr.GetString(dr.GetOrdinal(
"a")) == "b");                //结果不一样了吧
                    Debug.Assert(dr.GetString(dr.GetOrdinal("b")) == "a");
                }
                

            }
        }

        
private void Test3()
        {
            
using(OleDbConnection conn = new OleDbConnection("Provider=OraOLEDB.Oracle;User ID=oauser;Data Source=oa163;Password=1234;Persist Security Info=True;"))
            {
                
string sql = "declare v_exists int := 1;" +
                    
"begin " +
                    
"   delete from B;" +
                    
"    select count(*) into v_exists from B where a=:a and b=:b and rownum < 2; " + //很正常的
                    "    if (v_exists = 0) then " +
                    
"        insert into B(A,B) values(:a,:b); " +
                    
"    end if; " +
                    
"end;"

                OleDbCommand cmd 
= new OleDbCommand(sql,conn);

                cmd.Parameters.Add(
"a",OleDbType.VarChar,100);
                cmd.Parameters[
"a"].Value = "a";

                cmd.Parameters.Add(
"b",OleDbType.VarChar,100);
                cmd.Parameters[
"b"].Value = "b";

                cmd.CommandType 
= CommandType.Text;
                conn.Open();
                cmd.ExecuteNonQuery();
                
                cmd.CommandText 
= "select a,b from B";
                
using(OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
                {
                    Debug.Assert(dr.Read());

                    Debug.Assert(dr.GetString(dr.GetOrdinal(
"a")) == "a");                //正常结果
                    Debug.Assert(dr.GetString(dr.GetOrdinal("b")) == "b");
                }

            }

        }
        
private void Test4()
        {
            
using(OleDbConnection conn = new OleDbConnection("Provider=OraOLEDB.Oracle;User ID=oauser;Data Source=oa163;Password=1234;Persist Security Info=True;"))
            {
                
string sql = "declare v_exists int := 1;" +
                    
"begin " +
                    
"   delete from B;" +
                    
"    select count(*) into v_exists from B where b=:b and a=:a and rownum < 2; " +  //  b=:b and a=:a 换一下顺序
                    "    if (v_exists = 0) then " +
                    
"        insert into B(A,B) values(:a,:b); " +
                    
"    end if; " +
                    
"end;"

                OleDbCommand cmd 
= new OleDbCommand(sql,conn);

                cmd.Parameters.Add(
"a",OleDbType.VarChar,100);
                cmd.Parameters[
"a"].Value = "a";

                cmd.Parameters.Add(
"b",OleDbType.VarChar,100);
                cmd.Parameters[
"b"].Value = "b";

                cmd.CommandType 
= CommandType.Text;
                conn.Open();
                cmd.ExecuteNonQuery();
                
                cmd.CommandText 
= "select a,b from B";
                
using(OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
                {
                    Debug.Assert(dr.Read());

                    Debug.Assert(dr.GetString(dr.GetOrdinal(
"a")) == "b");                //结果不一样了吧
                    Debug.Assert(dr.GetString(dr.GetOrdinal("b")) == "a");
                }

            }

        }

        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>
        [STAThread]
        
static void Main(string[] args)
        {
            
//
            
// TODO: 在此处添加代码以启动应用程序
            
//

            
try
            {
                Program prog 
= new Program();

                prog.Test1();
                prog.Test2();
                prog.Test3();
                prog.Test4();

            }
            
catch(Exception exp)
            {
                Console.WriteLine(exp.ToString());
            }
            
finally
            {
                Console.ReadLine();
            
            } 
        }
    }
}
    看起来,在OleClient中使用块语句,还是有可能的。但愿9G下不会出问题。

转载于:https://www.cnblogs.com/evlon/archive/2009/04/02/1427806.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值