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


相关推荐

  • 1+X 云计算平台运维与开发认证(初级)样卷A——附答案

    传送门教育部:职业教育将启动“1+X”证书制度改革职业教育改革1+X证书制度试点启动1+X成绩/证书查询入口文章目录一、单选题(每题10分,共200分)二、多选题(每题15分,共300分)三、实操题(共500分)网络管理(70分)yum源管理(60分)数据库管理(70分)Linux存储LVM管理(60分)OpenStack管理(80分)Docker管理(80分)WordPress应用系…

    2022年4月8日
    48
  • return 补充部分

    return 补充部分

    2021年9月27日
    56
  • ubuntu copy命令「建议收藏」

    ubuntu copy命令「建议收藏」cp(copy)命令该命令的功能是将给出的文件或目录拷贝到另一文件或目录中。语法:cp[选项]源文件或目录目标文件或目录说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。该命令的各选项含义如下:-a该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。-d拷贝时保留链接。

    2025年7月25日
    0
  • Python 资源大全中文版[通俗易懂]

    Python 资源大全中文版[通俗易懂]Python资源大全中文版requests官方文档:http://cn.python-requests.org/zh_CN/latest/BeautifulSoup官方文档:https:/

    2022年7月6日
    26
  • 控制中的各种函数MATLAB仿真

    控制中的各种函数MATLAB仿真控制系统的MATLAB仿真1MATLAB简介MATLAB是Mathworks公司开发的一种集数值计算、符号计算和图形可视化三大基本功能于一体的功能强大、操作简单的优秀工程计算应用软件。MATLAB不仅可以处理代数问题和数值分析问题,而且还具有强大的图形处理及仿真模拟等功能。从而能够很好的帮助工程师及科学家解决实际的技术问题。MATLAB的含义是矩阵实验室(MatrixL

    2022年6月4日
    58
  • Linux xsync命令脚本

    Linux xsync命令脚本在/bin/目录下创建xsync脚本如下:#!/bin/bash#1.判断参数个数if[$#-lt1]thenechoNotEnoughArguement!exit;fi#2.遍历集群所有机器forhostinmasternode1node2doecho====================$host====================#3.遍历所有目录,挨个发送forfilein$@do#4…

    2022年5月5日
    159

发表回复

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

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