2009-09-30 24 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; 
}