2013-10-04 51 views
0

我有这样一个Command对象:如何通过sqlParameterCollection到命令对象

SqlCommand cmd1 = new SqlCommand(); 

我怎样才能建立sqlParameterCollection在另一个常规,这个集合传递给该Command对象?

我有这样的代码:

private SqlParameterCollection BuildParameters() 
{ 
    SqlCommand cmd2 = new SqlCommand(); 

    cmd2.Parameters.Add("@year", SqlDbType.Int).Value = 2013; 

    return cmd2.Parameters; 
} 

我愿做这样的事情:

cmd1.Parameters = BuildParameters(); 
+1

扩展方法? –

+0

替换了产品标签,因为这个问题并不是真正关于SQL Server的。 –

回答

0

你可以处理这是一个扩展方法,但老实说,我真的不知道怎么样有用这将是

public static IEnumerable<IDbDataParameter> BuildParameters(this IDbCommand command, params KeyValuePair<string, DbType>[] parameters) 
{ 
    foreach(KeyValuePair<string, DbType> kvpParam in parameters) 
    { 
     IDbDataParameter param = command.CreateParameter(); 
     param.ParameterName = kvpParam.Key; 
     param.DbType = kvpParam.Value; 
     yield return param; 
    } 
} 
0

SqlCommand.Parameters属性是只读的,所以你不能分配一个SqlParameterCollection对象。

您可能希望从BuildParameters从而返回的SqlParameter数组:

private SqlParameter[] BuildParameters() 
    { 
     SqlParameter[] para = new SqlParameter[3]; 
     para[0] = new SqlParameter("@year", SqlDbType.Int) { Value = 2013 }; 
     return para; 
    } 

然后你就可以做到以下几点: -

SqlCommand cmd1 = new SqlCommand(); 
    cmd1.Parameters.Clear(); 
    cmd1.Parameters.AddRange(BuildParameters()); 
+0

嗯。所以我可以使用一个SqlParameter数组作为工作。或者也许我可以传递整个Command对象,不仅是参数集合? –

+0

是的,您可以将'SqlCommand'对象作为参数传递给'BuildParameters'方法。不知道你希望如何使用/重新使用这个方法,因为它看起来像在'BuildParameter'方法中硬编码的参数。这是否意味着您要传入的'SqlCommand'对象的参数始终保持相同? –

0

你可以简单的迭代throught集合。

foreach (var mysqlParamater in oMySqlParameterCollection) 
     { 
      oMySqlCommand.Parameters.Add(mysqlParamater); 
     } 

我写了你可以如下使用SP名一起接受mysqlparamater收集的方法: -

public int ExecuteNonQuery(MySqlParameterCollection oMySqlParameterCollection, string storedProcedure) 
    { 
     int affectedRows = 0; 
     _oMySqlConnection.Open(); 
     MySqlCommand oMySqlCommand = new MySqlCommand 
     { 
      CommandType = CommandType.StoredProcedure, 
      CommandText = storedProcedure, 
      Connection = _oMySqlConnection 
     }; 
     foreach (var mysqlParamater in oMySqlParameterCollection) 
     { 
      oMySqlCommand.Parameters.Add(mysqlParamater); 
     } 
     affectedRows = oMySqlCommand.ExecuteNonQuery(); 
     _oMySqlConnection.Close(); 
     return affectedRows; 
    }