当前位置: 主页 > 数据库

数据库指针是什么-标库网数据怎么样

发布时间:2023-02-08 16:27   浏览次数:次   作者:佚名

准备:

(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);///显示错误信息

}