MS Access OLEDBConnection 到 Excel 问题
Posted
技术标签:
【中文标题】MS Access OLEDBConnection 到 Excel 问题【英文标题】:MS Access OLEDBConnection to Excel Issue 【发布时间】:2017-08-31 10:56:39 【问题描述】:所以我现在已经搜索了大约 2 天,虽然我可以找到很多关于如何将 Excel 工作表放入 gridView 的示例,但它们都不适合我。
这是目标:我需要读取一个 Excel 文件,其中有一个工作表,并且应该始终是其中一个工作表,进入 ASP.NET 网站中的 GridView,并且我在代码隐藏文件中使用 VB.Net。
我尝试了一种方法尝试使用表名的架构(获取工作表名称),但无论工作表名称是什么,它总是以“Algrip”返回,其中没有任何具有该名称的工作表我测试的工作簿。
所以我放弃了它,现在正在使用以下代码:(这确实完成了工作,有点)
'Setup Variables
Dim xlConnStr As String = ""
Dim FileName As String = Path.GetFileName(FileUpload1.PostedFile.FileName)
Dim Extension As String = Path.GetExtension(FileUpload1.PostedFile.FileName)
Dim FolderPath As String = ConfigurationManager.AppSettings("FolderPath")
Dim sheetname As String = InputBox("Enter Sheetname: ", "Excel Worksheet name")
'Adjust Sheetname
sheetname = sheetname + "$"
'Set Connection based on Excel File Extension
Select Case Extension
Case ".xls"
'Excel 97-03
xlConnStr = ConfigurationManager.ConnectionStrings("Excel03ConString").ConnectionString
Case ".xlsx"
'Excel 07-Forward
xlConnStr = ConfigurationManager.ConnectionStrings("Excel07ConString").ConnectionString
End Select
xlConnStr = String.Format(xlConnStr, FolderPath & FileName)
Dim connXL As New OleDb.OleDbConnection(xlConnStr)
pnlFileInfo.Visible = True
connXL.Open()
Using xlCmd As New OleDbCommand
xlCmd.CommandType = CommandType.Text
xlCmd.CommandText = ("Select * From [" + sheetname + "]")
xlCmd.Connection = connXL
Using xlDS As New DataSet()
Using xlDA As New OleDbDataAdapter(xlCmd)
xlDA.Fill(xlDS)
gvExcelFile.DataSource = xlDS
gvExcelFile.DataBind()
End Using
End Using
End Using
connXL.Close()
现在我的问题是这样的;在下一行:
xlCmd.CommandText = ("Select * From [" + sheetname + "]")
如果我没有左右括号,因为某些工作表名称中有空格,我会收到查询错误。但是,如果我添加括号,它会提示我两次输入工作表名称。对于我的生活,我无法弄清楚为什么。
我在上面列出的行中设置了一个断点,并检查了变量 sheetname 的值,它是正确的,但由于某种原因,我再次收到提示。
有没有人知道它为什么这样做?我错过了什么?理想情况下,我想要的是能够读取工作表名称并将其输入到带有 select 语句的行,这样就不需要用户操作,但我所得到的只是相同的错误工作表名称“Algrip”。
Excel 工作表是一个 xls 文件,但如果有帮助,可以另存为 xlsx。
如果我可以让它动态读取工作表名称,我愿意重新编写代码。
感谢您的帮助!!
【问题讨论】:
【参考方案1】:尝试将整个命令存储在一个变量中,然后使用 OleDbCommand
构造函数将其分配给 xlCmd.CommandText
Dim sheetname As String = InputBox("Enter Sheetname: ", "Excel Worksheet name")
sheetname = sheetname & "$"
Dim strQuery As String = "Select * From [" & sheetname & "]"
...
Using xlCmd As New OleDbCommand(strQuery ,connXL)
Using xlDS As New DataSet()
Using xlDA As New OleDbDataAdapter(xlCmd)
xlDA.Fill(xlDS)
gvExcelFile.DataSource = xlDS
gvExcelFile.DataBind()
End Using
End Using
End Using
connXL.Close()
【讨论】:
这就是我已经在做的事情。我提示输入工作表名称,然后将 $ 添加到答案中,然后将其作为变量。如果我添加括号 [ ] 然后它再次提示我,没有它们它说查询字符串是错误的。 我想说的是将命令存储在一个变量中,然后将其分配给 SQLCommand,我更新得更清楚了 我要试试这个,但要到明天我才能做到。我会相应地更新。 我改变了代码,现在它把查询放到一个字符串中。我现在有一行写着'qryStr = "Select * From [" + sheetname +"]" 我改变了命令.text 行看起来像这样 'xlCmd.CommandText = qryStr' 但它仍然提示我两次输入工作表名称,我不知道为什么。谁能解释它为什么这样做? @mbcharney 将字符串传递给构造函数,如我的答案所示以上是关于MS Access OLEDBConnection 到 Excel 问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Oledb 对象插入 ms-access 查询获取无效查询异常
将 OleDbConnection 刷新到 Access DB - 最佳实践