ADO小问题请教

时间:2022-03-05 17:34:29
当ADO用_ConnectionPtr链接成功以后,是不是再用_RecordsetPtr去操作数据库时,每一次操作是不是都需要再用ConnectionPtr链接一次,我每一次RecordsetPtr时都需要用ConnectionPtr去链一遍数据库,请问大家也是这样做的吗?

19 个解决方案

#1


ConnectionPtr一次就可以了,只要你不关闭连接就行了.

#2


根据情况不同,有所不同

如果你的查询很频繁,循环的,那么就在循环外连接一次,循环完结束。
如果不是很频繁,就用的时候再连接。

#3


楼上两位大哥看看小弟的代码,小弟在每次inserttodb时都需要执行oninitADOConn,能用什么方法当我inserttodb时,不调用oninitADOConn?

BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr)
{

HRESULT hr; 
try 

hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象 
if(SUCCEEDED(hr)) 

m_pConnection->ConnectionTimeout=2;///设置超时时间为2秒 
m_pConnection.CreateInstance("ADODB.Connection");
CString str; 
str.Format("File Name=%s", ConnStr); 
m_pConnection->ConnectionString = _bstr_t(str);
m_pConnection->Open("","","",NULL);

AfxMessageBox("链接成功"); 

        inserttodb();

catch(_com_error e)///捕捉异常 

CString temp; 
temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); 
::MessageBox(NULL,temp,"提示信息",NULL); 
AfxMessageBox(e.Source()); 
AfxMessageBox(e.Description()); 
return false; 


}

void ADOConn::inserttodb()
{
CString strSQL; 
CString m_name;
m_pRecordset.CreateInstance(__uuidof(Recordset));

m_name = "hehe";
strSQL.Format("insert into Bigtype(name) values ('%s')",m_name); 
m_pRecordset=m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText); 
AfxMessageBox("插入成功"); 
}

#4


哦,你的代码没有每次都连接,只是使用了connection的execute方法,这个不会导致每次都连接的

#5


楼上的朋友,我的代码直接执行ADOConn::inserttodb()方法不行,运行后会报错,ADOConn::inserttodb()方法必须得放在ADOConn::OnInitADOConn(LPCTSTR ConnStr)
链接到数据库后才能执行.不知道是为什么,这样的话,我每次执行SQL语句都要重链一下数据库.

#6


你先调用OnInitADOConn(LPCTSTR ConnStr) 连接数据库

然后循环调用inserttodb(),就可以了。

#7


引用 6 楼 vieri_ch 的回复:
你先调用OnInitADOConn(LPCTSTR ConnStr) 连接数据库

然后循环调用inserttodb(),就可以了。


小弟是初学者,不太明白循环调用inserttodb(),是怎样实现的?

#8


你第一次调用OnInitADOConn,是在什么时候?
一般,只要在程序启动的时候,调用就行了,m_pConnection就已经是一个已连接的智能指针对象。
以后就直接调用inserttodb。应该没问题。


OnInitADOConn,至少要被调用一回。inserttodb,不应该被放在OnInitADOConn这个方法中。应该移除

#9


引用 8 楼 vieri_ch 的回复:
你第一次调用OnInitADOConn,是在什么时候?
一般,只要在程序启动的时候,调用就行了,m_pConnection就已经是一个已连接的智能指针对象。
以后就直接调用inserttodb。应该没问题。


OnInitADOConn,至少要被调用一回。inserttodb,不应该被放在OnInitADOConn这个方法中。应该移除


第一次调是放在Button中,点一下就调用了.

然后第二个button执行的inserttodb,就报错了,把inserttodb放在oninitadoconn中就可以了.

oninitadoconn放在启动时和放在第一个button中一样,第二个在执行了第一个按钮的oninitadoconn后还是不能单独执行inserttodb方法,郁闷.

#10


vieri_ch,我又试了下,这两个不能分开,第二个必须依托第一个,不执行链接不能inserttodb,否则会报错.
说"运行时必须手工的方法退出"

