鱼C论坛

 找回密码
 立即注册
查看: 1533|回复: 4

如何实现:用C语言以ADO方式读取Access数据库?

[复制链接]
发表于 2023-10-3 18:14:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼儿游游 于 2023-10-3 18:16 编辑

用 C / C++ 语言(不是VC),以ADO的方式读取Access数据库。有哪位鱼油帮忙解决?谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-3 18:15:54 | 显示全部楼层
可以使用以下步骤来用C语言以ADO方式读取Access数据库:

1. 安装 Microsoft ActiveX Data Objects (ADO) 库:在代码中使用 ADO 需要安装 Microsoft ActiveX Data Objects 库。可以从 Microsoft 官网下载并安装该库。

2. 初始化 COM 库:在使用 ADO 之前,需要初始化 COM 库。可以使用 CoInitialize 函数来完成此操作。

3. 创建 Connection 对象:使用 CoCreateInstance 函数创建 Connection 对象。需要指定 CLSID 和 IID 参数,以便正确创建对象。

4. 打开数据库连接:使用 Connection 对象的 Open 方法来打开数据库连接。需要指定数据源名称、用户名和密码等参数。

5. 创建 Recordset 对象:使用 CoCreateInstance 函数创建 Recordset 对象。需要指定 CLSID 和 IID 参数,以便正确创建对象。

6. 执行 SQL 查询:使用 Recordset 对象的 Open 方法来执行 SQL 查询。需要指定 SQL 查询语句和 Connection 对象。

7. 读取查询结果:使用 Recordset 对象的 MoveNext 和 Fields 属性来读取查询结果。可以使用 Fields 属性来访问每个字段的值。

8. 关闭连接和释放对象:使用 Connection 和 Recordset 对象的 Close 方法来关闭连接和释放对象。可以使用 CoUninitialize 函数来释放 COM 库。

下面是一个示例代码,用于以ADO方式读取Access数据库:
#include <windows.h>
#include <oledb.h>
#include <stdio.h>

