大家好,又见面了,我是你们的朋友全栈君。
接触到一个老的项目,里面大量使用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
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有