2010-12-30 4 views
0

Excel에서 SQLServer 테이블로 데이터를로드하는 코드가 있습니다. 그것은 잘 작동하지만, 그것을 할 수있는 가장 좋은 방법이 있는지, 나는 그 과정을 더 빨리한다는 것을 의미 할 필요가있다. Excel 파일에서는 대개 약 7000 개의 행이 있고 시간로드가 너무 길기 때문에 (행별로로드하는 중입니다).MVC Excel에서 SQLServer로 데이터로드

다음은 분석 할 코드입니다.

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 

나는 다른 사람에게도 도움이되기를 바랍니다.

답변

0
당신은 예를 들어, Excel 또는 SQL 서버 연결에 인라인 (in-line) 엑셀 또는 SQL 서버 참조를 사용할 수 있습니다

: 당신은 아마 SQL Server에서하고있는 경우 임시 쿼리를 활성화해야합니다

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

ACE를 사용하는 some other considerations이있을 수 있습니다 :

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

나는 노력하겠습니다

(Package.dtsx를) 패키지 매개 변수를 보낼 수 있습니다. 문안 인사. –

0

나는 SSIS를 사용하여 패키지를 cretaed. 이것은 좋은 솔루션이며 코드에서 나는 대량로드는 놀라 울 정도로 감소 :