请教:如何在VC++中连接SQL Server2000数据库?!谢谢,急急急急!

chenyuanlong 2005-08-08 10:38:34
请问,如何在VC++中将VC对话框程序与SQL Server2000数据库相连,也就是说,每当我在对话框中输入相应的纪录,然后点击对话框中的保存按钮,系统自动把我的纪录保存到制定的SQL Server2000数据库中!!
...全文
265 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pike_Jun 2005-08-09
  • 打赏
  • 举报
回复
呵呵,好贴.顶.
handsomerun 2005-08-09
  • 打赏
  • 举报
回复
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

然后你就可以建立连接了
chenyuanlong 2005-08-09
  • 打赏
  • 举报
回复
好,怎么没有用VC连接SQL Server2000数据库的例子啊??!! 急!!
iGray 2005-08-08
  • 打赏
  • 举报
回复
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接口指针。
humourHM 2005-08-08
  • 打赏
  • 举报
回复
// 修改纪录有以下两种方式:
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();
}
}
humourHM 2005-08-08
  • 打赏
  • 举报
回复
使用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;
}
VCSQLVB 2005-08-08
  • 打赏
  • 举报
回复
m_cn->Open((_bstr_t)("Provider=SQLOLEDB;Data Source="+dserver+";InitialCatalog="+dbase+";uid="+uid+";pwd="+pwd+";"),"","",NULL);
ohfox 2005-08-08
  • 打赏
  • 举报
回复
用Recordset类和数据库联接阿
dirdirdir3 2005-08-08
  • 打赏
  • 举报
回复
都要自己编写相应的处理代码。用DBGrid不错。
老夏Max 2005-08-08
  • 打赏
  • 举报
回复
vckbase有一个类很好,自己去看看。
http://www.vckbase.com/document/viewdoc/?id=677
http://www.vckbase.com/document/finddoc.asp?keyword=%CD%D0%C5%CC
handsomerun 2005-08-08
  • 打赏
  • 举报
回复
首先要与数据库建立连接,用你的应用程序来访问数据库

然后在调用insert的sql语句,把你的信息添加到数据库里面去

这是大体的思路

上面的小鬼朋友提供的那些资料还是不错的,去看看就知道了,呵呵
everandforever 2005-08-08
  • 打赏
  • 举报
回复
http://dev.csdn.net/article/74/74216.shtm

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