使用Excel作为ODBC数据库

11

我想知道如何在Excel中创建数据库表格,以便可以与ODBC一起使用

我想使用ODBC,有两个选择,Microsoft Access或Excel,

如您所知,为了将某个MS Access文件或Excel文件指定为ODBC源,您需要按照以下步骤操作:

管理工具 - >数据源(ODBC)- >选择用户DSN - >从列表中选择“Excel文件”或“MS Access数据库”- >点击“配置”- >最后选择文件(MS Access或Excel)作为ODBC源

好的,对于MS Access来说这很好用,我可以连接到文件并查看所有已创建的表格。

但是当涉及到Excel时,尽管我可以连接到文件,但我无法看到已经在内部创建的表格

我只是在“插入”选项卡中使用了“表格”,添加了一些标题作为列名,并给表格命名一个有意义的名称。是这样做的方式吗?


6
作为个人建议,我建议您不要将Excel用作数据存储库。 Excel文件并不适用于以类似数据库的结构存储数据;例如,您无法限制每列中的用户数据类型输入(可以在任何单元格中自由存储字符串、数字和日期)。其它缺点包括文件大小和需要加载整个文件到RAM才能使用。对于小型数据库,Access是一个更好的选择,并且可以作为ODBC数据源使用而没有问题。 - Barranka
1
感谢回复。目前它在RAM中占用的大小不是主要问题,主要问题是速度。有许多条目被加载到ODBC文件中,将它们全部加载到Access文件中需要大约20-25分钟,在Excel中只需要几秒钟。 - mangusta
1
我建议你考虑使用更强大的关系型数据库管理系统(如mysql、postgress或其他)。相信我,用Excel(作为类似数据库的程序)来管理数据真的很麻烦! - Barranka
Excel不是数据库,而你所描述的“表格”也不是数据库表。你的C#应用程序同样可以从Access中读取数据,因为它被设计用于存储数据并允许检索该数据。 - Ken White
@nunzabar,这个链接是关于如何处理已经被设计为ODBC源的Excel文件。我需要了解设计这样一个Excel源的具体方法。 - mangusta
显示剩余4条评论
3个回答

15

在Excel工作簿中,有几种引用“表格”数据的方法:

  • 整个工作表。
  • 工作表上已命名的单元格范围。
  • 工作表上未命名的单元格范围。

它们在Microsoft知识库文章257819的“使用代码选择Excel数据”部分中有详细解释。

最简单的方法是将数据保留在单独的工作表上,在第一行中放置列名(从单元格A1开始),然后让实际数据从第2行开始,就像这样:

Excel

为了测试,我创建了一个名为“odbcFromExcel”的用户DSN,指向该工作簿......

ODBC

......然后运行以下VBScript测试连接:

Option Explicit
Dim con, rst, rowCount
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT * FROM [Sheet1$]", con
rowCount = 0
Do While Not rst.EOF
    rowCount = rowCount + 1
    If rowCount = 1 Then
        Wscript.Echo "Data row 1, rst(""LastName"").Value=""" &  rst("LastName").Value & """"
    End If
    rst.MoveNext
Loop
Wscript.Echo rowCount & " data rows found."
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing

结果如下:

C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
10 data rows found.

希望这能解决你的Excel连接问题。

最后我必须说,如果你在Excel中做某些需要“几秒钟”才能完成的事情,但在Access中需要“大约20-25分钟”,那么我强烈怀疑你正在非常低效地使用Access,但这是另一个问题的话题(如果你想追究的话)。

编辑

如果您想将数据插入Excel工作簿,则可能会遇到问题,因为Excel ODBC连接的默认设置是“只读”,所以您需要单击“选项>>”按钮并清除该复选框:

readonly

完成后,以下代码...

Option Explicit
Dim con
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
con.Execute "INSERT INTO [Sheet1$] (ID, LastName, FirstName) VALUES (11, 'Dumpty', 'Humpty')"
con.Close
Set con = Nothing
Wscript.Echo "Done."

......确实会在Excel表格中追加提供的数据并新增一行。

然而,这仍然没有解决当您将“sniffer”应用程序指向Excel ODBC DSN时,无法选择“Tables”的问题。

您可以尝试创建一个带有第一行列标题的Excel工作表,然后选择那些整个列并创建Excel“定义名称”。然后,看看您的“sniffer”应用程序是否将其识别为可选择的“表”名称。

顺便说一下,我在我的Excel工作簿中将名称 myTable 定义为= Sheet1! $ A:$ C ,然后当我使用 SELECT * FROM [myTable] 时,我的原始代码有点能够工作:

C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
1048576 data rows found.

你可以看到,它正确地检索了第一个“记录”,但是接着它没有识别到有效数据的结尾,并继续读取表格中的大约一百万行。

我非常怀疑我还会不会再花更多精力在这方面,因为我同意其他评论,使用Excel作为“ODBC数据库”确实不是一个很好的主意。

我强烈建议你尝试找出为什么你之前尝试使用Access如此不令人满意。就像我之前说的那样,听起来好像有些东西与Access交互时做得非常糟糕


感谢您的回复,不过您的示例假设“表”已经包含了一些条目,即不为空,并且VB程序只是读取这些条目。我在上面的评论中提到的嗅探器应该通过ODBC导出数据,要么导出到Excel文件中,要么导出到MS Access文件中(空文件,但应该至少包含一个表),并建议输入数据库文件名,在我们输入文件名并按下“连接”后,文件中的表格会列在单独的框中。问题是当我输入Excel文件名时,列表中没有表格显示。 - mangusta

1
最近我遇到了一个类似的数据问题。我成功地解决了这个问题,方法是选择数据范围A1:XY12345,然后使用“定义名称”工具来命名该范围。当您通过ODBC连接到Excel工作簿时,此命名范围将显示为“表格”,而实际上按照Excel定义的表格范围则不会显示为“表格”。

-1

您只需要从 Excel 文件的第一行选择所需的列,然后在公式栏左侧的编辑框中为其命名。当然,您也需要为文件的每一列命名!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接