请问,如何在VC++中将VC对话框程序与SQL Server2000数据库相连,也就是说,每当我在对话框中输入相应的纪录,然后点击对话框中的保存按钮,系统自动把我的纪录保存到制定的SQL Server2000数据库中!!

解决方案 »

  1.   

    m_cn->Open((_bstr_t)("Provider=SQLOLEDB;Data Source="+dserver+";InitialCatalog="+dbase+";uid="+uid+";pwd="+pwd+";"),"","",NULL);
      

  2.   

    使用ADO访问数据库 
    VC可使用的数据库编程接口包括:ODBC API、MFC ODBC、ADO、DAO、RDO和DB-Library等。这些技术各有自己的优缺点,它们都提供了简单、灵活、访问速度快、可扩展性好的开发技术。 传统的ODBC技术只能访问关系数据库,并且访问数据库的速度慢。而OLE DB访问技术,不仅可以访问关系型数据库,还可以访问非关系型数据库,同时由于OLE DB是基于COM接口的技术,使用这种技术可以直接对数据库的驱动程序进行访问,从而大大提供了访问速度。
    ADO(ActiveX Data Object的简称)是Microsoft为最新和最强大的数据访问范例OLE DB而设计的,是一个便于使用的应用程序层接口。ADO通过OLE DB提供访问和操作数据库服务器中的数据。ADO最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。
    这里提供了使用ADO访问数据库的简单代码,供初学者参考。代码中涉及到了SQL语法,但不属于ADO所讨论的范围,相关内容见《SQL语法基础》。以下代码更改过一次,使得内容更完善,只需稍加修改可成为一个类。
    ·使用ADO访问数据库的简单实例:< Windows 2000系统、Microsoft Visual C++ 6.0环境 > 
       // 使用ADO前必须在工程的stdafx.h文件最后直接使用#import引入ADO库文件:
       #import "c:\program files\common files\system\ado\msado15.dll"
    no_namespace rename ("EOF","adoEOF")
       // 以上路径应视实际情况而定;为了避免常数冲突,将常数EOF改名为adoEOF。   // 在CWinApp::InitInstance()的重载函数中初始化 OLE 库:
    if (!AfxOleInit())
    {
    // 初始化 OLE 库失败
    }   /*********************************************************************************************
       ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。
    _ConnectionPtr 通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句。
    _CommandPtr 返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
    _RecordsetPtr是一个记录集对象。它对记录集提供了更多的控制功能,如记录锁定、游标控制等。
       *********************************************************************************************/
       // 定义变量:
       public:
    _ConnectionPtr m_pConnection;
    _RecordsetPtr  m_pRecordset;    // 初始化:
    // 创建 Connection 对象
    HRESULT hr;
    hr = m_pConnection.CreateInstance("ADODB.Connection");
    if (!SUCCEEDED(hr))
    {
    // 创建 Connection 对象失败
    }
    // 创建 Recordset 对象
    hr = m_pRecordset.CreateInstance("ADODB.Recordset");
    if (!SUCCEEDED(hr))
    {
    // 创建 Recordset 对象失败
    }
    // m_pConnection.CreateInstance(__uuidof(Connection));
    // m_pRecordset.CreateInstance(__uuidof(Recordset));   // 打开Access 2000数据库
       BOOL Open(CString DBName)
       {
    CString strData;
    strData = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + DBName;
    // 对于ACCESS2000, Provider=Microsoft.Jet.OLEDB.4.0;
    // 对于ACCESS97, Provider=Microsoft.Jet.OLEDB.3.51;
    try 

    m_pConnection->Open(_bstr_t(strData), "", "", adModeUnknown);
    /******************************************************************************
    函数:HRESULT Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID,
    _bstr_t Password, long Options) ConnectionString:连接字串;
    UserID          :用户名;
    Password        :登陆密码;
    Options         :连接选项,用于指定Connection对象对数据的更新许可权:
    adModeUnknown:   缺省。当前的许可权未设置
    adModeRead:      只读
    adModeWrite:     只写
    adModeReadWrite: 可以读写
    adModeShareDenyRead:  阻止其它Connection对象以读权限打开连接
    adModeShareDenyWrite: 阻止其它Connection对象以写权限打开连接
    adModeShareExclusive: 阻止其它Connection对象打开连接
    adModeShareDenyNone:  允许其它程序或对象以任何权限建立连接
    ******************************************************************************/
    }
    catch (_com_error e)
    {
    AfxMessageBox(e.ErrorMessage());
    return FALSE;
    }
    return TRUE;
       }   // 查询
       BOOL Locating(CString SqlCommand)
       {
    // 参数形式:
    // SELECT * FROM TableName[ WHERE Field1=Value1][ AND Field2>Value2][...]
    if (!m_pConnection->State)
    {
    return FALSE;
    }
    if (m_pRecordset->State)
    {
    m_pRecordset->Close();
    }
    try
    {
    m_pRecordset->Open((_bstr_t) SqlCommand, m_pConnection.GetInterfacePtr(),
    adOpenDynamic, adLockOptimistic, adCmdText);
    }
    catch (_com_error* e)
    {
    AfxMessageBox(e->ErrorMessage());
    return FALSE;
    }
    return TRUE;
       }
       // 统计纪录数
       long GetCount(CString SqlCommand)
       {
    // 参数形式:
    // SELECT COUNT(*) FROM TableName[ WHERE Field1=Value1][ AND Field2=Value2][...]
    _variant_t vNULL;
    _RecordsetPtr pRecordset;
    pRecordset = m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    _variant_t vCount = pRecordset->GetCollect((_variant_t) (long) 0);
    pRecordset->Close();
    pRecordset.Release();
    return vCount.lVal;
       }
       // 从数据库读取数据
       BOOL ReadData()
       {
    _variant_t var;
    try
    {
    if (!m_pRecordset->BOF)
    m_pRecordset->MoveFirst();
    else
    // 数据库为空纪录
    return FALSE;
    while (!m_pRecordset->adoEOF)
    {
    // 获取指定字段的值,以字段名为Name为例:
    var = m_pRecordset->GetCollect("Name");
    if (var.vt != VT_NULL)
    // (LPCSTR)_bstr_t(var)就是该字段的值
    m_pRecordset->MoveNext();
    }
    }
    catch (_com_error* e)
    {
    AfxMessageBox(e->ErrorMessage());
    return FALSE;
    }
    return TRUE;
       }
      

  3.   

    // 修改纪录有以下两种方式:
       void Modify()
       {
    // 先移动到指定位置
    // 以将字段Name改为“帝王”为例:
    m_pRecordset->PutCollect("Name", _variant_t("帝王"));
    // ……
    m_pRecordset->Update();
       }
       BOOL Modify(CString SqlCommand)
       {
    // 参数形式:
    // UPDATE TableName SET [Field1=Value1][, Field2=Value2][...]
    // [ WHERE Field1=Value1][ AND Field2=Value2][...]
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }
       // 添加纪录也有以下两种方式:
       BOOL Add()
       {
    m_pRecordset->MoveLast();
    m_pRecordset->AddNew();
    try
    {
    // 以添加Name为“帝王”的纪录为例:
    m_pRecordset->PutCollect("Name", _variant_t("帝王"));
    // ……
    m_pRecordset->Update();
    }
    catch (_com_error* e)
    {
    AfxMessageBox(e->ErrorMessage());
    return FALSE;
    }
    return TRUE;
       }
       BOOL Add(CString SqlCommand)
       {
    // 参数形式:
    // INSERT INTO TableName (Field1,Field2,...) VALUES (Value1,Value2,...)
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }   // 删除纪录也有以下两种方式:
       BOOL Delete(long lIndex)
       {
    // 删除第lIndex条纪录
    try
    {
    m_pRecordset->MoveFirst();
    m_pRecordset->Move(lIndex);
    m_pRecordset->Delete(adAffectCurrent);
    m_pRecordset->Update();
    }
    catch (_com_error* e)
    {
    AfxMessageBox(e->ErrorMessage());
    return FALSE;
    }
    return TRUE;
       }   BOOL Delete(CString SqlCommand)
       {
    // 参数形式:
    // DELETE FROM TableName WHERE Field1=Value1[ AND Field2=Value2][...]
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }   // 添加表
       BOOL AddTable(CString SqlCommand)
       {
    // 参数形式:
    // CREATE TABLE TableName (Field1 [Type1],[Field2 [Type2]][...])
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }   // 删除表
       BOOL DeleteTable(CString SqlCommand)
       {
    // 参数形式:
    // DROP TABLE Tablename
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }   // 添加字段
       BOOL AddField(CString SqlCommand)
       {
    // 参数形式:
    // ALTER TABLE TableName ADD Field [Type]
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }   // 删除字段
       BOOL DeleteField(CString SqlCommand)
       {
    // 参数形式:
    // ALTER TABLE TableName DROP Field
    _variant_t vNULL;
    if (!m_pConnection->State)
    {
    // 数据库未打开
    return FALSE;
    }
    m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText);
    return TRUE;
       }   // 关闭记录集
       void CloseRecord()
       {
    if (m_pRecordset->State)
    {
    m_pRecordset->Close();
    m_pRecordset.Release();
    }
       }   // 关闭数据库
       void Close()
       {
    if (m_pConnection->State)
    {
    m_pConnection->Close();
    m_pConnection.Release();
    }
       }
      

  4.   

    http://www.vckbase.com/document/viewdoc/?id=215
    这篇文章可以帮你快速入门。若真想用好ADO,还是读一读COM的书吧,ADO是对OLE DB的一个COM封装,下面提一下在VC中使用ADO的三个要点:《ADO API Reference》中说到一个方法或属性要使用一个字符串参数时,通常意味着需要一个类_bstr_t型的参数,它封装了BSTR这一数据类型。《ADO API Reference》中说到一个方法或属性要使用一个参数时,通常意味着需要一个_variant_t类型的参数,它封装了Variant这一数据类型。ADO总是一个IDispatch接口。任何被传递的被包含在Variant中的指针都必须被转换为一个IDispatch接口指针。
      

  5.   

    http://dev.csdn.net/article/74/74216.shtm
      

  6.   

    首先要与数据库建立连接,用你的应用程序来访问数据库然后在调用insert的sql语句,把你的信息添加到数据库里面去这是大体的思路上面的小鬼朋友提供的那些资料还是不错的,去看看就知道了,呵呵
      

  7.   

    vckbase有一个类很好,自己去看看。
    http://www.vckbase.com/document/viewdoc/?id=677
    http://www.vckbase.com/document/finddoc.asp?keyword=%CD%D0%C5%CC
      

  8.   

    都要自己编写相应的处理代码。用DBGrid不错。
      

  9.   

    好,怎么没有用VC连接SQL Server2000数据库的例子啊??!!  急!!
      

  10.   

    Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=sa;Initial Catalog=xxx;Data Source=192.168.0.1;xxx是你数据库的名字,后面那个是数据库所在计算机的IP然后用那个小鬼朋友讲的那个
    HRESULT Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID,
    上面给你的那段就是ConnectionString然后你就可以建立连接了