接触到一个老的项目,里面大量使用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. 履带机器人运动控制器c++_敏捷得像猫,被抛出后能平稳着地,有意思的美国西点军校机器人!...
  2. 李飞飞当选美国医学科学院院士!用AI照亮医疗黑暗空间
  3. JavaWeb学习笔记①——Java向下转型在JavaEE中运用——登陆验证
  4. Leetcode 136.只出现一次的数字 (每日一题 20210714)
  5. 线性代数:第三章 矩阵的初等变换与线性方程组(1)矩阵的初等变换 矩阵的秩
  6. 扩展坞可以把手机投到显示器吗_你的电脑可以省了!华为Mate 30搭配绿联新一代扩展坞轻松变电脑...
  7. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
  8. openstack网络指南_性格内向的战术网络指南
  9. AdamOptimizer和随机梯度下降法SGD的区别
  10. 微软的基础服务器,微服务器当道 微软云端基础构架揭秘
  11. Ubuntu18.04安装中文字体SimHei
  12. 统计学与概率论的区别
  13. shopex服务器信息,ShopEx开放平台
  14. iis mysql安装包下载_配置Windows Server2008+iis+php+mysql所需下载安装包
  15. 小米10至尊纪念版和华为mate40的区别 哪个好
  16. 定时器Timer(一)—— 定时器Timer的使用
  17. Invalid bound statement (not found): com.wxx.manager.mapper.GoodsCategoryMapper.selectByExample
  18. android8.1官方下载,【安卓市场】安卓市场app官方下载 v7.8.1.81 手机版-七喜软件园...
  19. 【参赛作品15】openGauss数据库维护管理
  20. 袋鼠妈妈和植物主义哪个适合孕妇用?主要看这几点

热门文章

  1. 系统学习iOS动画之七:其它类型的动画
  2. Ubuntu修改登录密码
  3. 常见的Linux操作系统
  4. 进制(二进制、八进制、十进制、十六进制)
  5. 如何做好苹果产品的清洁?清洁apple产品时需要注意什么?
  6. 发生在软件测试工程师身上如同段子一样的日常
  7. Python算法——判断年龄
  8. ubuntu打开终端的方法(5种)
  9. 《数据结构(信息管理)》
  10. ARMv8架构u-boot启动流程详细分析(二)