我需要將 Excel 報告資料匯出到公司資料庫中,但我的代碼只是讀取和插入而不檢查重復項,我嘗試了 AddOrUpdate() 但我無法使其作業。
關于如何瀏覽資料讀取器結果并過濾現有 ID 以便不再插入它們的任何想法?
DataView ImportarDatosSites(string filename)
{
string conexion = string.Format("Provider = Microsoft.ACE.OLEDB.12.0; Data Source={0}; Extended Properties= 'Excel 8.0;HDR=YES'" ,filename );
using (OleDbConnection connection = new OleDbConnection(conexion))
{
connection.Open();
OleDbCommand command = new OleDbCommand("SELECT * FROM [BaseSitiosTelemetria$]", connection);
OleDbDataAdapter adaptador = new OleDbDataAdapter { SelectCommand = command };
DataSet ds = new DataSet();
adaptador.Fill(ds);
DataTable dt = ds.Tables[0];
using (OleDbDataReader dr = command.ExecuteReader())
{
while (dr.Read())
{
var SiteID = dr[1];
var ID_AA_FB = dr[2];
var Address = dr[3];
var CreateDate = dr[5];
var Tipo = dr[7];
var Measures = dr[9];
var Latitud = dr[10];
var Longitud = dr[11];
SitesMtto s = new SitesMtto();
s.siteIDDatagate = SiteID.ToString();
s.idFieldBeat = ID_AA_FB.ToString();
s.addressDatagate = Address.ToString();
s.createDateDatagate = Convert.ToDateTime(CreateDate);
s.typeDevice = Tipo.ToString();
s.MeasuresDevice = Measures.ToString();
if (Latitud.ToString() != "" && Longitud.ToString() != "")
{
s.latitudeSite = Convert.ToDouble(Latitud);
s.longitudeSite = Convert.ToDouble(Longitud);
}
db.SitesMtto.Attach(s);
db.SitesMtto.Add(s);
db.SaveChanges();
}
connection.Close();
return ds.Tables[0].DefaultView;
}
}
}
uj5u.com熱心網友回復:
一種方法是設定 try catch 塊,然后使用 tsql 設定主鍵索引。當發生約束錯誤時,它將拋出一個您可以捕獲的資料庫錯誤。
uj5u.com熱心網友回復:
當涉及到來自外部來源的匯入程序時,我建議使用暫存表方法。將 Excel/檔案中的原始資料轉儲到干凈的暫存表中。(TRUNCATE TABLE首先針對暫存表執行腳本)從那里您可以通過對真實資料表的連接執行查詢,以檢測和忽略/更新可能的重復項,為尚未具有相應值的任何暫存行插入真實行.
根據行數,我建議批量讀取和插入。您也不需要同時呼叫Attach()and Add(),只需將專案添加到 DbSet 就足夠了:
步驟 1:使用 a 重繪 臨時表 db.Database.ExecuteSqlCommand("TRUNCATE TABLE stagingSitesMtto");
步驟 2:打開資料讀取器并將行批量插入到 stagingSitesMtto 表中。這假設 Excel/檔案源中不包含重復的行。
第 3 步:查詢您的 stagingSitesMtto 以在 PK/唯一鍵上加入您的 SitesMtto 表。這可以說有點復雜,因為Join通常用于執行 INNER JOIN,但我們想要一個 OUTER JOIN,因為我們會對沒有相應站點的 StagingSites 感興趣。
var query = db.StagingSitesMtto
.GroupJoin(db.SitesMto,
staging => staging.SiteID,
site => site.siteIDDatagate,
(staging, site) => new
{
Staging = staging,
Site = site
})
.SelectMany(group => group.Site.DefaultIfEmpty(),
(group, site) => new
{
Staging = group.Staging,
IsNew = site == null
})
.Where(x => x.IsNew)
.Select(x => x.Staging)
.ToList(); // Or run in a loop with Skip and Take
這將尋找所有沒有對應實際行的暫存行。從那里您可以創建新的 SitesMtto 物體并從暫存行復制資料,將其添加到 db.Sites,然后保存。如果您想更新行以及插入,那么您可以回傳 Staging 和 Site 以及 IsNew 標志,并使用 .Staging 中的值更新 .Site。啟用更改跟蹤后,SaveShanges如果值發生更改,現有站點將更新。
免責宣告:上面的代碼沒有經過測驗,只是從記憶體中撰寫并參考了外連接方法。請參閱:如何在 Lambda LINQ 運算式中進行 LEFT JOIN
希望這能給您一些處理進口的考慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/346738.html
