业余自学VC++﹐事倍功半﹐一个简单的连接SQL Server2000 Database的方法都不会﹐120分相送﹐说得详细的送70分﹐补充的可平分30请各位高手不要怕麻烦尽量说详细点﹐小弟感激不尽.
以下是我从书上看来的方法﹐但就是连不通﹐程序名为﹕CYDM第一部﹕
在YDMS.h中写进 #include <afxdb.h>﹐还有把SQL Server的Database(名为hzjlf)路径设为﹕C﹕\  ,我Create database时并没有设置UserName PassWord﹔
使用的是stdafx.h默认的ADO动态链接库﹕
#import "c:\program files\common files\system\ado\msado15.dll"\
no_namespace\
rename("EOF","adoEOF")第二部﹕
在CYDMSApp中声明一个指向要创建的ADO对象的智能指针
class CYDMSApp : public CWinApp
{
public:
CYDMSApp();_ConnectionPtr m_pConnection; //声明一个指向要创建的ADO对象的智能指针

}
第三部﹕
使用AfxOleInit()初始化OLE/COM环境库和创建ADO连接BOOL CYDMSApp::InitInstance()
{
AfxEnableControlContainer(); AfxOleInit();//初始化OLE/COM环境库 m_pConnection.CreateInstance(__uuidof(Connection));//创建ADO连接

try              
{

m_pConnection->Open("driver={SQL Server};Server=localhost;DATABASE=hzjlf.mdf;UID=sa;PWD=","","",adModeUnknown);  
}
catch(_com_error e)
{
AfxMessageBox("error﹗请确认数据库是否在当前路径下。");
return FALSE;
}
执行后catch到错误﹕error﹗请确认数据库是否在当前路径下。注﹕查看ODBC SystemDSN中已有Database hzjlf的存在

解决方案 »

  1.   

    这个是我收藏别人的回复,你可以参考一下~回复人: CSDNXX(熊鑫壮志) ( ) 信誉:100  2004-3-27 16:14:53  得分:20 #include "comdef.h"
    #import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
    _ConnectionPtr   pCon;
    _RecordsetPtr    pRs;
    _variant_t       vpRsAffected,RecordsAffected;
    BOOL FConnected;
    BSTR bstrSQL;
    CString StrSql;
    HRESULT Flag;
    try
    {
    Flag = pCon.CreateInstance("ADODB.Connection");//创建Connection对象
    if(SUCCEEDED(Flag))
    Flag=pCon->Open((_bstr_t)"driver={SQL Server};Server=服务器名;DATABASE=数据库名;UID=数据库登录名;PWD=数据库口令","","",adModeUnknown);//连接数据库
    if(SUCCEEDED(Flag))
    Flag=pRs.CreateInstance("ADODB.Recordset");
    if(SUCCEEDED(Flag))
    FConnected=TRUE;
    else
    FConnected=FALSE;
    }
    catch(_com_error&err)
    {
    FConnected=FALSE;
    }
    if(!FConnected)
    AfxMessageBox("连接服务器的数据库失败!请检查网络正常!或其它!");StrSql="sp_RunSql";    //sp_RunSql存储过程名称
    bstrSQL=LDB_User->RunSql.AllocSysString(); 
    pRs->Open(bstrSQL,(IDispatch*)pCon,adOpenDynamic,adLockOptimistic,adCmdText);
    //driver={SQL Server};Server=服务器名;DATABASE=数据库名;UID=数据库登录名;PWD=数据库口令
      

  2.   

    看一些资料吧
    http://www.vczx.com/article/list.php?type=7
    很多关于vc数据库编程的
      

  3.   

    楼主是用了ADO还需要ODBC吗?
    你这样写试一试!不使用ODBC
    f(!AfxOleInit()){//初始化OLE对象
    MessageBox(this->GetMainWnd()->m_hWnd,"初始化COM组件对象失败!","提示",MB_ICONINFORMATION | MB_OK);
    return false;
    }
    m_pConnection.CreateInstance(__uuidof(Connection));//创建_ConnectionPtr实例try{//打开连接
    //Persist Security Info=False:持续安全信息,固定不变的
    //User ID=sa:登陆人员
    //Initial Catalog = Test:数据库名称
    //Data Source=WZG:服务器名称
    m_pConnection->Open("Provider = SQLOLEDB.1;Persist Security Info=False; User ID=sa;Initial Catalog = Test;Data Source=WZG","","",-1);
    }
    catch(_com_error e){//捕获异常
    MessageBox(this->GetMainWnd()->m_hWnd,"在这里最好显示系统的错误提示比如使用e. ..这样会看的清楚一些","提示",MB_ICONINFORMATION | MB_OK);
    return false;
    }
    按上面的提示将数据库等都改成和你机器上对应的!试一试,祝你成功!
      

  4.   

    是不是sa默认登陆数据库不是hzjlf,在安全里面查看一下
      

  5.   

    請問vcforever(霓裳羽衣)  使用ADO好象还要用到用ODBC的吧?
      

  6.   

    你也可以用MFC 的COM 方法
      

  7.   

    一、在VC++中使用ADO编程
    ADO实际上就是由一组Automation对象构成的组件,因此可以象使用其它任何Automation对象一样使用ADO。ADO中最重要的对象有三个:Connection、Command和Recordset,它们分别表示连接对象、命令对象和记录集对象。如果您熟悉使用MFC中的ODBC类(CDatabase、CRecordset)编程,那么学习ADO编程就十分容易了。
    使用ADO编程时可以采用以下三种方法之一:
    1、使用预处理指令#import
    #import "C:\Program Files\Common Files\System\ADO\msado15.dll"    no_namespace rename("EOF", "EndOfFile")
    但要注意不能放在stdAfx.h文件的开头,而应该放在所有include指令的后面。否则在编译时会出错。
    程序在编译过程中,VC++会读出msado15.dll中的类型库信息,自动产生两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在您的Debug或Release目录下)。在这两个文件里定义了ADO的所有对象和方法,以及一些枚举型的常量等。我们的程序只要直接调用这些方法就行了,与使用MFC中的COleDispatchDriver类调用Automation对象十分类似。
    2、使用MFC中的CIDispatchDriver
    就是通过读取msado15.dll中的类型库信息,建立一个COleDispatchDriver类的派生类,然后通过它调用ADO对象。
    3、直接用COM提供的API
     如使用如下代码:
     CLSID clsid;
     HRESULT hr = ::CLSIDFromProgID(L"ADODB.Connection", &clsid);
     if(FAILED(hr))
     {...}
     ::CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IDispatch, (void **)
          &pDispatch);
     if(FAILED(hr))
     {...}
    以上三种方法,第一和第二种类似,可能第一种好用一些,第三种编程可能最麻烦。但可能第三种方法也是效率最高的,程序的尺寸也最小,并且对ADO的控制能力也最强。
    据微软资料介绍,第一种方法不支持方法调用中的默认参数,当然第二种方法也是这样,但第三种就不是这样了。采用第三种方法的水平也最高。当你需要绕过ADO而直接调用OLE DB底层的方法时,就一定要使用第三种方法了。
    ADO编程的关键,就是熟练地运用ADO提供的各种对象(object)、方法(method)、属性(property)和容器(collection)。另外,如果是在MS SQL或Oracle等大型数据库上编程,还要能熟练使用SQL语言。
    二、使用#import方法的编程步骤
    这里建议您使用#import的方法,因为它易学、易用,代码也比较简洁。
    1、 添加#import指令
    打开stdafx.h文件,将下列内容添加到所有的include指令之后:
    #include <icrsint.h>   //Include support for VC++ Extensions
    #import "C:\Program Files\Common Files\System\ADO\msado15.dll"    no_namespace rename("EOF", "adoEOF")
    其中icrsint.h文件包含了VC++扩展的一些预处理指令、宏等的定义,用于COM编程时使用。
    2、定义_ConnectionPtr型变量,并建立数据库连接
    建立了与数据库服务器的连接后,才能进行其他有关数据库的访问和操作。ADO使用Connection对象来建立与数据库服务器的连接,所以它相当于MFC中的CDatabase类。和CDatabase类一样,调用Connection对象的Open方法即可建立与服务器的连接。
    数据类型 _ConnectionPtr实际上就是由类模板_com_ptr_t而得到的一个具体的实例类,其定义可以到msado15.tlh、comdef.h 和comip.h这三个文件中找到。在msado15.tlh中有:
    _COM_SMARTPTR_TYPEDEF(_Collection, __uuidof(_Collection));
    经宏扩展后就得到了_ConnectionPtr类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针,及一些必要的操作。我们就是通过这个指针来操纵Connection对象。类似地,后面用到的_CommandPtr和_RecordsetPtr类型也是这样得到的,它们分别表示命令对象指针和记录集对象的指针。
    (1)、连接到MS SQL Server
    注意连接字符串的格式,提供正确的连接字符串是成功连接到数据库服务器的第一步,有关连接字符串的详细信息参见微软MSDN Library光盘。
    本例连接字符串中的server_name,database_name,user_name和password在编程时都应该替换成实际的内容。
     _ConnectionPtr pMyConnect=NULL;
     HRESULT hr=pMyConnect.CreateInstance(__uuidof(Connection)));
     if(FAILED(hr))return;_bstr_t strConnect="Provider=SQLOLEDB; Server=server_name;"
      "Database=database_name; uid=user_name; pwd=password;"; 
    //connecting to the database server now:
     try{pMyConnect->Open(strConnect,"","",NULL);}
     catch (_com_error &e)
     {
      ::MessageBox(NULL,e.Description(),"警告",MB_OK | MB_ICONWARNING);
     }注意Connection对象的Open方法中的连接字符串参数必须是BSTR或_bstr_t类型。另外,本例是直接通过OLE DB Provider建立连接,所以无需建立数据源。
    (2)、通过ODBC Driver连接到Database Server
    连接字符串格式与直接用ODBC编程时的差不多:
    _bstr_t strConnect="DSN=datasource_name; Database=database_name; uid=user_name; pwd=password;";
    此时与ODBC编程一样,必须先建立数据源。
      

  8.   

    谢谢GOTO_2002()()小小强/itmaster(传说中的大师)/ vcforever(霓裳羽衣) / bluebohe(薄荷) (MVP)﹔
    如果给分不是很公平还请大家多多地包涵﹗