写了个类,在dll中, 这个类中有个查询数据库的函数,查询数据后,把结果存储在vector中,供其他程序调用,也就是说,我在写dll的时候压根就不知道字段有几个,表是什么,
都是由外界传参数。代码如下:int i; vector<_RecordPtr> result; 还是vector<_bstr_t>result; //保存每条记录 m_pRes.CreateInstance(_uuidof(Recordset)); m_pRes->Open(_bstr_t(sql),m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
//存储字段名字
for(i=0;i<m_pRes->Fields->GetCount();i++)
{
column_name.push_back(m_pRes->Fields->GetItem( (_bstr_t)i )->Name ); //获取列名(即字段名)
} //存储每一条记录接下来的代码如何写? 可以获取字段名吗?
我不知道该如何存储记录?帮忙解决一下。有个疑问: 我定义一个vector来保存每条记录,是不是有问题,或者说:操作性不强,该改成来保存每条记录中的一个字段值。可是这样一来,我不并不知道有多少列名,字段,我就不能为每一列定义个vector了
都是由外界传参数。代码如下:int i; vector<_RecordPtr> result; 还是vector<_bstr_t>result; //保存每条记录 m_pRes.CreateInstance(_uuidof(Recordset)); m_pRes->Open(_bstr_t(sql),m_pConn.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
//存储字段名字
for(i=0;i<m_pRes->Fields->GetCount();i++)
{
column_name.push_back(m_pRes->Fields->GetItem( (_bstr_t)i )->Name ); //获取列名(即字段名)
} //存储每一条记录接下来的代码如何写? 可以获取字段名吗?
我不知道该如何存储记录?帮忙解决一下。有个疑问: 我定义一个vector来保存每条记录,是不是有问题,或者说:操作性不强,该改成来保存每条记录中的一个字段值。可是这样一来,我不并不知道有多少列名,字段,我就不能为每一列定义个vector了
解决方案 »
- 求助!怎样获取对话条中Picture控件的指针、句柄,什么都行!
- VC执行问题
- 【调查】放分了,有几个曾经摆过地摊的
- 请高手进来
- 请推荐几本VC入门书
- 写BMP文件时,左右对调是怎么回事
- 中国的非典型性肺炎大有流行全国的势头~!!!
- 用 waveInOpen 打开声卡的时候的 DeviceID 是使用 WAVE_MAPPER(-1),还是用 0?还是要用 waveInGetNumDevs() 取得可用线路然后用 waveI
- ole db,odbc和dao到底有何区别?请大家赐教!
- 关于DataGrid使用的问题
- LARGE_INTEGER怎样互相赋值?
- 在XP系统下调用::SQLDisconnect没有返回,WIN7下则OK
CRecordset Rs1(conn); //记录集,conn为CDatabase,已经打开的连接
Rs1.Open(2,L"select * from table",4); //打开表
int iCount=Rs1.GetODBCFieldCount(); //获得字段总数
CStringArray fldName; //字符串数组,用来保存字段
CODBCFieldInfo fInfo; //CODBCFieldInfo 结构,字段信息
for(int i=0;i<iCount;i++){
Rs1.GetODBCFieldInfo(i,fInfo);
fldName.Add(fInfo.m_strName); //获得字段名
}
Rs1.Close();
这个只是获取一条记录中的一个字段值, 我要整条记录
{
std::vector<std::vector<CString> > table;
if(SUCCEEDED(::CoInitialize(NULL)))
{
if(1)
{
_ConnectionPtr PConn;
HRESULT hr;
hr = PConn.CreateInstance(_T("ADODB.Connection")); if(SUCCEEDED(hr))
{
try
{
_RecordsetPtr PRs(_T("ADODB.Recordset"));
PConn->Open((_bstr_t)LocalConnStr,_T(""),_T(""),adModeUnknown);
_variant_t RecordsAffected;
_variant_t str_val;
PRs=PConn->Execute((_bstr_t)SQL,&RecordsAffected,adCmdText);
while(!PRs->adoEOF)
{
std::vector<CString> rs;
int cols=PRs->GetFields()->Count;
for(int i=0;i<cols;i++)
{
CString val;
str_val = PRs->GetCollect(long(i));
switch(str_val.vt)
{
case VT_NULL:
val=_T("");
break;
case VT_DATE:
SYSTEMTIME systime;
VariantTimeToSystemTime(str_val.date,&systime);
val.Format(_T("%02d-%02d-%02d %02d:%02d:%02d"),systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond);
break;
default:
val= CString((char *)(_bstr_t)str_val);
break;
}
/* if (str_val.vt == VT_NULL)
val=_T("");
else
val= CString((char *)(_bstr_t)str_val);*/
rs.push_back(val);
}
table.push_back(rs);
PRs->MoveNext();
} PRs->Close();
/* PRs.Release();
PRs=NULL; */
}
catch(_com_error e) //异常
{
CString Data;
Data.Format(_T("connect database error; %s\n"),(char *)e.ErrorMessage());
}
//PConn->Close();
/* PConn.Release();
PConn=NULL;*/
}
}
::CoUninitialize();
}
return table;
}
Rs1.GetODBCFieldInfo(i,fInfo);
CString strValue; //字段值
Rs1.GetFieldValue(strValue,fInfo.m_strName); //fInfo.m_strName为字段名
fldName.Add(strValue); //获得字段名
}
但你封装到 动态库里面,返回 vector 类型不合适吧,其他语言如何调用?
最好返回 XML 格式化的字符串。
实在不行,有没有替代的方法,,我不可能为每列定义个vector啊?我也不知道有多少列?
对吧所以我才想将整条记录给存储, 然后将vector设置成public ,然然后对话框类去访问它。不要说:为什么不在对话框类中写这个函数, 要求是这样的 ,数据库操作作为一个dll
比如
<id>001</id>
<name>张三</name>
<age>19岁</age>DLL里面再写一个解析函数。 CDatabase *conn;
conn->OpenEx("连接串")
CRecordset Rs1(conn); //记录集,conn为CDatabase,已经打开的连接
Rs1.Open(2,L"select * from table",4); //打开表
int iCount=Rs1.GetODBCFieldCount(); //获得字段总数
CStringArray fldName; //字符串数组,用来保存字段
CStringArray fldValue; //字符串数组,用来保存字值
CODBCFieldInfo fInfo; //CODBCFieldInfo 结构,字段信息
for(int i=0;i<iCount;i++){ //循环获得所有字段值
Rs1.GetODBCFieldInfo(i,fInfo);
fldName.Add(fInfo.m_strName); //获得字段名
CString fldValue;
Rs1.GetFieldValue(strValue,fInfo.m_strName); //获得字段值
fldValue.Add(strValue); //字段值加到数组
}
Rs1.Close();