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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql groupadd_Linux下groupadd命令无法添加用户和组的解决

    mysql groupadd_Linux下groupadd命令无法添加用户和组的解决今天需要给一个linux服务器安装mysql,在安装mysql的时候,出现错误提示:[root@localhostsoftwaretools]#rpm-ivhMySQL-server-5.5.23-1.rhel5.x86_64.rpmPreparing…###########################################[100%]1…

    2022年10月28日
    0
  • java生成指定位数的随机数「建议收藏」

    java生成指定位数的随机数「建议收藏」java生成指定位数的随机数

    2022年4月23日
    207
  • php使用PdfParser搭配tcpdf解析pdf文件

    php使用PdfParser搭配tcpdf解析pdf文件前几天客户提出一个需求,就是在前台页面搜索文章时,若搜索词在文章附件的pdf文件中有出现的话就要将该文章作为搜索结果。我的思路是后台发布文章时循环检测每一个附件的格式,若附件格式为pdf的话就将里面的文字读取出来追加到一个$string变量里,然后将$string的作为一个file_text字段的信息保存到数据库后面做搜索的时候使用。我参考的一个回答地址是:https://baijiahao……

    2022年9月8日
    0
  • CSS 鼠标手指样式整理

    CSS 鼠标手指样式整理通过设置style属性来控制鼠标指针样式style=”cursor:*”href=”#”style=”cursor:pointer”>CSS鼠标手型效果href=”#”style=”cursor:crosshair”>CSS鼠标十字型效果href=”#”style=”cursor:help”>CSS鼠标问号效果text是移动到文本上的那种效果wait

    2022年5月24日
    98
  • clojure-repl的使用套路

    clojure-repl的使用套路

    2021年9月16日
    193
  • python全国计算机二级报名_python有证书考吗

    python全国计算机二级报名_python有证书考吗第一次参加全国计算机等级考试的考生对于网上报名的流程,对全国计算机考试流程中某些环节并不清楚,小编今天就整理下全国计算机等级考试流程及详细说明,提供网上报名流程示意图,解决大家在全国计算机等级考试报名过程中的疑问。(如有出入,请以官方信息为准)考生需登录各地计算机等级考试官方报名网站,进入“全国计算机等级考试报名系统”进行注册登录。(一)注册账号和登录一、注册ETEST通行证1.考生首次登录系…

    2022年9月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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