首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请教使用ADO怎么使用长连接,最好给出例子

2012-12-14 
请问使用ADO如何使用长连接,最好给出例子最近刚接触ADO连接数据库一个程序需要使用ADO长连接,实际上我也不

请问使用ADO如何使用长连接,最好给出例子
最近刚接触ADO连接数据库
一个程序需要使用ADO长连接,实际上我也不是太懂,我只知道不要每次查询都要初始化,连接数据库。。。等等这些过程

因为百度了很久,也没有满意的答案,所以希望有朋友给你一个实际的例子来,如何使用长连接,让我不需要每次使用函数都要来一遍初始化,连接数据库的过程

多谢!
[最优解释]
发个我们项目中使用的例子代码你参考一下。其实你自已可以对ADO进行一个简单的封装。


#include "stdafx.h"
#include "XproerDataDef.h"
#include "OleDb/OleDbCommand.h"
#include "OleDb/OleDbConnection.h"
#include "OleDb/OleDbDataReader.h"
#include "OleDb/DataTable.h"
#include "OleDb/DataRow.h"
#include "OleDb/DataValue.h"

using namespace Xproer::OleDb;

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
OleDbConnection con;
//设置Access数据库,兼容Access 97,Access 2000,Access 2003,Access 2007,Access 2010
con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
con.Open();

OleDbCommand cmd(&con);
//设置SQL命令
cmd.SetCommandText(L"delete from xdb_news where id=1"); 
cmd.ExecuteNonQuery();

con.Close();//关闭数据库连接

::CoUninitialize();
system("pause");
return 0;
}


以下示例演示对数据库的多种操作:

#include "stdafx.h"
#include "XproerDataDef.h"
#include "OleDb/OleDbCommand.h"
#include "OleDb/OleDbConnection.h"
#include "OleDb/OleDbDataReader.h"
#include "OleDb/DataTable.h"
#include "OleDb/DataRow.h"
#include "OleDb/DataValue.h"

using namespace Xproer::OleDb;

//获取DataTable的示例
void ADODataTable(OleDbCommand& cmd)
{
int count = 0;
cmd.ExecuteScalar(L"select count(*) from xdb_news",count);
auto_ptr<DataTable> table;
table.reset(cmd.ExecuteDataTable(L"select top 10 IsTop from xdb_news"));

size_t rowCount = table->GetRowsCount();
for (int i = 0 ; i < rowCount ; ++i)
{
DataRow* row = table->GetRow(i);
DataValue* val = row->GetCel(0);

printf("时间:%d \r\n", val->ToBoolean() );
}
}

//使用OleDbDataReader快速读取数据的示例
void ADORead(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
USES_CONVERSION;
wstring title;
while(r->Read())
{
//r->GetString(0,title);
//printf("标题:%s \r\n",W2A(title.c_str()));
printf("ID:%f \r\n", r->GetFloat(0) );
}
r->Close();
}

//通过变量向数据库安全添加数据的示例
void ADOAdd(OleDbCommand& cmd)
{
cmd.SetCommandText(L"insert into xdb_about(VDouble) values(@VDouble)");
cmd.AddDoubleParam(L"@VDouble",125022.3180);

cmd.ExecuteNonQuery();
}

//高性能向数据库插入数据的示例
void ADOParam(OleDbCommand& cmd)
{
cmd.SetCommandText(L"delete from xdb_news where ID=@ID;");
cmd.AddInt32Param(L"@ID",886);
cmd.SetPrepared(true);

_variant_t index = (short)0;
_ParameterPtr param = cmd.GetCommand()->Parameters->GetItem(index);
param->Value = 887;
cmd.ExecuteNonQuery();
param->Value = 888;
cmd.ExecuteNonQuery();
param->Value = 889;
cmd.ExecuteNonQuery();
param->Value = 890;
cmd.ExecuteNonQuery();
param->Value = 891;


cmd.ExecuteNonQuery();
}

//向数据库添加实数的示例
void NumericScaleX(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
_RecordsetPtr& rs = r->GetRecordsetPtr();
rs->MoveFirst();

_variant_t vi = (short)0;
FieldPtr fd = rs->Fields->GetItem(vi);
unsigned char numeri = fd->GetNumericScale();
unsigned char precision = fd->GetPrecision();

printf("GetNumericScale:%d\r\n", fd->GetNumericScale() );
printf("GetPrecision:%d\r\n", fd->GetPrecision() );
printf("Value:%f\r\n", (float)fd->Value );
r->Close();
}

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
OleDbConnection con;
con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
con.Open();

OleDbCommand cmd(&con);

ADORead(cmd);

con.Close();

::CoUninitialize();
//printf("总数:%d",count);
system("pause");
return 0;
}



[其他解释]
void AddSql(char *NameAdd ,char *NameSub ,int TotalMoney)
{
  ::CoInitialize(NULL); // 初始化OLE/COM库环境 ,为访问ADO接口做准备
  _ConnectionPtr m_pConnection("ADODB.Connection");

try
{
m_pConnection.CreateInstance("ADODB.Connection");// 创建Connection对象
_bstr_t dbpwd = DB_Password ;
_bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=test; uid=sa; pwd=123456;"
m_pConnection->Open(strConnect,"","",adModeUnknown);

_bstr_t PointsIncrease="UPDATE INFO SET Money= Money+"+ TotalMoney+" WHERE id ='"+NameAdd+"'";
_bstr_t PointsDecrease="UPDATE INFO SET Money= Money-"+ TotalMoney+" WHERE id ='"+NameSub+"'";
m_pConnection->Execute(PointsIncrease,NULL,adCmdText);  
m_pConnection->Execute(PointsDecrease,NULL,adCmdText);  
 
}
// 捕捉异常
 catch(_com_error e)
 {  
return;
 }
 if(m_pConnection->State)
  m_pConnection->Close();
 ::CoUninitialize();
}


就像以上,我每次用这个函数,都要初始化+连接数据库,非常占用资源和时间
请各位给出一个简单的例子来,多谢,多谢
[其他解释]
请有经验的朋友帮帮我
[其他解释]
可以自己封装一下;
也可以定义一个全局的变量: _ConnectionPtr m_pConnection("ADODB.Connection");
在应用程序的INITINSTANCE里:
_bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=test; uid=sa; pwd=123456;"
m_pConnection->Open(strConnect,"","",adModeUnknown);
这里最好判断一下是否成功,如果失败则返回FALSE,让应用程序退出,否则后面用到的时候就异常了;
最好在退出应用程序的析构函数中释放掉即可;
[其他解释]
楼主把_ConnectionPtr m_pConnection("ADODB.Connection");保存成全局变量,每次更新记录集使用这个变量就可以了吧
[其他解释]
该回复于2012-06-26 09:32:04被版主删除
[其他解释]


m_pConnecti……



能否写出一个简单的例子来,多谢

热点排行