接触到一个老的项目,里面大量使用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下不会出问题。

顺序OleDbCommand命名参数,你了解不?相关推荐

  1. scala中命名参数函数_Scala中的命名参数和默认参数值

    scala中命名参数函数 In this post, we are going to discuss the following two important concepts in Scala abo ...

  2. python可变参数和关键字参数位置_python 参数笔记 -- 位置参数 关键字参数 命名参数 形式参数 默认参数 可变参数 可选参数 位置顺序...

    这么多名称,python到底有几种参数: 2种:普通参数(即位置参数,靠位置先后来指定参数),关键字参数(即命名参数,靠名字来指定参数). 常说的可变参数也就是普参的集合,*args. 常说的关键字参 ...

  3. OleDbCommand使用参数应该注意的地方

    最近写程序用到OleDbCommand的Parameter写数据库,遇到很多问题: 1.OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序 ...

  4. C#可选参数、命名参数、参数数组

    学习了C#4.0的新特性:可选参数.命名参数.参数数组. 1.可选参数,是指给方法的特定参数指定默认值,在调用方法时可以省略掉这些参数. 但要注意: (1)可选参数不能为参数列表的第1个参数,必须位于 ...

  5. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. python笔记之函数参数(缺省参数,命名参数,不定长参数)

    缺省参数 函数中定义带有初始值的形参 参数调用时,缺省参数可传,可不传 缺省参数一定在参数列表的最后面 缺省参数的数量没有限制 def x_y_sum(x,y=20): #缺省参数要在参数列表的最后p ...

  7. Scala可变参数列表,命名参数和参数缺省

    重复参数 Scala在定义函数时允许指定最后一个参数可以重复(变长参数),从而允许函数调用者使用变长参数列表来调用该函数,Scala中使用"*"来指明该参数为重复参数.例如: 1 ...

  8. C# 4.0 新特性dynamic、可选参数、命名参数等

    1.dynamic ExpandoObject 熟悉js的朋友都知道js可以这么写 : 1 var t = new Object(); 2 t.Abc = 'something'; 3 t.Value ...

  9. scala中命名参数函数_Scala中带有命名参数的函数

    scala中命名参数函数 具有命名参数的函数 (Functions with named arguments ) A function is Scala can take multiple argum ...

最新文章

  1. 吴恩达deeplearning.ai最后一课上线,下一次得等多少年?
  2. 笔记本出现此windows无线服务器,笔记本win7系统提示windows无法配置此无线连接怎么办...
  3. .Net微信开发之通过UnionID机制,解决用户在不同公众号,或在公众号、移动应用之间帐号统一问题...
  4. Kafka日志清理之Log Compaction
  5. PureMvc学习笔记
  6. 【Pytorch神经网络实战案例】11 循环神经网络结构训练语言模型并进行简单预测
  7. php时间调用最简单的,PHP调用时间通过引用不可避免?
  8. Win10系统怎么锁定IE浏览器主页
  9. mysql 200列_Mysql数据表基本
  10. PetShop之业务逻辑层设计
  11. h5语音识别和文字转语音
  12. CSRF 攻击的对象
  13. 文件磁盘相关函数[22]-文本文件读写-不同数据类型的写入
  14. 毕设题目:Matlab水果识别分级
  15. SEO优化_文章原创怎么写
  16. 15.编写LED程序及反汇编工具
  17. (8)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接3
  18. 习丽妞 编程系统 诞生了
  19. QTableView 例三(代理)
  20. C/C++ 实验设备管理系统

热门文章

  1. 【C++系列P7】模板搞不懂?脑阔抖三抖!!精讲一篇过!
  2. 编程新技术实务实验一
  3. 什么是互联网骨干网,它是怎样工作的
  4. AirPods无法正常工作?如何对AirPods进行故障排除和修复
  5. 苹果win7网络未连接到服务器未响应,连接电脑无反应,教您怎么解决iphone连接电脑无反应...
  6. 物理CPU (physical CPU)、 逻辑CPU(logical CPU)、虚拟CPU(virtual CPU)、核数(core)、线程数(thread)、颗数(socket)
  7. 如何快速合并多个CSV / Excel / txt 文件
  8. 什么是面向对象?谈谈对面向对象的理解?
  9. android 支付数字键盘,微信小程序自定义数字键盘|仿支付宝、微信支付数字软键盘...
  10. C# MessageBox用法实例 (附效果图)