另一个 OracleParameterCollection 中已包含 OracleParameter

出现这个错误的时候,我按照百度来的方法 在finally里面加cmd.Parameters.Clear(); 在

foreach (OracleParameter parm in cmdParms)
                {
                    cmd.Parameters.Add(parm);
                }

前面加cmd.Parameters.Clear(); 都不管用 后来 发现又找到一种方法 这回管用了:

OracleParameter pp = (OracleParameter)((ICloneable)parm).Clone();
                    cmd.Parameters.Add(pp);


/// <summary>
		/// 执行查询语句,返回DataSet
		/// </summary>
		/// <param name="SQLString">查询语句</param>
		/// <returns>DataSet</returns>
		public static DataSet Query(string SQLString,params OracleParameter[] cmdParms)
		{
			using (OracleConnection connection = new OracleConnection(connectionString))
			{
                using (OracleCommand cmd = new OracleCommand())
                {
                    PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                    using (OracleDataAdapter da = new OracleDataAdapter(cmd))
                    {
                        DataSet ds = new DataSet();
                        try
                        {
                            da.Fill(ds, "ds");
                            cmd.Parameters.Clear();
                        }
                        catch (System.Data.OracleClient.OracleException ex)
                        {
                            throw new Exception(ex.Message);
                        }
                        finally
                        {
                            cmd.Parameters.Clear();
                        }
                        return ds;
                    }
                }
			}			
		}



private static void PrepareCommand(OracleCommand cmd,OracleConnection conn,OracleTransaction trans, string cmdText, OracleParameter[] cmdParms) 
		{
			if (conn.State != ConnectionState.Open)
				conn.Open();
			cmd.Connection = conn;
			cmd.CommandText = cmdText;
			if (trans != null)
				cmd.Transaction = trans;
			cmd.CommandType = CommandType.Text;//cmdType;
			if (cmdParms != null) 
			{
                cmd.Parameters.Clear();
                foreach (OracleParameter parm in cmdParms)
                {
                    OracleParameter pp = (OracleParameter)((ICloneable)parm).Clone();
                    cmd.Parameters.Add(pp);
                }
			}
		}



OracleParameter是用于向Oracle数据库发送参数化查询时使用的一个类,它定义了存储过程、函数或命令用到的参数的属性,如参数的名称、数据类型、大小、精度、方向(输入、输出、输入/输出或返回值)等。 使用场景主要包括: 1. 执行存储过程或函数时,为它们提供必要的参数。 2. 向SQL语句插入动态参数值,避免SQL注入攻击。 3. 在使用OracleCommand执行查询时,需要对参数进行详细的设置,比如参数的数据类型和长度。 如何使用OracleParameter: 1. 创建OracleConnection实例并打开连接。 2. 创建OracleCommand实例,并设置其CommandText属性为要执行的存储过程名或SQL语句。 3. 创建OracleParameter实例,并设置其属性,如ParameterName(参数名称)、OracleDbType(数据类型)、Direction(方向,如输入、输出、输入/输出或返回值)等。 4. 将OracleParameter实例添加到OracleCommand的Parameters集合。 5. 设置OracleParameter的Value属性为要传递的实际值。 6. 执行OracleCommand,可以是通过调用ExecuteNonQuery、ExecuteScalar或ExecuteReader方法,取决于命令是执行一个动作(如更新数据)还是返回结果集(如查询数据)。 示例代码如下: ```csharp using System; using Oracle.DataAccess.Client; public class Example { public static void Main() { string constr = "User Id=username;Password=password;Data Source=orcl;"; OracleConnection con = new OracleConnection(constr); try { con.Open(); OracleCommand cmd = new OracleCommand("pkg_example.sp_example_procedure", con); cmd.CommandType = CommandType.StoredProcedure; // 创建OracleParameter实例 OracleParameter param1 = new OracleParameter(); param1.ParameterName = "p_input"; param1.OracleDbType = OracleDbType.Varchar2; param1.Direction = ParameterDirection.Input; param1.Value = "TestValue"; // 添加参数到OracleCommand的Parameters集合 cmd.Parameters.Add(param1); // 执行存储过程 cmd.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { con.Close(); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕儿归

感谢感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值