2010-12-30 17 views
0

Ich habe einen Code, der Daten aus Excel in SQLServer-Tabelle lädt. Es funktioniert gut, aber ich muss wissen, ob es einen besten Weg gibt, es zu tun, ich meine den Prozess schneller. Das liegt daran, dass ich in der Excel-Datei in der Regel etwa 7000 Zeilen habe und das Laden der Zeit zu lang ist (natürlich lade ich Zeile für Zeile).MVC Daten von Excel zu SQLServer laden

Hier ist der Code für Ihre Analyse.

Dim varExcel As Object = CreateObject("Excel.Application") 
Dim varBook As Object = varExcel.Workbooks.Open(varFileName, True, True, , "") 
Dim varSheet As Object = varExcel.Worksheets(1) 

Dim varArray As Object = varSheet.Range("A1:A65000").Value 
varCount = 1 
For vari As Integer = 2 To varArray.GetUpperBound(0) 
    If Not String.IsNullOrEmpty(varArray(vari, 1)) Then 
    varCount = varCount + 1 
    Else 
    Exit For 
    End If 
Next 

Try 
    varArray = Nothing 
    varArray = varSheet.Range("A1:L" & varCount).Value 
    For vari As Integer = 2 To varArray.GetUpperBound(0) 
    varCount = vari 

    Dim varSec = funGetSec("mytable") 
    Dim varTemp As New TEMPORAL 
    varTemp.ID_TEMPORAL = varSec.NUMERO_SECUENCIAL 
    If Not varArray(vari, 1) Is Nothing Then varTemp.CEDSOC = varArray(vari, 1).ToString.Trim.ToUpper 
    If Not varMatrizDatos(vari, 2) Is Nothing Then varTemp.DFCOPR = varArray(vari,2).ToString.Trim.ToUpper 
    If Not varArray(vari, 3) Is Nothing Then varTemp.NOMSOC = varArray(vari, 3).ToString.Trim.ToUpper 
    If Not varArray(vari, 4) Is Nothing Then varTemp.DF_FCR = varArray(vari, 4).ToString.Trim.ToUpper 

    If Not varArray(vari, 5) Is Nothing Then If IsNumeric(varArray(vari, 5)) Then varTemp.DFTOVA = CDec(varArray(vari, 5)) 
    If NotvarArray(vari, 6) Is Nothing Then If IsNumeric(varArray(vari, 6)) Then varTemp.DFINTE = CDec(varArray(vari, 6)) 
    If Not varArray(vari, 7) Is Nothing Then If IsNumeric(varArray(vari, 7)) Then varTemp.K_FALTANTE0 = CDec(varArray(vari, 7)) 

    If Not varArray(vari, 8) Is Nothing Then If IsNumeric(varArray(vari, 8)) Then varTemp.CARDIA = CLng(varArray(vari, 8)) 
    If Not varArray(vari, 9) Is Nothing Then If IsNumeric(varArray(vari, 9)) Then varTemp.DFNUVA = CLng(varArray(vari, 9)) 
    If Not varArray(vari, 10) Is Nothing Then If IsNumeric(varArray(vari, 10)) Then varTemp.BFBECD = CLng(varArray(vari, 10)) 

    If Not varArray(vari, 11) Is Nothing Then varTemp.BFBPTX = varArray(vari, 11).ToString.Trim.ToUpper 
    If Not varArray(vari, 12) Is Nothing Then varTemp.A0BFTX = varArray(vari, 12).ToString.Trim.ToUpper 
    varTemp.BFA0CD = CLng(66) 
    varTemp.FECHA = CDate(Now.Date) 

    varEntidades.AddToTEMPORALSet(varTemp) 
    varEntidades.SaveChanges() 
    Next 

    varExcel.DisplayAlerts = False 
    varBook.Close(SaveChanges:=False) 
    varExcel.Quit() 
    varSheet = Nothing 
    varBook = Nothing 
    varExcel = Nothing 

    ' Exec Stored Procedure ' 

    Dim varResp As Long 

    Dim varABC As ABC = GetABC(parIDABC) 
    If Not varEntidades.spABC(parIDABC, varResp, varErrMensaje) Then 
    If Not varEntidades.spErrorABC(varErrMensaje) Then Throw New ArgumentException(varErrMensaje) 
    Throw New ArgumentException(varErrMensaje) 
    End If 

    Catch ex As Exception 
    varExcel.DisplayAlerts = False 
    varBook.Close(SaveChanges:=False) 
    varExcel.Quit() 
    varSheet = Nothing 
    varBook = Nothing 
    varExcel = Nothing 

    If Not varEntidades.spErrorABC(varErrMensaje) Then Throw New ArgumentException(varErrMensaje) 
    Throw New ArgumentException(ex.Message & " - Review Excel file - row number: " & varCount) 
    End Try 

    Return Something 

Ich hoffe, dass dies jemand anderen auch helfen.

Antwort

0

Sie entweder eine Excel oder SQL Server Referenz in-line auf einem Excel oder SQL Server-Verbindung nutzen können, zum Beispiel:

SELECT Col1, Col2, Col3 INTO 
[ODBC;Description=TEST;DRIVER=SQL Server;SERVER=Some\Instance;Trusted_Connection=Yes;DATABASE=test].TableZ FROM [Sheet1$]" 

Sie werden wahrscheinlich Ad-hoc-Abfragen auf SQL Server ermöglichen müssen, und wenn Sie verwenden ACE kann es some other considerations sein:

SELECT * INTO newx 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;HDR=YES;IMEX=1;Database=c:\docs\testdata.xls', 
    'SELECT * FROM [Sheet2$]'); 
+0

Ich werde es versuchen. Grüße. –

0

I cretaed mit SSIS ein Paket. Dies ist eine gute Lösungen und von Code I Parameter sendet Paket (Package.dtsx)

Die Groß Last erstaunlich reduziert :)

Verwandte Themen