顺序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)


相关推荐

  • 敏感词过滤器的实现

    敏感词过滤器的实现敏感词过滤器的实现导包敏感词文件前缀树的实现敏感词过滤器的实现导包本文的敏感词过滤器用在SpringBoot项目中,因此,首先需要在pom.xml文件中导入如下依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><depend

  • git强制删除已经添加的文件

    git强制删除已经添加的文件

  • java图书馆新地址_基于SSM的社区图书馆管理系统的设计与实现[通俗易懂]

    java图书馆新地址_基于SSM的社区图书馆管理系统的设计与实现[通俗易懂]好程序设计擅长JAVA(SSM,SSH,SPRINGBOOT)、PYTHON(DJANGO/FLASK)、THINKPHP、C#、安卓、微信小程序、MYSQL、SQLSERVER等,欢迎咨询在学习社区图书馆管理系统的设计与实现项目的时候,方便日后能及时查阅,在本平台中记录一下社区图书馆管理系统的设计与实现的开发流程。在学习时候的选用了SSM(MYECLIPSE),这个框架…

  • vscode配置和快捷键

    vscode配置和快捷键以下内容转载自https://www.cnblogs.com/qianguyihao/archive/2019/04/18/10732375.html本文的最新内容,更新于2020-06-19。大家完全不用担心这篇文章会过时,因为随着VSCode的版本更新和插件更新,本文也会随之更新。本文的最新内容,也会在GitHub上同步更新,欢迎star。VSCode软件实在是太酷、太好用了,越来越多的新生代互联网青年正在使用它。前端男神尤雨溪大大这样评价VSCode:.

  • 看看行不行「建议收藏」

    看看行不行「建议收藏」支持FreakshareRapidgatorHotfileKeep2shareRyushareFilepostLumfileBitshareFilefactoryExtabitNetloadUploaded.toUl.toCtdisk等主流网盘会员直接高速下载!Ctdisk城通网盘/Dbank华为网盘完全免费!http://wishuhappy.com/[@Ie4Gy

  • python flask-mail 实现qq发送邮件[通俗易懂]

    python flask-mail 实现qq发送邮件

发表回复

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

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