我最近写语音的程序,要为每个语音通道分配两个m_pRecordset,来处理数据库,所以我定义了如下:m_pRecordset1 = new _RecordsetPtr[ TotalTrunk ] ;
m_pRecordset2 = new _RecordsetPtr[ TotalTrunk ] ;
for( i=0; i<TotalTrunk; i++ )
{
m_pRecordset1[i].CreateInstance("ADODB.Recordset
m_pRecordset2[i].CreateInstance("ADODB.Recordset");//创建纪录集对象实例
}然后写了一个函数,不知道如何传递m_pRecordset1[i]或m_pRecordset2[i]做为参数,请大虾帮帮小弟~下面是小弟写的,在调用时出错了,估计是参数问题
void ExecuteSQL(_ConnectionPtr m_pConnection, _RecordsetPtr m_pRecordset, CString strSQL)
{
BSTR bstrSQL=strSQL.AllocSysString();
try
{
if(m_pRecordset->State)
m_pRecordset->Close();
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error error)
{
CString errorMessage;
errorMessage.Format("%s",(LPTSTR)error.Description());
::AfxMessageBox(errorMessage);
}
}
m_pRecordset2 = new _RecordsetPtr[ TotalTrunk ] ;
for( i=0; i<TotalTrunk; i++ )
{
m_pRecordset1[i].CreateInstance("ADODB.Recordset
m_pRecordset2[i].CreateInstance("ADODB.Recordset");//创建纪录集对象实例
}然后写了一个函数,不知道如何传递m_pRecordset1[i]或m_pRecordset2[i]做为参数,请大虾帮帮小弟~下面是小弟写的,在调用时出错了,估计是参数问题
void ExecuteSQL(_ConnectionPtr m_pConnection, _RecordsetPtr m_pRecordset, CString strSQL)
{
BSTR bstrSQL=strSQL.AllocSysString();
try
{
if(m_pRecordset->State)
m_pRecordset->Close();
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error error)
{
CString errorMessage;
errorMessage.Format("%s",(LPTSTR)error.Description());
::AfxMessageBox(errorMessage);
}
}
解决方案 »
- VC中自定义结构体问题?
- 在MFC中从打开文件对话框中选择文件如何在页面中显示缩略图,在线等
- 各位过来帮帮忙求And的问题
- 在一个对话框内调用另一个对话框之后,怎样摧毁原来的对话框?
- 感谢Atomictry,请进来拿分!
- 求<COM技术内幕>附带光盘,vcleaner(我没做大哥已经很久了.......)老兄听说你有,给我一份吧,谢了。
- 关于写入数据时的更新问题(Update)
- 在vc中调用ado如何判断某field对象为空
- VC写DLL用VB调用(我怎么办呀?)
- 高难度的VC控件
- 下面的2个函数输出到打印机上为什么不同?
- 我想在view里面显示一张jpg的图象,看了好多代码,为什么那么麻烦呢,有没有更好的办法?
_ConnectionPtr & m_pConnection, _RecordsetPtr & m_pRecordset然后调用的时候,
ExecuteSQL(m_pConnection, m_pRecordset2[1], "Select * …………")
这句有没有问题呀?是不是改为
if(m_pRecordset->State())
我试过,编译没错误,警告如下:
warning C4786: '__unwindfunclet$?ExecuteSQL@@YAXAAV?$_com_ptr_t@V?$_com_IIID@U_Connection@@$1?_GUID_00000550_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@AAV?$_com_ptr_t@V?$_com_IIID@U_Recordse
t@@$1?_GUID_00000556_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@VCString@@@Z$7' : identifier was truncated to '255' characters in the debug information然后运行时调用函数出错.是参数问题,函数体是没有问题的!
应该是_RecordsetPtr * m_pRecordset1的哦还有,执行到哪出错了??
跟踪到了吗??
_RecordsetPtr *m_pRecordset1;
_RecordsetPtr *m_pRecordset2;ExecuteSQL是写在一个自定义单元中,但我这样声明了的:
extern _RecordsetPtr *m_pRecordset1;
extern _RecordsetPtr *m_pRecordset2;ExecuteSQL执行时出错,就算没有任何语句也会出错,(但是里面的代码绝对没有错的,因为我如果不用数组,就只定义_RecordsetPtr m_pRecordset变量是成功的!),所以我认为是参数有问题如果这样定义ExecuteSQL(_ConnectionPtr &m_pConnection, _RecordsetPtr &m_pRecordset, CString strSQL)
那调用时如果函数体为空语句就不会出错,但如果执行无论哪一句(其实就是两句,一句是判断是否打开,一句是返回数据集)就会出错
_RecordsetPtr * m_pRecordset1;BOOL CAdoAccessDlg::OnInitDialog()
{
m_pConnection.CreateInstance(_uuidof(Connection)); m_pConnection->Open(…………);
m_pRecordset1 = new _RecordsetPtr[ 5 ] ; for(int i=0; i<5; i++ )
{
m_pRecordset1[i].CreateInstance("ADODB.Recordset");
}
}
void CAdoAccessDlg::ExecuteSQL(_ConnectionPtr &pConnection, _RecordsetPtr &pRecordset)
{
_variant_t RecordsAffected; if(pRecordset->State)
pRecordset->Close(); pRecordset = pConnection->Execute (_bstr_t("SELECT * FROM StudentInfo") , &RecordsAffected , adCmdUnknown);
}void CAdoAccessDlg::OnButton1()
{
ExecuteSQL(m_pConnection,m_pRecordset1[2]);
DataView(m_pRecordset1[2]);}DataView(_RecordsetPtr pRecordset)
dataview是用来显示纪录集中的数据的,呵呵void CAdoAccessDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
if(m_pConnection->State)
{
m_pConnection->Close();
} m_pConnection= NULL; for(int i=0; i<5; i++ )
{
if(m_pRecordset1[i]->State)
{
m_pRecordset1[i]->Close();
} m_pRecordset1[i]= NULL;
}
delete [] m_pRecordset1;
}
:)
pRecordset->Open(_bstr_t("SELECT * FROM StudentInfo"),(IDispatch*)m_pConnection,
adOpenDynamic,adLockOptimistic,adCmdText);再好好看看你的代码吧
偶上班用qq不方便的,呵呵
_ConnectionPtr m_pConnection;然后在其他了里面这样来获取该指针:
CTestApp *pApp=(CTestApp *)AfxGetApp();
_ConnectionPtr m_pConn;
m_pConn=pApp->m_pConnection;
然后你直接用m_pConn就可以了。
其实对于你来说是个简单问题,我可搞了两天啦~~郁闷呀~
获得主窗口的指针
你的ExecuteSQL是个全局函数??
首先,全局函数的定义最好放在cpp里面然后,你在你的类里可以直接调用这个ExecuteSQL的啊
#include "AdoAccess.h"void ExecuteSQL(_ConnectionPtr &pConnection, _RecordsetPtr &pRecordset)
{
_variant_t RecordsAffected;
if(pRecordset->State)
pRecordset->Close(); //pRecordset = pConnection->Execute (_bstr_t("SELECT * FROM StudentInfo") , &RecordsAffected , adCmdUnknown); pRecordset->Open(_bstr_t("SELECT * FROM StudentInfo"),(IDispatch*)pConnection,
adOpenDynamic,adLockOptimistic,adCmdText);}然后
void CAdoAccessDlg::OnButton1()
{
ExecuteSQL(m_pConnection,m_pRecordset1[2]);
DataView(m_pRecordset1[2]);
}
还是ok
我把那个
CAdoAccessDlg::ExecuteSQL删了
你学我那样,做个简单的基于对话框的工程,然后去做一下
好好体会一下
然后再改你现在用的那个工程一步一步来
一下子上去改的话,可能会比较麻烦的
你也可以建个db.h文件试试
t@@$1?_GUID_00000556_0000_0010_8000_00aa006d2ea4@@3U__s_GUID@@A@@@@VCString@@@Z$7' : identifier was truncated to '255' characters in the debug information
还有,你可不可以把以下代码封装在DB.H中啊(名为openDatabase)?我不知道如何传递数组参数CString strConnection("driver={SQL Server};Server=QQ;database=ivr"); m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->Open((_bstr_t)strConnection,"","",adModeUnknown);
m_pRecordset1 = new _RecordsetPtr[ 60 ] ;
m_pRecordset2 = new _RecordsetPtr[ 60 ] ;
for( int i=0; i<60; i++ )
{
m_pRecordset1[i].CreateInstance("ADODB.Recordset");
m_pRecordset2[i].CreateInstance("ADODB.Recordset");
}
这一块可以放到db.h的某个函数中做法和你那个execsql什么的函数一样,用引用作为参数
就是把app中的那个connct传递进来连接m_pRecordset1 = new _RecordsetPtr[ 5 ] ;这个建议在主程序里面开在db。h中开,不是很好,
因为你到时候还要delete,你放在db中,就不好控制了
而且传递指针比较麻烦的如果你一定要放在DB.H中
那么写个函数
里面是
m_pRecordset1 = new _RecordsetPtr[ 5 ] ;for(int i=0; i<5; i++ )
{
m_pRecordset1[i].CreateInstance("ADODB.Recordset");//创建纪录集对象实例
}
然后return m_pRecordset1然后通过这个返回值操作那些纪录集
不过要记得最后一定要delete,不然内存泄漏