【问题标题】:MVC Load data from Excel to SQLServerMVC 将数据从 Excel 加载到 SQLServer
【发布时间】:2011-04-07 22:55:21
【问题描述】:

我有一个将数据从 Excel 加载到 SQLServer 表中的代码。它工作正常,但我需要知道是否有最好的方法,我的意思是更快地完成这个过程。 这是因为在 Excel 文件中我通常有大约 7000 行并且加载时间太长(当然我是逐行加载)。

这是您分析的代码。

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

我希望这对其他人也有帮助。

【问题讨论】:

    标签: excel model-view-controller


    【解决方案1】:

    您可以在 Excel 或 SQl Server 连接上使用内联 Excel 或 SQL Server 引用,例如:

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

    您可能需要在 SQL Server 上启用即席查询,如果您使用的是 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$]');
    

    【讨论】:

      【解决方案2】:

      我使用 SSIS 创建了一个包。这是一个很好的解决方案,我从代码中将参数发送到 Package (Package.dtsx)

      大容量负载惊人地减少了:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        相关资源
        最近更新 更多