FAQ |
Kalender |
2015-03-30, 13:29 | #1 | ||
|
|||
Mycket flitig postare
|
Hej,
Jag håller på att göra en bulk insert med ca 50,000 poster. Kodsnutten för insert ser ut på detta vis. Kod:
string strSql = "INSERT INTO wc_list (id, name, company, orgNo, address, postalCode, city, phoneNo, carrier, status, projectId) VALUES(id, @A, @B, @C, @D, @E, @F, @G, @H, @I, @J)"; string strConnectionString = ConfigurationManager.ConnectionStrings["MySQL"].ConnectionString; MySqlConnection sqlConn = new MySqlConnection(strConnectionString); MySqlCommand cmd = new MySqlCommand(strSql, sqlConn); sqlConn.Open(); foreach (DataRow r in dt.Rows) { cmd1 = sqlConn.CreateCommand(); cmd.CommandText = strSql; cmd.Parameters.AddWithValue("@A", r[0]); cmd.Parameters.AddWithValue("@B", r[1]); cmd.Parameters.AddWithValue("@C", r[2]); cmd.Parameters.AddWithValue("@D", r[3]); cmd.Parameters.AddWithValue("@E", r[4]); cmd.Parameters.AddWithValue("@F", r[5]); cmd.Parameters.AddWithValue("@G", r[6]); cmd.Parameters.AddWithValue("@H", r[7]); cmd.Parameters.AddWithValue("@I", "0"); cmd.Parameters.AddWithValue("@J", iProjectId); cmd.ExecuteNonQuery(); } sqlConn.Close(); Just nu gör jag så att jag klickar på "INSERT-knappen" och sedan trycker jag direkt på ESC. Då kan jag surfa runt på sidan medans inserten håller på. hur kan jag åstadkomma samma effekt programmatiskt? håller på att utveckla i c# .NET tacksam för svar. |
||
Svara med citat |
2015-03-30, 13:52 | #2 | |||
|
||||
Bara ett inlägg till!
|
Det beror på. En sätt är att lägga arbetet i en tråd och sedan hämta tillbaka status med SignlarR. Om det är Azure du utvecklar i så har du ju möjlighet att lägga dina arbeten i en kö som du sedan betar av med en worker-roll.
|
|||
Svara med citat |
2015-03-30, 17:10 | #3 | |||
|
||||
Mycket flitig postare
|
Kör alla inserts i en och samma query. Dvs INSERT INTO table (, , ,) VALUES (val1,val2), (val3, val4) etc.
Tror max ligger på 500 i en och samma query, detta går att ändra men annars kan du bara köra olika batchar om 500 åt gången. |
|||
Svara med citat |
2015-03-30, 17:30 | #4 | ||
|
|||
Nykomling
|
Som ovan säger, kör i batchar.
Istället för att köra 50.000 frågor mot databasen blir det bara 100 vilket inte bör ta många sekunder att köra. |
||
Svara med citat |
2015-03-30, 17:33 | #5 | |||
|
||||
Mycket flitig postare
|
Såg nu att det rörde sig om 50k poster. Ändra max_allowed_packet och sätt in 10.000 om gången, bör gå kvickt
|
|||
Svara med citat |
2015-03-30, 20:25 | #6 | ||
|
|||
Flitig postare
|
Jag hade använt mig av en insert med en select:
INSERT INTO users (username, password, firstname, lastname) SELECT username, salted_password, firstname, lastname FROM registered_users Gjort detta enkelt med över 600 tusen poster. Lycka till! |
||
Svara med citat |
2015-04-08, 12:50 | #7 | ||
|
|||
Mycket flitig postare
|
tack för alla som försökt hjälpa, testade alla dessa ovan, med det tog alltför långt tid att göra en insert... ca 60 sek... :S
Lyckades dock lösa problemet med denna kod, för er som är intresserade. Jag skapar en tillfällig csv fil och därefter gör jag en batch-insert från filen tilkl databasen. Kod:
string strConnectionString = ConfigurationManager.ConnectionStrings["MySQL"].ConnectionString; using (var conn = new MySqlConnection(strConnectionString)) { var bl = new MySqlBulkLoader(conn) { TableName = "wc_list", FieldTerminator = "|", LineTerminator = "\r\n", FileName = getCSVfile(), NumberOfLinesToSkip = 0, Columns = { "name", "company", "orgNo", "address", "postalCode", "city", "phoneNo", "carrier", "status", "projectId", "other" } }; var numberOfInsertedRows = bl.Load(); } |
||
Svara med citat |
Svara |
|
|