2009-05-04 12 views
5

sto usando SQL 2008 Express Edition e sto cercando di fare una fila multipla inserire attraverso la mia applicazione C#.multipla Inserisci riga -> dichiarazione supera il numero massimo consentito di 1.000 fila Valori

Ho intorno a 100.000 record che deve essere inserito.

Va bene tutto va bene per i primi 1000 record quindi che sto ricevendo l'errore: "Il numero di espressioni valore di riga nella INSERT supera il numero massimo consentito di 1000 valori di riga"

ho guardato il mio tipo di dati di colonna -> int, in modo che non dovrebbe essere il problema. Ho controllato il mio codice e sto inserendo passi di 500 record.

Così ho cercato con Google ma non ho trovato niente di utile. Qualcuno può spiegare perché ottengo questo errore e se possibile come risolverlo.

+1

Puoi mostrarci parte del tuo codice? Questo messaggio di errore dovrebbe verificarsi solo se stai usando valori di riga, es. INSERISCI IN ... VALORI (...), (...), (...) <- 3 righe qui, e il limite è 1000. –

+0

hai bisogno di un ritardo tra le query di inserimento? – nlucaroni

+0

stai cercando di inserire una riga alla volta? prova a chiamare una stored procedure per fare tutti gli inserimenti contemporaneamente (se non lo stai già facendo) – northpole

risposta

5

È possibile utilizzare la classe SQLBulkCopy. Che supporta il batching, le transazioni ed è più efficiente delle istruzioni di inserimento standard.

+0

"Se le tabelle di origine e destinazione si trovano nella stessa istanza di SQL Server, è più facile e veloce usare un INSERIMENTO Transact-SQL ... SELEZIONA la dichiarazione per copiare i dati. " Fonte: http://msdn.microsoft.com/en-us/library/s4s223c6.aspx Solo per la cronaca. :) – ShdNx

0

Ecco come il mio codice gestisce multi inserto

var count = "SELECT COUNT(*) as rowcount FROM table_mysql GROUP BY id"; 

var countReader = Retrieve(count); 
var countRows = 0; 
try 
{ 
    while (countReader.Read()) 
    { 
     countRows += int.Parse(countReader.GetValue(0).ToString()); 
    } 
} 
catch (Exception ex) 
{ 
    Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message); 
} 
finally 
{ 
    if (countReader != null) { countReader.Close(); _crud.close_conn(); } 
} 

for (var a = 0; a < countRows;) 
{ 
    var sql = "SELECT id, traffic_id, dow, uu, imps, impsuu, otsw, otsm FROM table_mysql LIMIT " + a + ", " + (a + 500) + ""; 

    var reader = Retrieve(sql); 
    try 
    { 
     var builder = new StringBuilder(); 
     builder.Append(
      "SET IDENTITY_INSERT table_mssql ON;INSERT INTO table_mssql(id, traffic_id, dow, uu, imps, impsuu, otsw, otsm) VALUES "); 
     while (reader.Read()) 
     { 
      Application.DoEvents(); 
      try 
      { 
       builder.Append("(" + reader.GetValue(0) + ", " + reader.GetValue(1) + ", " + 
           reader.GetValue(2) + 
           ", " + reader.GetValue(3) + ", " + reader.GetValue(4) + 
           ", " + reader.GetValue(5) + ", " + reader.GetValue(6) + ", " + 
           reader.GetValue(7) + 
           "), "); 

      } 
      catch (Exception ex) 
      { 
       Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message); 
      } 
     } 

     var sqlDB = builder.ToString(0, builder.Length - 2); 

     sqlDB += ";SET IDENTITY_INSERT table_mssql OFF;"; 
     if (!InsertDB(sqlDB)) 
     { 
      Log.LogMessageToFile("Import.cs -> table_mssql: No insert happend!"); 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.LogMessageToFile("Import.cs -> table_mssql: " + ex.StackTrace + " /n" + ex.Message); 
     return false; 
    } 
    finally 
    { 
     if (reader != null) 
     { 
      reader.Close(); 
      _crud.close_conn(); 
     } 
    } 
    a = a + 500; 
} 

Vado a controllare la SqlBulkCopy. Forse è una soluzione migliore.

+0

Come lassevk indicato sopra, il limite su quel metodo è di 1000 righe. Si consiglia di esaminare la sintassi INSERT INTO tblName SELECT ... FROM otherTbl, poiché ciò che si sta facendo sembra provenire direttamente da un'altra istruzione SQL. Non ci sono limiti di righe su questo. – Eric

0

si può prendere che tutto riduce a questo:

var sql = "SET IDENTITY_INSERT table_mssql ON;" 
     + "INSERT INTO table_mssql" 
     +  "(id, traffic_id, dow, uu, imps, impsuu, otsw, otsm)" 
     + " SELECT id, traffic_id, dow, uu, imps, impsuu, otsw, otsm " 
     + " FROM table_mysql;" 
     + "SET IDENTITY_INSERT table_mssql OFF;"; 

if (!InsertDB(sqlDB)) 
{ 
    Log.LogMessageToFile("Import.cs -> table_mssql: No insert happend!"); 
} 

anche: si dovrebbe sapere che SQL Server non supporta LIMIT parola chiave di MySql. Utilizza invece TOP o ROW_NUMBER.

+0

È applicabile anche quando la prima query accede a un database mysql per recuperare i dati? Ho bisogno di trasferire i dati dal database mysql al mio server SQL locale 2008 Express. – Gerbrand

+0

Ah, ho ricevuto la convenzione di denominazione ora. Il frammento di codice e il testo della domanda fanno sembrare che tutto stia attraversando la stessa connessione, i nomi o nessun nome. In tal caso, dovrai tenere brevemente i dati sul tuo cliente e BULK_INSERT è di gran lunga l'opzione più veloce. –

+0

Oppure, con molta fortuna potresti essere in grado di connettere il mysql db al server sql come una datasource ole db: http://developer.infi.nl/index.php?ID=6&article=6 –

Problemi correlati