![](/img/trans.png)
[英]Connect to SQL Server 2012 Database with C# (Visual Studio 2012)
[英]Bulk insert into the SQL Server 2012 database - C#
我在列表中有大約一百萬條記錄。 在列表中的foreach中,我查詢數據庫以獲取基於id的修改日期。 一旦獲得它,就可以測試是否可以插入或更新它..但是有什么方法可以批量(一次或成批)插入或更新。
foreach (No_kemi no_list in newforSQL)
{
DateTime eModifiedDate = no_list.ModifiedDate.Value;
string Id = no_list.ID.ToString();
String selectQuery = "SELECT ModifiedDate FROM NO_table WHERE ID = '" + Id + "'";
DateTime? dbmoddate = null;
using (SqlCommand selectCommand = new SqlCommand(selectQuery, connection))
{
// Use the above SqlCommand object to create a SqlDataReader object.
using (SqlDataReader rdr = selectCommand.ExecuteReader())
{
while (rdr.Read())
{
dbmoddate = (DateTime)rdr["ModifiedDate"];
}
}
}
string eType = null;
string SubGUID = null;
string trimSubKey = no_list.SubscriberKey;
try
{
if ((trimSubKey.Length > 3) && (trimSubKey != ""))
{
if (trimSubKey.Contains(","))
{
string[] values = trimSubKey.Split(',');
SubGUID = values[0];
eType = values[1];
}
else
{
SubGUID = trimSubKey;
eType = "";
}
}
else
{
SubGUID = "";
eType = "";
}
}
catch (Exception ex)
{
logger.Error("Error : " + ex.Message );
}
if (dbmoddate == null)
{
DateTime no_listinsetdate = DateTime.Now;
String insertQuery = "INSERT INTO NO_table (CreatedDate, ModifiedDate, ID, eType, SubGUID, DbDate) VALUES (@CreatedDate, @ModifiedDate, @ID, @eType, @SubGUID, @DbDate,)";
using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection))
{
insertCommand.Parameters.AddWithValue("@CreatedDate", no_list.CreatedDate);
insertCommand.Parameters.AddWithValue("@ModifiedDate", no_list.ModifiedDate);
insertCommand.Parameters.AddWithValue("@ID", no_list.ID);
insertCommand.Parameters.AddWithValue("@eType", eType);
insertCommand.Parameters.AddWithValue("@SubGUID", SubGUID);
insertCommand.Parameters.AddWithValue("@DbDate", no_listinsetdate);
insertCommand.ExecuteNonQuery(); // execute the query
}
}
else if (eModifiedDate > dbmoddate)
{
DateTime no_listinsetdate = DateTime.Now;
String updateQuery = "UPDATE NO_table SET CreatedDate = @CreatedDate, ModifiedDate = @ModifiedDate, ID = @ID, eType = @eType, SubGUID = @SubGUID, DbDate = @DbDate WHERE ID = '" + Id + "'";
using (SqlCommand updateCommand = new SqlCommand(updateQuery, connection))
{
updateCommand.Parameters.AddWithValue("@CreatedDate", no_list.CreatedDate);
updateCommand.Parameters.AddWithValue("@ModifiedDate", no_list.ModifiedDate);
updateCommand.Parameters.AddWithValue("@ID", no_list.ID);
updateCommand.Parameters.AddWithValue("@eType", eType);
updateCommand.Parameters.AddWithValue("@SubGUID", SubGUID);
updateCommand.Parameters.AddWithValue("@DbDate", no_listinsetdate);
updateCommand.ExecuteNonQuery(); // execute the query
}
}
}
任何加快處理速度的方法...都需要花費大量時間才能完成操作...或者有些時候我會收到超時錯誤...
謝謝
這是在此處實際具有編碼解決方案的廣泛方法,但是您應該能夠根據一般建議自己創建一個:
如果您編寫了執行此操作的SQL過程,則可能會節省很多網絡往返時間。 進一步的優化將導致此SQL過程獲取一批記錄而不是單個記錄,因此您可以例如發送1000條記錄,該過程將遍歷它們,並且每執行一次查詢並生成更新/插入。 這意味着結果不必在網絡上來回移動,從而減少了流量並縮短了運行時間。
也許可以將您的操作假定為單個MERGE命令,而不是查詢和更新/插入。 這取決於您的表結構,數據和意圖。
Google的條款: stored procedure
, table type
, MERGE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.