标题:求教C++连接数据库的方法
只看楼主
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
结帖率:81.82%
 问题点数:0 回复次数:23 
求教C++连接数据库的方法
似乎可以在代码中通过sql语句对数据库进行操作?求这样的方法教程!或者相关的书籍!
搜索更多相关主题的帖子: 连接数据库 sql语句 书籍 连接数据库 sql语句 书籍 
2015-12-13 00:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
ODBC
OTL
等等,甚至直接用对应数据库提供的APIs
2015-12-13 11:46
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:0 
查查官方文档肯定有这方面的API介绍

一片落叶掉进了回忆的流年。
2015-12-15 22:39
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
网络里  这种代码 很少  大概是保密吧   很多人发的数据库相关代码都不是完整的

我这里有一段能够通过编译运行的代码   

这段代码实现的功能就是输出了某个字段的全部记录

程序代码:
#include <stdio.h> 
#include <windows.h>
#include <string.h>

#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")   //引入ADO库

int main(void)
{
    _ConnectionPtr m_pConnection=NULL;
    CoInitialize(NULL);  //初始化com库
    HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");    //创建Connection对象
    if(SUCCEEDED(hr))  //创建数据库connection对象成功
    {
        hr = m_pConnection->Open("Driver={Microsoft dBase Driver (*.dbf)}","","",adModeUnknown);
        if(SUCCEEDED(hr))   //连接数据库字符串成功
        {
            _RecordsetPtr MySet;
            MySet.CreateInstance(__uuidof(Recordset));
            MySet->Open("SELECT * FROM 123",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
            _variant_t Holder;
            while(!MySet->adoEOF)
            {
                Holder = MySet->GetCollect("XMMC");
                if(Holder.vt!=VT_NULL)
                    printf("%s\n",(char*)_bstr_t(Holder));
                MySet->MoveNext();
            }

        }
    }
    return 0;
}

DO IT YOURSELF !
2015-12-16 11:06
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
以下是引用wp231957在2015-12-16 11:06:09的发言:

网络里  这种代码 很少  大概是保密吧   很多人发的数据库相关代码都不是完整的

我这里有一段能够通过编译运行的代码   

这段代码实现的功能就是输出了某个字段的全部记录


#include <stdio.h>
#include <windows.h>
#include <string.h>

#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")   //引入ADO库

int main(void)
{
    _ConnectionPtr m_pConnection=NULL;
    CoInitialize(NULL);  //初始化com库
    HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");    //创建Connection对象
    if(SUCCEEDED(hr))  //创建数据库connection对象成功
    {
        hr = m_pConnection->Open("Driver={Microsoft dBase Driver (*.dbf)}","","",adModeUnknown);
        if(SUCCEEDED(hr))   //连接数据库字符串成功
        {
            _RecordsetPtr MySet;
            MySet.CreateInstance(__uuidof(Recordset));
            MySet->Open("SELECT * FROM 123",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
            _variant_t Holder;
            while(!MySet->adoEOF)
            {
                Holder = MySet->GetCollect("XMMC");
                if(Holder.vt!=VT_NULL)
                    printf("%s\n",(char*)_bstr_t(Holder));
                MySet->MoveNext();
            }

        }
    }
    return 0;
}

你好!
这个代码我调试的时候到Myset->Open();处的断点时发生了错误,提示:
Unhandled exception at 0x76D6D8A8 in Project1.exe: Microsoft C++ exception: _com_error at memory location 0x0018FA18.
这是因为什么呢?

有妹故吾在。
2015-12-21 00:11
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
以下是引用wp231957在2015-12-16 11:06:09的发言:

网络里  这种代码 很少  大概是保密吧   很多人发的数据库相关代码都不是完整的

我这里有一段能够通过编译运行的代码   

这段代码实现的功能就是输出了某个字段的全部记录


#include <stdio.h>
#include <windows.h>
#include <string.h>

#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")   //引入ADO库

int main(void)
{
    _ConnectionPtr m_pConnection=NULL;
    CoInitialize(NULL);  //初始化com库
    HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");    //创建Connection对象
    if(SUCCEEDED(hr))  //创建数据库connection对象成功
    {
        hr = m_pConnection->Open("Driver={Microsoft dBase Driver (*.dbf)}","","",adModeUnknown);
        if(SUCCEEDED(hr))   //连接数据库字符串成功
        {
            _RecordsetPtr MySet;
            MySet.CreateInstance(__uuidof(Recordset));
            MySet->Open("SELECT * FROM 123",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
            _variant_t Holder;
            while(!MySet->adoEOF)
            {
                Holder = MySet->GetCollect("XMMC");
                if(Holder.vt!=VT_NULL)
                    printf("%s\n",(char*)_bstr_t(Holder));
                MySet->MoveNext();
            }

        }
    }
    return 0;
}

这是我根据作者叫启明工作室的《Visual C++ SQL Server数据库应用实例完全解析》里的基础代码改的:
程序代码:
#include<iostream>
#include<string>
using namespace std;

#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")

class ADOConn
{
    //定义变量
public:
    _ConnectionPtr m_pConnection;//添加一个纸箱Connection对象的指针
    _RecordsetPtr m_pRecordset;//添加一个指向Recordset对象的指针
    //定义方法
public:
    ADOConn(){};
    virtual ~ADOConn(){};
    void OnInitADOConn();//初始化——连接数据库
    _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询
    BOOL ExecuteSQL(_bstr_t bstrSQL);//执行sql语句,Insert Update_variant_t
    void ExitConnect();
};

void  ADOConn::OnInitADOConn()
{
    //初始化OLE/COM库环境
    ::CoInitialize(NULL);

    //创建Connection对象
    m_pConnection.CreateInstance("ADODB.Recordset");
    //设置连接字符串,必须是BSTR型或_bstr_t类型

    _bstr_t strConnect = "Provider=SQLOLEDB;Server=我的计算机;Database=Student;uid=sa;pwd=123456";

    
    /**********************************************************************************************/
    //                                 调试时在此处出错
    /**********************************************************************************************/
    m_pConnection->Open(strConnect, "", "", adModeUnknown);

    /**********************************************************************************************/
}

_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
    //连接数据库,如果Connection对象为空,则重新连接数据库
    if (m_pConnection == NULL)
        OnInitADOConn();
    //创建记录集对象
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    //取得表中记录
    m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);

    return m_pRecordset;//返回记录集
}

//BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
//{
//    try
//    {
//        //是否已经连接数据库
//        if (m_pConnection == NULL)
//            OnInitADOConn();
//        m_pConnection->Execute(bstrSQL, NULL, adCmdText);
//
//        return true;
//    }
//    catch (_com_error e)
//    {
//        return false;
//    }
//}
//
//void ADOConn::ExitConnect()
//{    //关闭记录集和连接
//    if (m_pRecordset != NULL)
//        m_pRecordset->Close();
//    m_pConnection->Close();
//
//    ::CoUninitialize();//释放环境
//}

void main()
{
    string Sname;
    ADOConn m_AdoConn;
    m_AdoConn.OnInitADOConn();
    //设置select语句
    _bstr_t vSQL;
    vSQL = "select sname from Student";
    _RecordsetPtr m_pRecordset;
    m_pRecordset = m_AdoConn.GetRecordSet(vSQL);
    Sname = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("sname");
    cout << Sname;
}

错误信息:
Unhandled exception at 0x76D6D8A8 in ex.exe: Microsoft C++ exception: _com_error at memory location 0x0018F784.

有妹故吾在。
2015-12-21 00:21
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
vs还是vc

DO IT YOURSELF !
2015-12-21 05:31
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
回复 7楼 wp231957
vs2013

有妹故吾在。
2015-12-21 08:00
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
我的是vs2010 + xp sp3  +dbf数据库

我没有sql环境  你用的sql是啥版本的  哪里下载  有空帮你测试一下

DO IT YOURSELF !
2015-12-21 08:09
日寂
Rank: 2
等 级:论坛游民
帖 子:37
专家分:15
注 册:2013-11-1
得分:0 
回复 9楼 wp231957
sql server2012……哪里下载我忘了,直接百度随便找的……
请问这个可能是什么原因呢?

[此贴子已经被作者于2015-12-21 09:51编辑过]


有妹故吾在。
2015-12-21 09:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-460171-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.473010 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved