2017-07-04 28 views
0

,我想参数的集合添加到的SqlCommand我有这样的代码。如何在C#中查询执行之前向SqlCommand添加参数集合?

public void AddParameters(Dictionary<string, object> parameters) 
{ 
    if (parameters == null) 
     return; 

    foreach(KeyValuePair<string, object> keyValue in parameters) 
    { 
     sqlCommand.Parameters.AddWithValue(keyValue.Key, keyValue.Value); 
    } 
} 

我想使它更有效率而不使用循环,因为我可以有一个非常大的参数集合。有什么方法可以用一个函数来添加整个集合吗?

+3

的“单一功能”将其内部都有一个循环。那么它以什么方式与众不同呢? – user5014677

+1

这个循环是否会降低您的表现? – Stefan

+3

你正在优化错误的东西。不关心微秒,但代码安全。使用'AddWithValue'是不安全的,并且会导致性能(或其他)问题,因为参数的类型必须从该值派生。 –

回答

3

只有这样,才能“优化”那种情况下是已经有一个DbCommand实例与正确的命令文本/类型围坐,并已增加了参数,你只需设置每回合.Value执行前反对连接。但是,如果您使用多个连接/线程,则需要仔细同步,因此需要小心谨慎地进行。最终,什么你在这里做将是没什么比跟一个数据库,这样的延迟:很可能,这仅仅是过早的优化和牦牛剃须 - 意思是:你可能会觉得你在这里取得了一些有用的东西,但你实际上只是在花费你的时间。

0

可以使用的AddRange方法来改善略的表现:

public void AddParameters(SqlParameter[] parameters) 
    { 
     if (parameters == null) 
      return; 
     sqlCommand.Parameters.AddRange(parameters); 

    } 
+1

所有做的采集参数是*隐藏*循环... –

+0

@MarcGravell不知道......刚看到这个question..https:/ /stackoverflow.com/questions/9836471/why-is-addrange-faster-than-using-a-foreach-loop –

+2

确实,但这里有两个问题; a:当我们将db延迟添加到混合中的时候,我们所做的其他一切都将是**不相关的边际数据**,b:我会打赌你实际上**在这里添加了**时间(未删除它),通过'ToArray' - 所以现在它循环两次*而不是一次,*和*做一个堆分配/复制。 –

1

我不喜欢的几件事情

  1. 为什么你需要一个public方法参数添加到个人SqlCommand即应根本不是一个领域,而应该在你使用它的地方创建。这太容易出错。
  2. 在优化错误的东西。不关心微秒,但代码安全。使用AddWithValue是不是安全,并可能导致性能(或其他)问题,因为参数的类型必须从价值

衍生如果你可以用这样的方法,但有一点好处:

void AddParameters(params SqlParameter[] parameters) 
{ 
    if (parameters == null || parameters.Length == 0) 
     return; 

    sqlCommand.Parameters.AddRange(parameters); 
} 

params关键字允许以这种方式来使用它:

SqlParameter pararmeter = new SqlParameter("@Column", SqlDbType.Int); 
pararmeter.Value = 1234; 
AddParameters(pararmeter); 
相关问题