0

以下のコードでは、"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()

}
4

3 に答える 3

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

}

この時点で、かなり再利用可能です。

于 2013-03-07T04:35:44.027 に答える
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);
于 2013-03-07T03:16:50.923 に答える
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);
于 2013-03-07T03:24:12.370 に答える