int main()
{
    HRESULT hr;
    CoInitialize(NULL);

    // 创建 Connection 对象
    IDBInitialize* pConnection = NULL;
    hr = CoCreateInstance(CLSID_MSDASQL, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pConnection);
    if (FAILED(hr))
    {
        printf("Failed to create Connection object.\n");
        CoUninitialize();
        return 0;
    }

    // 打开数据库连接
    hr = pConnection->Initialize();
    if (FAILED(hr))
    {
        printf("Failed to open database connection.\n");
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    // 创建 Recordset 对象
    IDBCreateSession* pSession = NULL;
    hr = pConnection->QueryInterface(IID_IDBCreateSession, (void**)&pSession);
    if (FAILED(hr))
    {
        printf("Failed to create Session object.\n");
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    IDBCreateCommand* pCommand = NULL;
    hr = pSession->CreateSession(NULL, IID_IDBCreateCommand, (IUnknown**)&pCommand);
    if (FAILED(hr))
    {
        printf("Failed to create Command object.\n");
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    IDBCreateSession* pRecordset = NULL;
    hr = pCommand->CreateCommand(NULL, IID_IDBCreateSession, (IUnknown**)&pRecordset);
    if (FAILED(hr))
    {
        printf("Failed to create Recordset object.\n");
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    // 执行 SQL 查询
    WCHAR* pQuery = L"SELECT * FROM MyTable";
    IUnknown* pUnknown = NULL;
    hr = pRecordset->CreateSession(NULL, IID_IUnknown, (IUnknown**)&pUnknown);
    if (FAILED(hr))
    {
        printf("Failed to create Unknown object.\n");
        pRecordset->Release();
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    IDBCreateCommand* pQueryCommand = NULL;
    hr = pUnknown->QueryInterface(IID_IDBCreateCommand, (void**)&pQueryCommand);
    if (FAILED(hr))
    {
        printf("Failed to create Query Command object.\n");
        pUnknown->Release();
        pRecordset->Release();
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    ICommandText* pCommandText = NULL;
    hr = pQueryCommand->CreateCommand(NULL, IID_ICommandText, (IUnknown**)&pCommandText);
    if (FAILED(hr))
    {
        printf("Failed to create Command Text object.\n");
        pQueryCommand->Release();
        pUnknown->Release();
        pRecordset->Release();
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    BSTR bstrQuery = SysAllocString(pQuery);
    hr = pCommandText->SetCommandText(DBGUID_DEFAULT, bstrQuery);
    if (FAILED(hr))
    {
        printf("Failed to set Command Text.\n");
        SysFreeString(bstrQuery);
        pCommandText->Release();
        pQueryCommand->Release();
        pUnknown->Release();
        pRecordset->Release();
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    IUnknown* pRecordsetUnknown = NULL;
    hr = pCommandText->Execute(NULL, IID_IUnknown, NULL, NULL, (IUnknown**)&pRecordsetUnknown);
    if (FAILED(hr))
    {
        printf("Failed to execute SQL query.\n");
        pCommandText->Release();
        pQueryCommand->Release();
        pUnknown->Release();
        pRecordset->Release();
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    IRecordset* pRecordsetObject = NULL;
    hr = pRecordsetUnknown->QueryInterface(IID_IRecordset, (void**)&pRecordsetObject);
    if (FAILED(hr))
    {
        printf("Failed to create Recordset object.\n");
        pRecordsetUnknown->Release();
        pCommandText->Release();
        pQueryCommand->Release();
        pUnknown->Release();
        pRecordset->Release();
        pCommand->Release();
        pSession->Release();
        pConnection->Release();
        CoUninitialize();
        return 0;
    }

    // 读取查询结果
    while (!pRecordsetObject->adoEOF)
    {
        VARIANT var;
        VariantInit(&var);

        hr = pRecordsetObject->MoveNext();
        if (FAILED(hr))
        {
            printf("Failed to move to next record.\n");
            VariantClear(&var);
            pRecordsetObject->Release();
            pRecordsetUnknown->Release();
            pCommandText->Release();
            pQueryCommand->Release();
            pUnknown->Release();
            pRecordset->Release();
            pCommand->Release();
            pSession->Release();
            pConnection->Release();
            CoUninitialize();
            return 0;
        }

        hr = pRecordsetObject->get_Fields()->GetItem(L"MyField", &var);
        if (FAILED(hr))
        {
            printf("Failed to get field value.\n");
            VariantClear(&var);
            pRecordsetObject->Release();
            pRecordsetUnknown->Release();
            pCommandText->Release();
            pQueryCommand->Release();
            pUnknown->Release();
            pRecordset->Release();
            pCommand->Release();
            pSession->Release();
            pConnection->Release();
            CoUninitialize();
            return 0;
        }

        // 处理字段值
        printf("%s\n", var.bstrVal);

        VariantClear(&var);
    }

    // 关闭连接和释放对象
    pRecordsetObject->Release();
    pRecordsetUnknown->Release();
    pCommandText->Release();
    pQueryCommand->Release();
    pUnknown->Release();
    pRecordset->Release();
    pCommand->Release();
    pSession->Release();
    pConnection->Release();

    CoUninitialize();
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 18:16:29 | 显示全部楼层
要使用 C 语言以 ADO 方式读取 Access 数据库,你需要使用 COM 技术(Component Object Model)和 ADO 库。以下是一个简单的示例,展示了如何使用 C 语言和 ADO 连接到 Access 数据库并执行查询操作。

首先,确保你的系统已安装了 Microsoft Data Access Components(MDAC)。

1. 创建一个 C 语言项目

   在你喜欢的 C 语言开发环境中创建一个新项目。

2. 包含头文件和库

   在你的 C 代码文件中包含以下头文件:

   #include <stdio.h>
   #include <windows.h>
   #include <ole2.h>
   #include <oledb.h>
   #include <msdasc.h>
   

   并确保链接以下库:

   ole32.lib
   oledb.lib
   msdasc.lib
   

3. 编写代码

   下面是一个简单的示例,展示了如何使用 ADO 连接到 Access 数据库并执行查询操作:

   #include <stdio.h>
   #include <windows.h>
   #include <ole2.h>
   #include <oledb.h>
   #include <msdasc.h>

   int main() {
       HRESULT hr;
       IDBInitialize *pIDBInitialize = NULL;
       IDataInitialize *pIDataInitialize = NULL;
       IDBCreateSession *pIDBCreateSession = NULL;
       ICommandText *pICommandText = NULL;
       IRowset *pIRowset = NULL;
       HROW *pHRow = NULL;
       HROW hRow = NULL;
       DBROWCOUNT cRowsObtained = 0;

       // 初始化 COM 库
       CoInitialize(NULL);

       // 创建数据源对象
       hr = CoCreateInstance(&CLSID_MSDAINITIALIZE, NULL, CLSCTX_INPROC_SERVER, &IID_IDataInitialize, (void**)&pIDataInitialize);
       if (FAILED(hr)) {
           printf("Failed to create data source object.\
");
           goto cleanup;
       }

       // 创建连接字符串
       WCHAR wszConnectString[] = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\\\path\\\\to\\\\your\\\\database.mdb;";

       // 获取数据源接口
       hr = pIDataInitialize->lpVtbl->GetDataSource(pIDataInitialize, NULL, CLSCTX_INPROC_SERVER, wszConnectString, &IID_IDBInitialize, (IUnknown**)&pIDBInitialize);
       if (FAILED(hr)) {
           printf("Failed to get data source interface.\
");
           goto cleanup;
       }

       // 打开数据库连接
       hr = pIDBInitialize->lpVtbl->Initialize(pIDBInitialize);
       if (FAILED(hr)) {
           printf("Failed to open database connection.\
");
           goto cleanup;
       }

       // 创建会话
       hr = pIDBInitialize->lpVtbl->QueryInterface(pIDBInitialize, &IID_IDBCreateSession, (void**)&pIDBCreateSession);
       if (FAILED(hr)) {
           printf("Failed to create session.\
");
           goto cleanup;
       }

       // 创建命令对象
       hr = pIDBCreateSession->lpVtbl->CreateSession(pIDBCreateSession, NULL, &IID_ICommandText, (IUnknown**)&pICommandText);
       if (FAILED(hr)) {
           printf("Failed to create command object.\
");
           goto cleanup;
       }

       // 设置查询语句
       WCHAR wszCommandText[] = L"SELECT * FROM your_table_name;";
       hr = pICommandText->lpVtbl->SetCommandText(pICommandText, DBGUID_DBSQL, wszCommandText);
       if (FAILED(hr)) {
           printf("Failed to set command text.\
");
           goto cleanup;
       }

       // 执行查询
       hr = pICommandText->lpVtbl->Execute(pICommandText, NULL, &IID_IRowset, NULL, &cRowsObtained, (IUnknown**)&pIRowset);
       if (FAILED(hr)) {
           printf("Failed to execute query.\
");
           goto cleanup;
       }

       // 处理查询结果
       // ...

   cleanup:
       // 释放资源
       if (pIRowset) pIRowset->lpVtbl->Release(pIRowset);
       if (pICommandText) pICommandText->lpVtbl->Release(pICommandText);
       if (pIDBCreateSession) pIDBCreateSession->lpVtbl->Release(pIDBCreateSession);
       if (pIDBInitialize) pIDBInitialize->lpVtbl->Release(pIDBInitialize);
       if (pIDataInitialize) pIDataInitialize->lpVtbl->Release(pIDataInitialize);

       // 取消初始化 COM 库
       CoUninitialize();

       return 0;
   }
   

   请注意,你需要将 C:\\\\path\\\\to\\\\your\\\\database.mdb 替换为你的 Access 数据库文件的实际路径,将 your_table_name 替换为你要查询的表名。

4. 编译和运行

   编译并运行你的 C 语言项目。如果一切正常,你应该能够连接到 Access 数据库并执行查询操作。

这个示例仅用于演示如何使用 C 语言和 ADO 连接到 Access 数据库。在实际项目中,你可能需要根据你的需求对代码进行修改和扩展。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 18:21:13 | 显示全部楼层
**实现 C 语言以 ADO 方式读取 Access 数据库**

要使用 C 语言以 ADO 方式读取 Access 数据库,您需要使用 COM 技术。以下是一个简单的示例,展示了如何使用 C 语言和 ADO 连接到 Access 数据库并执行查询。

**1. 安装并配置**

首先,确保您已经安装了 Microsoft Data Access Components (MDAC)。这是一个包含用于访问数据库的组件的软件包。您可以从 [Microsoft 官方网站](https://www.microsoft.com/en-us/download/details.aspx?id=5793) 下载 MDAC。

**2. 初始化 COM**

在使用 ADO 之前,需要初始化 COM 库。使用 `CoInitialize` 函数进行初始化:
#include <windows.h>
#include <stdio.h>
#include <initguid.h>
#include <oledb.h>
#include <oledberr.h>

int main() {
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr)) {
        printf("COM 初始化失败: %08X\n", hr);
        return 1;
    }

    // ... 后续代码

    CoUninitialize();
    return 0;
}


**3. 创建 ADO 连接**

接下来,创建一个 ADO 连接对象。使用 `CoCreateInstance` 函数创建 `ADODB.Connection` 对象:

IDispatch *pConn = NULL;
hr = CoCreateInstance(&CLSID_ADODBConnection, NULL, CLSCTX_INPROC_SERVER, &IID_IDispatch, (void **)&pConn);
if (FAILED(hr)) {
    printf("创建 ADODB.Connection 对象失败: %08X\n", hr);
    CoUninitialize();
    return 1;
}

**4. 打开数据库连接**

使用 `ADODB.Connection` 对象的 `Open` 方法打开 Access 数据库连接。需要提供一个连接字符串,包含数据库文件的路径和其他连接参数:
BSTR connStr = SysAllocString(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\path\\to\\your\\database.mdb;");
DISPID dispid;
OLECHAR *methodName = L"Open";
hr = GetIDsOfNames(pConn, &methodName, 1, &dispid);
if (SUCCEEDED(hr)) {
    DISPPARAMS params = { NULL, NULL, 0, 0 };
    params.rgvarg = (VARIANTARG *)CoTaskMemAlloc(sizeof(VARIANTARG));
    params.cArgs = 1;
    VariantInit(¶ms.rgvarg[0]);
    params.rgvarg[0].vt = VT_BSTR;
    params.rgvarg[0].bstrVal = connStr;
    hr = Invoke(pConn, dispid, ¶ms, NULL);
    if (FAILED(hr)) {
        printf("打开数据库连接失败: %08X\n", hr);
    }
    VariantClear(¶ms.rgvarg[0]);
    CoTaskMemFree(params.rgvarg);
} else {
    printf("获取 Open 方法失败: %08X\n", hr);
}
SysFreeString(connStr);


**5. 执行查询**

现在可以使用 ADO 连接对象执行查询。创建一个 `ADODB.Recordset` 对象,然后使用 `Execute` 方法执行查询:
// ... 创建 ADODB.Recordset 对象

BSTR sql = SysAllocString(L"SELECT * FROM your_table;");
hr = GetIDsOfNames(pConn, &methodName, 1, &dispid);
if (SUCCEEDED(hr)) {
    DISPPARAMS params = { NULL, NULL, 0, 0 };
    params.rgvarg = (VARIANTARG *)CoTaskMemAlloc(sizeof(VARIANTARG) * 2);
    params.cArgs = 2;
    VariantInit(¶ms.rgvarg[0]);
    VariantInit(¶ms.rgvarg[1]);
    params.rgvarg[0].vt = VT_DISPATCH | VT_BYREF;
    params.rgvarg[0].pdispVal = &pRecordset;
    params.rgvarg[1].vt = VT_BSTR;
    params.rgvarg[1].bstrVal = sql;
    hr = Invoke(pConn, dispid, ¶ms, NULL);
    if (FAILED(hr)) {
        printf("执行查询失败: %08X\n", hr);
    }
    VariantClear(¶ms.rgvarg[0]);
    VariantClear(¶ms.rgvarg[1]);
    CoTaskMemFree(params.rgvarg);
} else {
    printf("获取 Execute 方法失败: %08X\n", hr);
}
SysFreeString(sql);

// ... 处理查询结果

// ... 释放资源


这个示例展示了如何使用 C 语言和 ADO 连接到 Access 数据库并执行查询。您可以根据需要修改代码以适应您的具体需求。**实现 C 语言以 ADO 方式读取 Access 数据库**

要使用 C 语言以 ADO 方式读取 Access 数据库,您需要使用 COM 技术。以下是一个简单的示例,展示了如何使用 C 语言和 ADO 连接到 Access 数据库并执行查询。

**1. 安装并配置**

首先,确保您已经安装了 Microsoft Data Access Components (MDAC)。这是一个包含用于访问数据库的组件的软件包。您可以从 [Microsoft 官方网站](https://www.microsoft.com/en-us/download/details.aspx?id=5793) 下载 MDAC。

**2. 初始化 COM**

在使用 ADO 之前,需要初始化 COM 库。使用 `CoInitialize` 函数进行初始化:
#include <windows.h>
#include <stdio.h>
#include <initguid.h>
#include <oledb.h>
#include <oledberr.h>

int main() {
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr)) {
        printf("COM 初始化失败: %08X\n", hr);
        return 1;
    }

    // ... 后续代码

    CoUninitialize();
    return 0;
}
```

**3. 创建 ADO 连接**

接下来,创建一个 ADO 连接对象。使用 `CoCreateInstance` 函数创建 `ADODB.Connection` 对象:

```c
IDispatch *pConn = NULL;
hr = CoCreateInstance(&CLSID_ADODBConnection, NULL, CLSCTX_INPROC_SERVER, &IID_IDispatch, (void **)&pConn);
if (FAILED(hr)) {
    printf("创建 ADODB.Connection 对象失败: %08X\n", hr);
    CoUninitialize();
    return 1;
}


**4. 打开数据库连接**

使用 `ADODB.Connection` 对象的 `Open` 方法打开 Access 数据库连接。需要提供一个连接字符串,包含数据库文件的路径和其他连接参数:
BSTR connStr = SysAllocString(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\path\\to\\your\\database.mdb;");
DISPID dispid;
OLECHAR *methodName = L"Open";
hr = GetIDsOfNames(pConn, &methodName, 1, &dispid);
if (SUCCEEDED(hr)) {
    DISPPARAMS params = { NULL, NULL, 0, 0 };
    params.rgvarg = (VARIANTARG *)CoTaskMemAlloc(sizeof(VARIANTARG));
    params.cArgs = 1;
    VariantInit(¶ms.rgvarg[0]);
    params.rgvarg[0].vt = VT_BSTR;
    params.rgvarg[0].bstrVal = connStr;
    hr = Invoke(pConn, dispid, ¶ms, NULL);
    if (FAILED(hr)) {
        printf("打开数据库连接失败: %08X\n", hr);
    }
    VariantClear(¶ms.rgvarg[0]);
    CoTaskMemFree(params.rgvarg);
} else {
    printf("获取 Open 方法失败: %08X\n", hr);
}
SysFreeString(connStr);
**5. 执行查询**

现在可以使用 ADO 连接对象执行查询。创建一个 `ADODB.Recordset` 对象,然后使用 `Execute` 方法执行查询:

// ... 创建 ADODB.Recordset 对象

BSTR sql = SysAllocString(L"SELECT * FROM your_table;");
hr = GetIDsOfNames(pConn, &methodName, 1, &dispid);
if (SUCCEEDED(hr)) {
    DISPPARAMS params = { NULL, NULL, 0, 0 };
    params.rgvarg = (VARIANTARG *)CoTaskMemAlloc(sizeof(VARIANTARG) * 2);
    params.cArgs = 2;
    VariantInit(¶ms.rgvarg[0]);
    VariantInit(¶ms.rgvarg[1]);
    params.rgvarg[0].vt = VT_DISPATCH | VT_BYREF;
    params.rgvarg[0].pdispVal = &pRecordset;
    params.rgvarg[1].vt = VT_BSTR;
    params.rgvarg[1].bstrVal = sql;
    hr = Invoke(pConn, dispid, ¶ms, NULL);
    if (FAILED(hr)) {
        printf("执行查询失败: %08X\n", hr);
    }
    VariantClear(¶ms.rgvarg[0]);
    VariantClear(¶ms.rgvarg[1]);
    CoTaskMemFree(params.rgvarg);
} else {
    printf("获取 Execute 方法失败: %08X\n", hr);
}
SysFreeString(sql);

// ... 处理查询结果

// ... 释放资源
这个示例展示了如何使用 C 语言和 ADO 连接到 Access 数据库并执行查询。您可以根据需要修改代码以适应您的具体需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 18:39:44 | 显示全部楼层
感谢2楼、3楼、4楼的鱼油帮助。编译上述代码时,出现大量的错误信息,问题没有解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表