一、最近几天一直再搞数据库,以下是这几天的成果,而且还带了个范例
1、引用ADO库文件操作数据库
头文件添加:#import "C:/Program Files/common files/system/ado/msado15.dll" no_namespace rename("EOF","rsEOF") //引用库
CoInitialize(NULL); //初始化COM库
CoUninitialize(); //释放COM库
2、三个智能指针
①_ConnectionPtr; //接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用 _ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
②_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr 接口执行存储过程和SQL语句。
③_RecordsetPtr;是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
3、连接并打开数据库:
m_pConnection->ConnectionTimeout=5; //设置超时时间为5秒
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb","","",adModeUnknown); //通过JET数据库引擎对access数据库的连接
m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnKown);//通过DSN数据源对任何支持ODBC的数据库进行连接;
m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);
//不通过DSN对SQL SERVER数据库进行连接;其中Server是SQL服务器的名称,DATABAE是库的名称
注:adModeUnknown 表示目前用ado连接数据库的方式还不知道,这种方式以后可以在程序中以表、视图、查询、SQL、过程等方式提取数据。
4、关闭数据库:if(m_pConnection->State)m_pConnection->Close(); //如果连接状态有效,条件为真
5、打开数据表:m_pRecordset->Open("select * from table1",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
参数①Source:可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure;
②ActiveConnect:Connection连接对象或是包含数据库连接信息的字符串参数
③CursorType:表示以什么样的游标类型启动数据: 是否支持(Bookmark,PageCount,Move,MoveLast,Resync等)
adOpenForwardOnly 0 :缺省值,启动一个只能向前移动的游标( N N N N N)
adOpenKeyset 1 :启动一个Keyset(键盘)类型的游标。 ( N N Y Y N)
adOpenOpenDynamic 2 :启动一个Dynamic(动态的)类型的游标。 (全支持)
adOpenStatic 3 :启动一个Static(静态的)类型的游标。 (全支持)
④LockType:如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其它用户的动作,其他用户可以进行增、删、改操作。
adLockBatchOptimistic 4 当数据源正在更新时,其它用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行操作增删改。
⑤Options:adCmdText 表明CommandText是文本命令
adCmdTable 表明CommandText是一个表明
adCmdProc 表示CommandText是一个存储过程
adCmdUnknown 未知
6、读取表内数据:
二、简单事例:
CoInitialize(NULL);
//打开并连接数据库
_ConnectionPtr pCon(__uuidof(Connection)); //或:pCon.CreateInstance(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
try
{
pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
AfxMessageBox("打开数据库成功");
}catch(_com_error *e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
}
//打开数据库表
try
{
pRst->Open("select * from product",pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
// pRst=pCon->Execute("select * from product",NULL,adCmdText);
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//读取数据库中信息
_variant_t var;
CString strPrice,strId;
try
{
if (!pRst->BOF)
{
pRst->MoveFirst();
}else
AfxMessageBox("表内数据为空");
//读入库中各字段并加入列表框中
while (!pRst->rsEOF)
{
var=pRst->GetCollect("price");
if (var.vt!=VT_NULL)
{
strPrice=(LPSTR)_bstr_t(var);
}
var=pRst->GetCollect("product");
if (var.vt!=VT_NULL)
{
strId=(LPSTR)_bstr_t(var);
}
m_List.AddString(strPrice+"-->"+strId);
pRst->MoveNext();
UpdateData(FALSE);
//m_List.SetCurSel(0);
}
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//插入记录。
try{
pRst->AddNew();
pRst->PutCollect("id",_variant_t("10004"));
pRst->PutCollect("price",atol("deade"));
pRst->Update();
AfxMessageBox("插入成功!");
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
CoUninitialize();
1、引用ADO库文件操作数据库
头文件添加:#import "C:/Program Files/common files/system/ado/msado15.dll" no_namespace rename("EOF","rsEOF") //引用库
CoInitialize(NULL); //初始化COM库
CoUninitialize(); //释放COM库
2、三个智能指针
①_ConnectionPtr; //接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用 _ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
②_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr 接口执行存储过程和SQL语句。
③_RecordsetPtr;是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
3、连接并打开数据库:
m_pConnection->ConnectionTimeout=5; //设置超时时间为5秒
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb","","",adModeUnknown); //通过JET数据库引擎对access数据库的连接
m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnKown);//通过DSN数据源对任何支持ODBC的数据库进行连接;
m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);
//不通过DSN对SQL SERVER数据库进行连接;其中Server是SQL服务器的名称,DATABAE是库的名称
注:adModeUnknown 表示目前用ado连接数据库的方式还不知道,这种方式以后可以在程序中以表、视图、查询、SQL、过程等方式提取数据。
4、关闭数据库:if(m_pConnection->State)m_pConnection->Close(); //如果连接状态有效,条件为真
5、打开数据表:m_pRecordset->Open("select * from table1",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
参数①Source:可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure;
②ActiveConnect:Connection连接对象或是包含数据库连接信息的字符串参数
③CursorType:表示以什么样的游标类型启动数据: 是否支持(Bookmark,PageCount,Move,MoveLast,Resync等)
adOpenForwardOnly 0 :缺省值,启动一个只能向前移动的游标( N N N N N)
adOpenKeyset 1 :启动一个Keyset(键盘)类型的游标。 ( N N Y Y N)
adOpenOpenDynamic 2 :启动一个Dynamic(动态的)类型的游标。 (全支持)
adOpenStatic 3 :启动一个Static(静态的)类型的游标。 (全支持)
④LockType:如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其它用户的动作,其他用户可以进行增、删、改操作。
adLockBatchOptimistic 4 当数据源正在更新时,其它用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行操作增删改。
⑤Options:adCmdText 表明CommandText是文本命令
adCmdTable 表明CommandText是一个表明
adCmdProc 表示CommandText是一个存储过程
adCmdUnknown 未知
6、读取表内数据:
二、简单事例:
CoInitialize(NULL);
//打开并连接数据库
_ConnectionPtr pCon(__uuidof(Connection)); //或:pCon.CreateInstance(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
try
{
pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
AfxMessageBox("打开数据库成功");
}catch(_com_error *e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
}
//打开数据库表
try
{
pRst->Open("select * from product",pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
// pRst=pCon->Execute("select * from product",NULL,adCmdText);
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//读取数据库中信息
_variant_t var;
CString strPrice,strId;
try
{
if (!pRst->BOF)
{
pRst->MoveFirst();
}else
AfxMessageBox("表内数据为空");
//读入库中各字段并加入列表框中
while (!pRst->rsEOF)
{
var=pRst->GetCollect("price");
if (var.vt!=VT_NULL)
{
strPrice=(LPSTR)_bstr_t(var);
}
var=pRst->GetCollect("product");
if (var.vt!=VT_NULL)
{
strId=(LPSTR)_bstr_t(var);
}
m_List.AddString(strPrice+"-->"+strId);
pRst->MoveNext();
UpdateData(FALSE);
//m_List.SetCurSel(0);
}
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//插入记录。
try{
pRst->AddNew();
pRst->PutCollect("id",_variant_t("10004"));
pRst->PutCollect("price",atol("deade"));
pRst->Update();
AfxMessageBox("插入成功!");
}catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
CoUninitialize();