顺序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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CSDN积分获取(csdn怎么查看积分)

    下载积分攻略:个人设置里进行手机绑定CSDN账户奖励50分(右上角设置-账户安全-手机绑定)完成任务送若干分积分http://task.csdn.net/上传有效资源获取积分(上传非法,广告资源用户,将被扣除一定积分,严重者封号)。·上传自己设分资源被下载,下载量×资源分,100分封顶。·上传0分资源被下载,下载量×系统奖励1分,100封顶评论资源获取积分(所下载资源只可以…

    2022年4月12日
  • 菜鸟浅谈——web安全测试[通俗易懂]

    菜鸟浅谈——web安全测试[通俗易懂]本文仅为小白了解安全测试提供帮助一:安全测试注意事项1)要注意白帽子与黑客之间的区别2)在挖漏洞挣外快时,注意不要使用安全扫描或暴力激活成功教程软件对上线网站进行扫描或攻击。不要对上线网站造成破坏,不要去获取网站的数据库信息等。否则等待的不是money,而是牢狱啦~~二:web介绍1)worldwideweb万维网,也被叫做www(3w),非常普遍的互联网应用,每天都有数以亿万…

    2022年9月19日
  • python标识符命名规则和要求_python必背入门代码

    python标识符命名规则和要求_python必背入门代码python标识符命名规则什么是标识符标识符:现阶段学习的变量名,后期会学习的函数名,类名这些都是标识符.简单来说就是程序中所有的名字的总称就是标识符.标识符的名字是不能乱起的,就像手机号不能用110是一个道理标识符命名规则有如下4个要求:1.见名知意:看到变量的名字就能知道这个变量干什么的2.由字母、下划线和数字组成,且数字不能开头3.区分大小写4.不能和关键字重复什么是关键字关键字是python语言已经使用的标识符,所以不允许开发者自己定义和关键字相同的名字的标识符.

    2022年9月9日
  • 一些书籍和下载链接地址读研究生

    一些书籍和下载链接地址读研究生

    2022年1月7日
  • js 正则是否包含某些字符串_js判断字符串中是否包含某个字符串[通俗易懂]

    js 正则是否包含某些字符串_js判断字符串中是否包含某个字符串[通俗易懂]String对象的方法1)indexOf()推荐varstr=”123″;console.log(str.indexOf(“3″)!=-1);//trueindexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串没有出现,则该方法返回-1.2)search()varstr=”123”;console.log(str.search(“3”)!=-1)…

    2022年8月31日
  • 网络编程-UDP编程

    网络编程-UDP编程2.UDP端口和TCP端口虽然都使用0~65535,但他们是两套独立的端口,即一个应用程序用TCP占用了端口1234,不影响另一个应用程序用UDP占用端口1234。在Java中使用UDP编程,仍然需要使用Socket,因为应用程序在使用UDP时必须指定网络接口(IP地址)和端口号。1.UDP和TCP编程相比,UDP编程就简单得多,因为UDP没有创建连接,数据包也是一次收发一个,所以没有流的概念。和服务器端相比,客户端使用UDP时,只需要直接向服务器端发送UDP包,然后接收返回的UDP包。…

    2022年9月8日

发表回复

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

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