注册 登录
编程论坛 VC++/MFC

各位大虾,本人菜鸟,帮我找找这个错误吧,是关于VC连接SQL Server数据库的

qianyou 发布于 2012-10-24 11:53, 494 次点击
程序是弄出来了,但是运行的时候总是有异常。
程序代码:

#include "StdAfx.h"
#include "ADOConn.h"
#include <iostream>
using namespace std;
void    ADOConn::OnInitADOConn()
{
    ::CoInitialize(NULL);  //初始化OLE/COM环境,为访问ADO接口做准备
    HRESULT    hr;
    try
    {
        hr = m_pConnection.CreateInstance("ADO.Connection");    //创建Connection对象
        _bstr_t strConnection="driver={sql server};server=(local);uid=sa;pwd=123;database=shopping";
        hr = m_pConnection->Open(strConnection,"","",adModeUnknown);
        if(SUCCEEDED(hr))
        {
            cout<<"成功连接数据库"<<endl;
        }
    }
    catch(_com_error e)            //捕捉异常
    {
        cout<<"连接数据库失败"<<endl;
    }
}

_RecordsetPtr    &    ADOConn::GetRecordSet(_bstr_t    bstrSQL)
{
    try
    {
        //连接数据库,如果Connection对象为空,重新连接数据库
        if(m_pConnection == NULL)
            OnInitADOConn();
        //创建记录集对象
        m_pRecordset.CreateInstance(_uuidof(Recordset));
        m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    }
    catch(_com_error e)
    {
        cout<<e.Description()<<endl;
    }
    //返回记录集
    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)
    {
        cout<<e.Description()<<endl;
        return false;
    }
}

void    ADOConn::ExitConnection()
{
    //关闭记录集和连接
    if(m_pRecordset != NULL)
        m_pRecordset->Close();
    m_pConnection->Close();
    //释放环境
        ::CoInitialize(NULL);        //关闭ole/com库,释放资源
}

这是我自己添加的连接SQL Server的类,在下面的主函数中进行调用
程序代码:

#include "stdafx.h"
#include "ADOConn.h"
#include <iostream>
using namespace std;
int main()
{
    ADOConn ado;
    _bstr_t    bstrSQL;
    //ado.AdoConn();
    ado.OnInitADOConn();
    //ado.GetRecordSet(bstrSQL);
   
//ado.ExecuteSQL(bstrSQL);
   
//ADOConn    ExitConnection();
    return 0;
}

请各位大虾多多指点啊,整了两天,人都烦死了
1 回复
#2
qianyou2012-10-24 16:39
问题终于解决了,代码再重新贴一遍
ADOConn.h
程序代码:

#ifndef _ADOConn_H_
#define _ADOConn_H_
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")// rename("EOF",)
#pragma once
class ADOConn
{
public:
    //ADOConn(void);
   
//~ADOConn(void);
    ::_ConnectionPtr    m_pConnection;
    ::_RecordsetPtr        m_pRecordset;
public:
    //初始化连接数据库
    void OnInitADOConn();
    //执行查询,返回结果集
    ::_RecordsetPtr &    GetRecordSet(_bstr_t bstrSQL);
    //执行sql语句,更新数据库
    bool    ExecuteSQL(_bstr_t bstrSQL);
    void    ExitConnection();
};
#endif

ADOConn.cpp
程序代码:

#include "StdAfx.h"
#include "ADOConn.h"
#include <iostream>
using namespace std;
void    ADOConn::OnInitADOConn()
{
    ::CoInitialize(NULL);  //初始化OLE/COM环境,为访问ADO接口做准备
   
//HRESULT    hr;
   
//发生链接错误
    try
    {
        HRESULT    hr = m_pConnection.CreateInstance(__uuidof(Connection));    //创建Connection对象
        _bstr_t strConnection="Provider=SQLOLEDB;Persist Security Info=false/*是否window身份验证*/;Initial Catalog=shopping/*数据库名*/;Data Source=127.0.0.1/*IP地址*/";
        m_pConnection->Open(strConnection,"sa/*这里写用户名*/","123/*密码*/",adModeUnknown);
        if(SUCCEEDED(hr))
        {
            cout<<"成功连接数据库"<<endl;
        }
    }
    catch(_com_error e)            //捕捉异常
    {
        cout<<e.Description()<<"连接数据库失败"<<endl;
        //
    }
}

_RecordsetPtr    &    ADOConn::GetRecordSet(_bstr_t    bstrSQL)
{
    try
    {
        //连接数据库,如果Connection对象为空,重新连接数据库
        if(m_pConnection == NULL)
            OnInitADOConn();
        //创建记录集对象
        m_pRecordset.CreateInstance(_uuidof(Recordset));
        m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    }
    catch(_com_error e)
    {
        cout<<e.Description()<<endl;
    }
    //返回记录集
    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)
    {
        cout<<e.Description()<<endl;
        return false;
    }
}

void    ADOConn::ExitConnection()
{
    //关闭记录集和连接
    if(m_pRecordset != NULL)
        m_pRecordset->Close();
    m_pConnection->Close();
    //释放环境
        ::CoInitialize(NULL);        //关闭ole/com库,释放资源
}

ADOTest.cpp
程序代码:

// ADOTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "ADOConn.h"
#include <iostream>
using namespace std;

void main()
{
    ADOConn ado;
    _bstr_t    bstrSQL;
    ado.OnInitADOConn();
    return;
    ado.GetRecordSet(bstrSQL);
    ado.ExecuteSQL(bstrSQL);
    ado.ExitConnection();
}
1