【问题标题】:How to create C# Method with sqlconnection executing stored procedure with Array of Parameters如何使用 sqlconnection 创建带有参数数组的存储过程的 C# 方法
【发布时间】:2013-03-07 03:09:55
【问题描述】:

使用下面的代码,我正在执行名为“sp_InsertTradingAcctTransFront”的存储过程,其中包含 4 个参数。

现在,我不想输入每个参数,而是将参数和字段作为数组来完成。

喜欢:

  cmd.Parameters.Add(new SqlParameter("@sp parametername", param);

请注意 param 是 Array。

private void Methodname(SQlConn, param)
{
  //param as ARRAY of parameters

    cmd.CommandText = "sp_InsertTradingAcctTransFront";
    cmd.Parameters.Add(new SqlParameter("@mBatchName", mCollectionID));
    cmd.Parameters.Add(new SqlParameter("@mTATCash", mTATCash));
    cmd.Parameters.Add(new SqlParameter("@mTATradingOrdinary", mTATradingOrdinary));
    cmd.Parameters.Add(new SqlParameter("@mTATradingType", mTATradingType)); 
    cmd.ExecuteNonQuery();
    SQLConn.close()

}

【问题讨论】:

    标签: c# arrays stored-procedures methods sqlparameter


    【解决方案1】:

    我相信使用Dictionary(TKey, TElement) 会更容易

    private void QueryDatabase(string connectionString, string commandText, IDictionary<string, object> parameters)
    {
        using(var connection = new SqlConnection(connectionString))
        using(var command = connection.CreateCommand())
        {
            command.CommandText = commandText;
            command.Parameters.AddRange(parameters.Select(l => new SqlParameter(l.Key, l.Value)));
            command.CommandType = CommandType.StoredProcedure;
    
            connection.Open()
            command.ExecuteNonQuery();
        }
    
    }
    

    编辑:

    public interface IParameterizable
    {
        IEnumerable<SqlParameter> GetParameters();
    }
    
    public SqlParameterAttribute : Attribute
    {
        public string Name { get; set; }
    }
    
    public class InsertTradingAcctTransFrontParameters : IParameterizable
    {
        [SqlParameter( Name = "@mBatchName" )]
        public int CollectionId { get; set; }
    
        /* ... */
    
        IEnumerable<SqlParameter> GetParameters()
        {
            // Validation for properties, etc...
            if(0 > CollectionId) throw new MeaningfulException("CollectionId must be greater than 0");
    
            yield return new SqlParameter(GetParameterName("CollectionId"), CollectionId);
        }
    
        private string GetParameterName(string propertyName)
        {
            var attribute = GetType().GetProperty(propertyName).GetCustomAttributes(typeof(SqlParameterAttribute), false).SingleOrDefault();
    
            if(attribute == null) throw new NotImplementedException(string.Format("SqlParameter is not defined for {0}", propertyName);
    
            return ((SqlParameterAttribute)attribute).Name;
        }
    }
    

    然后你可以改变你的查询方式:

    private void QueryDatabase(string connectionString, string commandText, IParameterizable parameters)
    {
        using(var connection = new SqlConnection(connectionString))
        using(var command = connection.CreateCommand())
        {
            command.CommandText = commandText;
            command.Parameters.AddRange(parameters.GetParameters());
            command.CommandType = CommandType.StoredProcedure;
    
            connection.Open()
            command.ExecuteNonQuery();
        }
    
    }
    

    在这一点上,它非常可重用。

    【讨论】:

    • 嗨 Romoku,非常有趣的代码。你如何在你的代码中实现这个方法?
    • 我通常定义一个类来保存我的参数。如果你愿意,你可以在类上有一个方法来创建你的参数。检查我的编辑。
    【解决方案2】:

    假设您的代码确保参数数量正确,您可以使用数组索引 ([#]) 引用数组中的每一项:

    private void Methodname(string SQLConn, object[] param)
    {
        ...
        cmd.Parameters.Add(new SqlParameter("@mBatchName", param[0]));
        cmd.Parameters.Add(new SqlParameter("@mTATCash", param[1]));
        cmd.Parameters.Add(new SqlParameter("@mTATradingOrdinary", param[2]));
        cmd.Parameters.Add(new SqlParameter("@mTATradingType", param[3]));
    

    如果您正在谈论传递SQLParameter 对象的数组,则可以使用所有集合类型公开的AddRange 将数组的全部内容附加到集合中:

    private void Methodname(string SQLConn, SQLParameter[] param)
    {
        ...
        cmd.Parameters.AddRange(param);
    

    【讨论】:

      【解决方案3】:

      你可以使用SqlParameterCollection.AddRange方法。

      例子:

      Array a = Array.CreateInstance(typeof(SqlParameter), 4);
      a.SetValue(new SqlParameter("@mBatchName", mCollectionID), 0);
      a.SetValue(new SqlParameter("@mTATCash", mTATCash), 1);
      a.SetValue(new SqlParameter("@mTATradingOrdinary", mTATradingOrdinary), 2);
      a.SetValue(new SqlParameter("@mTATradingType", mTATradingType), 3);
      cmd.Parameters.AddRange(a);
      

      【讨论】:

        猜你喜欢
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        相关资源
        最近更新 更多