2009-09-30 65 views
2

我有一个文件集合,我将在事务中使用Dbcommand将每个文件称为SP。C#DbCommand在循环中

例如:

DbCommand insert = db.GetStoredProcCommand("Insert"); 
    db.AddInParameter(insert, "FileName", System.Data.DbType.String, 
     ID + ".xml"); 
    db.ExecuteNonQuery(insert, transaction); 

我的问题是我怎么把这个循环?

下面的答案不起作用,但是要感谢其他好的代码示例。问题是db没有你可以操作的Parameters集合。检查...

http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.data.sql.sqldatabase_members%28BTS.10%29.aspx

我声明我的数据库是这样的:

SqlDatabase db = new SqlDatabase(this.ConnectionString); 
+0

什么是C#类型的文件集合? – 2009-09-30 15:27:51

+0

标准文件信息[] – 2009-09-30 16:24:58

回答

9
DbCommand insert = db.GetStoredProcCommand("Insert"); 
foreach (string ID in myIDs) 
{ 
    insert.Parameters.Clear(); 
    db.AddInParameter(insert, "FileName", System.Data.DbType.String, 
     ID + ".xml"); 
    db.ExecuteNonQuery(insert, transaction); 
} 

你也可以只添加参数,一旦外循环,然后改变其内部的价值循环。一半是一半,另一半是六打。

+0

是否有人实际上低估了这一点? – MusiGenesis 2009-09-30 15:38:06

+0

只是一个注释 - 参数需要在DbCommand上清除,回答更新,休息看起来不错,谢谢 – 2009-09-30 16:24:25

+0

@JL:我不知道你的样本中使用了什么类 - 我通常使用'System.Data。 SqlClient'命名空间。我从来没有见过任何“AddInParameter”方法。 – MusiGenesis 2009-09-30 17:10:09

3

如果你在SQL Server 2008上(很多还没有......),你可以使用表变量!退房:https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=168

这样,您可以在1个命令中完成整套文件,节省了一大堆时间。

或者,您可以将所有文件名与分隔符连接起来,然后将它们拆分到SQL存储过程中。

优点是您最大限度地减少了对数据库的交易,不利的一点是编程不如直截了当。

+0

好吧,这真是太棒了。我有几个应用程序可以立即从中受益。谢谢! – NotMe 2009-09-30 16:24:51

0
db.AddInParameter(cmd, "xxx", DbType.Int32); 
db.AddInParameter(cmd, "xxx", DbType.Int32); 
db.AddInParameter(cmd, "xxx", DbType.Int32); 
int id = 0; 
db.AddOutParameter(cmd, "ccc", DbType.Int32, id); 

foreach (xxx item in xxxx) 
{ 
    db.SetParameterValue(cmd, "xxx", item.InvestmentProgramId); 
    db.SetParameterValue(cmd, "xxx", item.CompanyId); 
    db.ExecuteNonQuery(cmd); 
    id = (int)db.GetParameterValue(cmd, "ccc"); 
    item.Id = id; 
}