如何创建c#方法与sqlconnection执行存储过程与参数数组

本文关键字:sqlconnection 执行 存储过程 数组 参数 方法 何创建 创建 | 更新日期: 2023-09-27 18:02:45

使用下面的代码,我执行名为"sp_InsertTradingAcctTransFront"的存储过程,包含4个参数。

现在,不是键入每个参数,而是将参数和字段都作为Array。

:

  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#方法与sqlconnection执行存储过程与参数数组

我相信使用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();
    }
}

现在可以重用了

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

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);

可以使用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);