#11


m_pConnection->ConnectionString = _bstr_t(str);
m_pConnection->CursorLocation=  adUseClient;


  strSQL.Format("insert into Bigtype(name) values ('%s')",m_name); 
  m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);

insert语句不返回记录集, 在InsertToDb中不用创建这个对象了,而且对于返回的记录集,用完之后,要close 

#12


引用楼主 liulcsy 的回复:
当ADO用_ConnectionPtr链接成功以后,是不是再用_RecordsetPtr去操作数据库时,每一次操作是不是都需要再用ConnectionPtr链接一次,我每一次RecordsetPtr时都需要用ConnectionPtr去链一遍数据库,请问大家也是这样做的吗?

其实定义一个_ConnectionPtr对象就可以了,数据库连接成功后,用定义的_ConnectionPtr对象调用OpenRecordSet()函数就可以了取得SQL语句指定的记录集了(SQL语句作为OpenRecordSet函数的参数传入)。

#13


当然也需要定义一个_RecordsetPtr对象来接收上面返回的记录集。

#14


学习了。。。。

#15


连接数据库是很费时间的。

在应用程序初始化或是某个恰当时机连接数据库,然后就可以一直使用这个数据库连接了。

#16


连接一次 不关闭就一直可以用的

#17


用 ADO.state()看看状态。
PTR都是智能指针,每次调用都要RElease();
你就用原始类型不行吗?
调用一次然后不释放,自己规定释放。

#18


我怀疑你说的两个按钮不在同一个作用域,也就是说你在第一个按钮中创建了数据库连接对象,而第二个按钮中访问不到这个对象。所以你调用inserttodb()的时候失败,因为不存在数据库连接对象。而你把创建了数据库连接对象跟inserttodb()放在一起那绝对是没问题的。
我觉得你应该把在第一个按钮中创建了数据库连接对象通过全局变量传给第二个按钮中的连接对象就好了。
最好能把你的调用上面函数的区域代码贴出。

#19


补充下:ADOConn这个对象必须是两个按钮都可以看的到的。
建议你查下是否把它定义成了按钮内的对象了。

#1


ConnectionPtr一次就可以了,只要你不关闭连接就行了.

#2


根据情况不同,有所不同

如果你的查询很频繁,循环的,那么就在循环外连接一次,循环完结束。
如果不是很频繁,就用的时候再连接。

#3


楼上两位大哥看看小弟的代码,小弟在每次inserttodb时都需要执行oninitADOConn,能用什么方法当我inserttodb时,不调用oninitADOConn?

BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr)
{

HRESULT hr; 
try 

hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象 
if(SUCCEEDED(hr)) 

m_pConnection->ConnectionTimeout=2;///设置超时时间为2秒 
m_pConnection.CreateInstance("ADODB.Connection");
CString str; 
str.Format("File Name=%s", ConnStr); 
m_pConnection->ConnectionString = _bstr_t(str);
m_pConnection->Open("","","",NULL);

AfxMessageBox("链接成功"); 

        inserttodb();

catch(_com_error e)///捕捉异常 

CString temp; 
temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); 
::MessageBox(NULL,temp,"提示信息",NULL); 
AfxMessageBox(e.Source()); 
AfxMessageBox(e.Description()); 
return false; 


}

void ADOConn::inserttodb()
{
CString strSQL; 
CString m_name;
m_pRecordset.CreateInstance(__uuidof(Recordset));

m_name = "hehe";
strSQL.Format("insert into Bigtype(name) values ('%s')",m_name); 
m_pRecordset=m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText); 
AfxMessageBox("插入成功"); 
}

#4


哦,你的代码没有每次都连接,只是使用了connection的execute方法,这个不会导致每次都连接的

#5


