2013-03-07 73 views
0

随着下面的代码的阵列存储过程,我执行名为“sp_InsertTradingAcctTransFront”用4个参数的存储过程。如何创建C#方法与SqlConnection的执行与参数

现在,而不是键入每个参数的,我想做到这一点的参数和字段数组。

像:

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

记下参数是一个Array

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

如果你谈论的是传递一个:

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

} 

回答

0

假设你的代码确保参数的数量是正确的,你可以使用数组索引([#])是指每个项目在数组中SQLParameter对象的数组,你可以使用所有的集合类型暴露了AddRange到一个数组的全部内容追加到集合:

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

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

} 

在这一点上是相当可重复使用。

+0

嗨Romoku,非常有趣的代码。你如何在你的代码中实现这个方法? – donubas 2013-03-14 09:57:57

+0

我通常定义一个类来保存我的参数。如果你想要,你可以在课堂上有一个方法来创建你的参数。检查我的编辑。 – Romoku 2013-03-14 11:32:12