数据库指针是什么-标库网数据怎么样
准备:
(1)、介绍ADO类
#import "c:\program files\common files\system\ado\msado15.dll" \
无命名空间\
重命名(“EOF”,“adoEOF”)
(2)、初始化COM
MFC中可以使用AfxOleInit(); 在非MFC环境下使用:
联合初始化(NULL);
CoUnInitialize();
(3)包含#import后,可以使用3个智能指针:_ConnectionPtr、_RecordsetPtr和_CommandPtr
1.连接并关闭数据库
(1) 连接
示例:连接到 Access 数据库
AfxOleInit();//初始化
HRESULT小时;
尝试
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建连接对象
如果(成功(小时))
{
m_pConnection->ConnectionTimeout = 0;
hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", "", "", adModeUnknown);
//m_pConnection->PutDefaultDatabase((_bstr_t) "DB");//设置默认数据库
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->CommandTimeout = 5;
m_pCommand->ActiveConnection = m_pConnection;
}
}
catch(_com_error e)///捕获异常
{
CString 错误信息;
errormessage.Format("连接数据库失败!\r\n错误信息:%s", e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
(2)、关闭
//如果数据库连接有效
如果(m_pConnection->状态)
m_pConnection->关闭();
m_pConnection = NULL;
(3)、设置连接时间
//设置连接时间
pConnection->put_ConnectionTimeout(long(5));
2. 打开一个结果集
(1) 打开数据库指针是什么,先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果
_RecordsetPtrm_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中,建议经常使用try...catch()来捕捉错误信息。
// 因为它有时候经常会出现一些意想不到的错误。 荆州许
尝试
{
m_pRecordset->Open("SELECT * FROM DemoTable",//查询DemoTable表中的所有字段
m_pConnection.GetInterfacePtr(),//获取库连接库的IDispatch指针
广告开放动态,
adLock 乐观,
广告命令文本);
}
赶上(_com_error * e)
{
AfxMessageBox(e->ErrorMessage());
}
(2) 关闭结果集 m_pRecordset->Close();
3. 操作结果集
(1)、遍历(读取)
a) 使用pRecordset->adoEOF判断数据库指针是否已经移动到结果集的末尾; m_pRecordset->BOF判断是否在第一条记录前面:while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("姓名");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("年龄");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
b) 获取字段值的方式有两种
一个是
//表示获取第0个字段的值 m_pRecordset->GetCollect("Name");
或 m_pRecordset->GetCollect(_variant_t(long(0)));
二是
pRecordset->get_Collect("COLUMN_NAME");
或 pRecordset->get_Collect(long(index));
(2)、添加
a)、调用m_pRecordset->AddNew();
b)、调用m_pRecordset->PutCollect(); 为每个字段赋值
c)、调用m_pRecordset->Update(); 确认
(3)、修改
(4)、删除
a)、将记录指针移动到要删除的记录上,然后调用Delete(adAffectCurrent)试试
{
//假设删除第二条记录
m_pRecordset->MoveFirst();
m_pRecordset->移动(1);
// 从0开始
m_pRecordset->删除(adAffectCurrent);
// 参数adAffectCurrent是删除当前记录
m_pRecordset->更新();
}
赶上(_com_error * e)
{
AfxMessageBox(e->ErrorMessage());
}
4.直接执行SQL语句数据库指针是什么,除了使用结果集外,其他大部分功能都可以直接用SQL语言实现
(1)、使用_CommandPtr和_RecordsetPtr配合
_CommandPtrm_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
// 将库链接分配给它
m_pCommand->ActiveConnection = m_pConnection;
// SQL语句
m_pCommand->CommandText = "SELECT * FROM DemoTable";
// 执行SQL语句并返回记录集
m_pRecordset = m_pCommand->Execute(NULL, NULL, adCmdText);
(2)、直接使用_ConnectionPtr执行SQL语句
_RecordsetPtr Connection15::Execute (_bstr_t 命令文本,
VARIANT * 受影响的记录,
长选项)
其中,CommandText为命令字符串,通常为SQL命令。
参数RecordsAffected是操作完成后受影响的行数,
参数 Options 表示 CommandText 中内容的类型,Options 可以取下列值之一:
adCmdText:表示CommandText是一个文本命令
adCmdTable:表示CommandText为表名
adCmdProc:表示CommandText是一个存储过程
adCmdUnknown:未知
例子:
_variant_t 受影响的记录;
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
5.调用存储过程
(1)、使用_CommandPtr
_CommandPtrm_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection;//给它分配库连接
m_pCommand->CommandText = "演示";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);
(2)、直接用_ConnectionPtr调用(见4.(2))
6、遍历数据库中所有表名_ConnectionPtr m_pConnect;
_RecordsetPtr pSet;
HRESULT小时;
尝试
{
hr = m_pConnect.CreateInstance("ADODB.Connection");
如果(成功(hr))
{
CString dd;
dd.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",file);
hr = m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);
pSet = m_pConnect->OpenSchema(adSchemaTables);
while(!(pSet->adoEOF))
{
// 获取表格
_bstr_t table_name = pSet->Fields->GetItem("TABLE_NAME")->Value;
//获取表单类型
_bstr_t table_type = pSet->Fields->GetItem("TABLE_TYPE")->Value;
//过滤,只输出表名,其他省略
如果 (strcmp(((LPCSTR)table_type), "TABLE")==0){
CString tt;
tt.Format("%s",(LPCSTR)table_name);
AfxMessageBox(tt);
}
pSet->MoveNext();
}
pSet->关闭();
}
m_pConnect->关闭();
}catch(_com_error e)///捕获异常
{
CString 错误信息;
errormessage.Format("连接数据库失败!错误信息:%s", e.ErrorMessage());
AfxMessageBox(错误信息);
返回-1;
}
7.遍历一个表中的所有字段
字段 *field = NULL;
HRESULThr;
字段 *fields = NULL;
hr = m_pRecordset->get_Fields(&fields);//获取字段集并
如果(成功(hr))
字段->get_Count(&ColCount);
//获取记录集的字段集合中的字段总数
for(i=0;iItem[i]->get_Name(&bstrColName);//获取记录集中的字段名//
strColName = bstrColName;
名称字段 = strColName;
m_FieldsList.AddString(nameField);
}
如果(成功(hr))
fields->Release();//释放指针
随附的:
1._variant_t
(1)、一般传递给这三个指针的值都不是MFC直接支持的数据类型,需要用_variant_t进行转换
_variant_t(XX) 可以将大部分类型的变量转换成合适的类型:
(2)、_variant_t var; _variant_t -> 长:(长)变种;
_variant_t -> CString: CString strValue = (LPCSTR)_bstr_t(var);
CString -> _variant_t: _variant_t(strSql);
2. BSTR宽字符串与CString之间的转换
BSTR ;
CString strSql;
CString -> BSTR:bstr = strSql。 AllocSysString();
BSTR -> CString: strSql = (LPCSTR)bstr;
3._bstr_t和CString之间的转换
_bstr_t bstr;
CString strSql;
CString -> _bstr_t: bstr = (_bstr_t)strSql;
_bstr_t -> CString: strSql = (LPCSTR)bstr;
4.关于时间
访问:代表时间的字符串#2004-4-5#
sql: 表示时间 ''2004-4-5'' 的字符串
DateField(时间字段) select * from my_table where DateField > #2004-4-10#
尝试
{
m_pCommand->CommandText = "INSERT INTO tTest(age) VALUES('23f2') ";
m_pRecordset = m_pCommand->Execute(NULL,NULL, adCmdText);
}
catch(_com_error e)///捕获异常
{
CString 错误信息;
errormessage.Format("连接数据库失败!\r\n错误信息:%s", e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}