使用下面的代码,我正在执行名为“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()
}
答案 0 :(得分: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();
}
}
此时它非常可重复使用。
答案 1 :(得分:0)
假设您的代码确保参数数量正确,您可以使用数组索引([#]
)引用数组中的每个项目:
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);
答案 2 :(得分: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);