前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >顺序OleDbCommand命名参数,你了解不?

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

作者头像
全栈程序员站长
发布2022-08-31 09:05:49
3910
发布2022-08-31 09:05:49
举报

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

接触到一个老的项目,里面大量使用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.cn/144489.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档