Asp.net 帮助我查找此excel导入代码中的漏洞

Asp.net 帮助我查找此excel导入代码中的漏洞,asp.net,excel,Asp.net,Excel,下面的方法当然有效,但在一定数量的上传之后,这并不是恒定不变的,我的客户端会出现可怕的错误:System.Data.OleDb.OleDbException:Unspecified error 步骤: 客户端通过文件上载控件上载excel文件 文件将保存到文件系统中 文件通过oledb提供程序打开并读入数据集 我唯一的猜测是提供者不知何故没有释放资源 暂时清除此问题的唯一方法是重置IIS。出于这个原因,我倾向于认为提供商可能会被此服务器上的其他网站锁定。我们确实为一个客户托管了一个站点,但我们没

下面的方法当然有效,但在一定数量的上传之后,这并不是恒定不变的,我的客户端会出现可怕的错误:System.Data.OleDb.OleDbException:Unspecified error

步骤:

客户端通过文件上载控件上载excel文件 文件将保存到文件系统中 文件通过oledb提供程序打开并读入数据集 我唯一的猜测是提供者不知何故没有释放资源

暂时清除此问题的唯一方法是重置IIS。出于这个原因,我倾向于认为提供商可能会被此服务器上的其他网站锁定。我们确实为一个客户托管了一个站点,但我们没有构建该站点,该站点利用了该提供商,因此可能在客户端存在问题。有人能对此发表评论吗

请看看下面的方法,帮我解决这个问题

Public Shared Function GetExcelData(ByVal excelFile As String, ByVal sheetNumber As Integer) As DataSet

    Dim connString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", excelFile)
    Dim excelDataSet As New DataSet()

    Using conn As New OleDbConnection(connString)
        conn.Open()
        Using dt As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)

            Dim excelSheets(dt.Rows.Count) As String
            Dim i As Integer = 0
            For Each row As DataRow In dt.Rows
                excelSheets(i) = row("TABLE_NAME").ToString
                i += 1
                If i = sheetNumber Then
                    Exit For
                End If
            Next

            Using excelCommand As New OleDbCommand("Select * from [" & excelSheets(sheetNumber - 1) & "]", conn)
                Using excelAdapter As OleDbDataAdapter = New OleDbDataAdapter(excelCommand)
                    excelAdapter.Fill(excelDataSet)
                End Using
            End Using

        End Using
        conn.Close()
    End Using

    Return excelDataSet

End Function

我不知道是什么导致了您的错误,但我知道,根据您显示的代码,在数据表中的所有工作表记录中循环没有意义。此外,您可以使用语句进行分组以避免深度嵌套,.Fill方法具有重载,允许您指定表的名称,甚至直接填充表,而不是使用整个数据集。这两种方法中的任何一种似乎都比只返回带有单个未命名表的数据集要好

Dim sheetName As String = dt.Rows(sheetNumber)("TABLE_NAME")

Using excelCommand As New OleDbCommand( _
   String.Format("Select * from [{0}]", sheetName), conn), _
  excelAdapter As OleDbDataAdapter = New OleDbDataAdapter(excelCommand)

    excelAdapter.Fill(excelDataSet, sheetName)

End Using

至于您的具体问题,我最好的猜测是,文件名中有一些无效字符导致连接字符串出现问题。

与我的连接字符串进行比较后:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelDataFile + ";Extended Properties=\"Excel 8.0;ImportMixedTypes=Text;HDR=YES;IMEX=1;\"

尽管我猜\不是必需的。

似乎没有使用oledb提供程序的真正解决方案

因此,我将让客户将他们的电子表格转换为CSV,在这种情况下,这是可能的,因为它是一个单页表格导入

然后,我在这里找到了一个很棒的CSV解析器:


相信我,米奇,这一次我已经用尽了谷歌。这不是这个网站的目的吗,分享经验,帮助他人解决问题?我知道我已经回答了很多这样的问题。好吧,对不起。当您查询Excel工作簿时,它是否打开?否,Excel文件将在另一个步骤中上载到服务器。我会在一秒钟内把这一部分包括在我的问题中。@Mitch:我知道TWA只是一个想法,一个在黑暗中拍摄的镜头…从今往后,一个评论:这里有一个疯狂的想法:代码总是在相同的凭据下运行吗?谢谢你的提示,这更简洁了。我相信这不会解决问题,但你永远不会知道!在这一点上,我愿意尝试任何事情。