楼上的朋友,我的代码直接执行ADOConn::inserttodb()方法不行,运行后会报错,ADOConn::inserttodb()方法必须得放在ADOConn::OnInitADOConn(LPCTSTR ConnStr)
链接到数据库后才能执行.不知道是为什么,这样的话,我每次执行SQL语句都要重链一下数据库.

#6


你先调用OnInitADOConn(LPCTSTR ConnStr) 连接数据库

然后循环调用inserttodb(),就可以了。

#7


引用 6 楼 vieri_ch 的回复:
你先调用OnInitADOConn(LPCTSTR ConnStr) 连接数据库

然后循环调用inserttodb(),就可以了。


小弟是初学者,不太明白循环调用inserttodb(),是怎样实现的?

#8


你第一次调用OnInitADOConn,是在什么时候?
一般,只要在程序启动的时候,调用就行了,m_pConnection就已经是一个已连接的智能指针对象。
以后就直接调用inserttodb。应该没问题。


OnInitADOConn,至少要被调用一回。inserttodb,不应该被放在OnInitADOConn这个方法中。应该移除

#9


引用 8 楼 vieri_ch 的回复:
你第一次调用OnInitADOConn,是在什么时候?
一般,只要在程序启动的时候,调用就行了,m_pConnection就已经是一个已连接的智能指针对象。
以后就直接调用inserttodb。应该没问题。


OnInitADOConn,至少要被调用一回。inserttodb,不应该被放在OnInitADOConn这个方法中。应该移除


第一次调是放在Button中,点一下就调用了.

然后第二个button执行的inserttodb,就报错了,把inserttodb放在oninitadoconn中就可以了.

oninitadoconn放在启动时和放在第一个button中一样,第二个在执行了第一个按钮的oninitadoconn后还是不能单独执行inserttodb方法,郁闷.

#10


vieri_ch,我又试了下,这两个不能分开,第二个必须依托第一个,不执行链接不能inserttodb,否则会报错.
说"运行时必须手工的方法退出"

#11


m_pConnection->ConnectionString = _bstr_t(str);
m_pConnection->CursorLocation=  adUseClient;


  strSQL.Format("insert into Bigtype(name) values ('%s')",m_name); 
  m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);

insert语句不返回记录集, 在InsertToDb中不用创建这个对象了,而且对于返回的记录集,用完之后,要close 

#12


引用楼主 liulcsy 的回复:
当ADO用_ConnectionPtr链接成功以后,是不是再用_RecordsetPtr去操作数据库时,每一次操作是不是都需要再用ConnectionPtr链接一次,我每一次RecordsetPtr时都需要用ConnectionPtr去链一遍数据库,请问大家也是这样做的吗?

其实定义一个_ConnectionPtr对象就可以了,数据库连接成功后,用定义的_ConnectionPtr对象调用OpenRecordSet()函数就可以了取得SQL语句指定的记录集了(SQL语句作为OpenRecordSet函数的参数传入)。

#13


当然也需要定义一个_RecordsetPtr对象来接收上面返回的记录集。

#14


学习了。。。。

#15


连接数据库是很费时间的。

在应用程序初始化或是某个恰当时机连接数据库,然后就可以一直使用这个数据库连接了。

#16


连接一次 不关闭就一直可以用的

#17


用 ADO.state()看看状态。
PTR都是智能指针,每次调用都要RElease();
你就用原始类型不行吗?
调用一次然后不释放,自己规定释放。

#18


我怀疑你说的两个按钮不在同一个作用域,也就是说你在第一个按钮中创建了数据库连接对象,而第二个按钮中访问不到这个对象。所以你调用inserttodb()的时候失败,因为不存在数据库连接对象。而你把创建了数据库连接对象跟inserttodb()放在一起那绝对是没问题的。
我觉得你应该把在第一个按钮中创建了数据库连接对象通过全局变量传给第二个按钮中的连接对象就好了。
最好能把你的调用上面函数的区域代码贴出。

#19


补充下:ADOConn这个对象必须是两个按钮都可以看的到的。
建议你查下是否把它定义成了按钮内的对象了。

#20