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

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

大家好,又见面了,我是你们的朋友全栈君。

    接触到一个老的项目,里面大量使用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下不会出问题。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144489.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 详解stacking过程

    翻到之前自己写的这篇博客,感觉写的还是不够简洁明了,特地回来改一下,顺便文末附上Kaggle内相关操作的代码,希望能够帮助学习的同学能够瞬间理解stacking这个概念。stacking:stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。sta…

  • Qt 用QMediaPlayer实现简易播放器

    Qt 用QMediaPlayer实现简易播放器QtMultimedia是Qt的一个重要模块,它提供了许多c++类和QML模块来进行多媒体内容的展示和处理,还提供了一些访问录音机和摄像头的必要的api。本篇中,主要讲述的是C++的实现,而不是QM

  • UVa 11732 – strcmp() Anyone?

    UVa 11732 – strcmp() Anyone?

  • 多线程锁有几种类型_线程互斥和同步的区别

    多线程锁有几种类型_线程互斥和同步的区别一、同步与互斥的概念  现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能:都需要访问/使用同一种资源;多个任务之间有依赖关系,某个任务的运行依赖于另一个任务。【同步】:  是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以…

    2022年10月24日
  • Pytest(11)allure报告[通俗易懂]

    Pytest(11)allure报告[通俗易懂]前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。mac环境:

  • python中sqrt函数用法_Python sqrt() 函数

    python中sqrt函数用法_Python sqrt() 函数内容简介:sqrt()方法返回数字x的平方根。描述sqrt()方法返回数字x的平方根。语法以下是sqrt()方法的语法:importmathmath.sqrt(x)注意:sqrt()是不能直接访问的,需要导入math模块,通过静态对象调用该方法。参数x–数值表达式。返回值返回数字x的平方根。实例以下展示了使用sqrt()方法的实例:#!/usr/bin/pythonim…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号