ADO中数据类型转换的问题?

zhmyyp 2002-06-05 06:12:47
兄弟正在看VC中ADO数据库程序设计,深为其中的数据类型转换头疼不已,C++、ADO数据库类型、VC++类型之间的转换,不知哪位朋友能详细说说之间的转换,兄弟感激不尽。另,为什么MSDN中查不到ADO中的所有函数,例如ADO中RECORDSET对象的PUTCOLLECT()、GETCOLLECT()等函数。在此兄弟先谢谢了。



...全文
152 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
功名半纸 2002-06-06
看一下我这个帖子!
http://www.csdn.net/Develop/read_article.asp?id=13576
回复
jiayp004 2002-06-06
//利用ADO连接数据库,先进行初始化
_ConnectionPtr m_pConnection("ADODB.Connection");
_RecordsetPtr m_pRecordset("ADODB.Recordset");
//连接超时
m_pConnection->CommandTimeout=10;
m_InfoList.DeleteAllItems();

try {
m_pConnection->Open(WESTDSN,"","",adModeUnknown);
//连接叫作WestDevDSN的ODBC数据源
//注意:这是连接不需要用户ID或密码的open 函数
// 否则形式为 ->Open("DSN=test;uid=sa;pwd=123;","","",0);
// 执行SQL语句得到一个记录集把其指针赋值给m_pRecordset
CString strSql="SELECT key,parent,text,location FROM temp99 ";
CString add;
add.Format(" where location ='%s",tranStr);
strSql+= add;
strSql+="'";
// AfxMessageBox(strSql);
BSTR bstrSQL = strSql.AllocSysString();

m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenStatic,adLockOptimistic,adCmdText);
//打开数据集的三种方式
//adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
//adOpenStatic:静态,他可以得到记录个数

int parentNum =0; //父行政区级的代号
int keyNum = 0; //本项目的代号
CString csLocation = "";//行政区编号
DWORD locationKey = 0; //行政区编号,不要后边六个零


int count = 0;
CString strKey; //编号
CString strName; //名称

while(!m_pRecordset->adoEOF)//遍历所有记录
{

_variant_t KeyValue; //VARIANT数据类型,本项目的代号
_variant_t ParentValue; //父行政区级的代号
_variant_t TextValue; //行政区名称
_variant_t LocationValue;//行政区编号

KeyValue = m_pRecordset->GetCollect("key"); //按字段名得到字段值
ParentValue = m_pRecordset->GetCollect("Parent");//返回的是_variant_t类型
TextValue = m_pRecordset->GetCollect("text");//_variant_t 是Variant的包装类
LocationValue = m_pRecordset->GetCollect("location");


}
大致步骤:
回复
蒋晟 2002-06-06
_variant_t、_bstr_t是微软定义的类,里面定义了一大堆构造函数和操作符,可以和很多类型相互转换
回复
red-fly 2002-06-06
那位朋友能够说一说在VC++中用ADO写数据库程序的步骤?
Thank ypu!
回复
dnyz 2002-06-06
我一般用sql语句做,不用什么pucollect这种函数
//生成插入记录的SQL字符串
CString strNum;
CString cmd1=""; //字符串过长,需要连接两个CString对象
CString cmd="Update Measure Set ";
cmd+="[StartX]=" + m_StartX + ", ";
cmd+="[StartY]=" + m_StartY + ", ";
cmd+="[EndX]=" + m_EndX + ", ";
cmd+="[EndY]=" + m_EndY + ", ";
cmd+="[LenPixel]=" + m_Pixel + ", ";
cmd+="[LenMM]=" + m_mm + ", ";
cmd+="[LenInch]=" + m_Inch + ", ";
cmd+="[AreaRectPixel]=" + m_AreaRect_Pixel + ", ";
cmd+="[AreaRectMM]=" + m_AreaRect_MM + ", ";
cmd+="[AreaRectInch]=" + m_AreaRect_Inch + ", ";
cmd1+="[AreaCirPixel]=" + m_AreaCir_Pixel + ", ";
cmd1+="[AreaCirMM]=" + m_AreaCir_MM + ", ";
cmd1+="[AreaCirInch]=" + m_AreaCir_Inch + ",";
COleDateTime current;
current = COleDateTime::GetCurrentTime();
cmd1+="[SaveDate]='" + current.Format("%Y-%m-%d %H:%M:%S") + "' ";
strNum.Format("%d",m_ID);
cmd1+="Where ID=" + strNum;

//插入记录
m_pConnection->Execute((_bstr_t)(cmd+cmd1),NULL,adCmdText);
回复
zhmyyp 2002-06-06
请问_variant_t、_bstr_t 到底是怎么回事?谁能给我解释一下.
回复
cityyokel 2002-06-06
VariantToCtring(VARIANT var)
{
CString strValue;
_variant_t var_t;
_bstr_t bst_t;
CTime time_value;
COleCurrency var_currency;
//////////////////////////////////////////////////////////////////////////
int year,month,day;//获取当前日期
COleDateTime time;

//////////////////////////////////////////////////////////////////////////


switch(var.vt){
case VT_EMPTY: strValue = _T(""); break;
case VT_UI1: strValue.Format("%d", var.bVal); break;
case VT_I2: strValue.Format("%d", var.iVal); break;
case VT_I4: strValue.Format("%d", var.lVal); break;
case VT_R4: strValue.Format("%f", var.fltVal); break;
case VT_R8: strValue.Format("%f", var.dblVal); break;
case VT_CY:
var_currency = var;
strValue = var_currency.Format(0);
break;
case VT_BSTR:
var_t = var;
bst_t = var_t;
strValue.Format("%s", (const char *)bst_t);
break;
case VT_NULL: strValue = _T(""); break;
case VT_DATE:

//////////////////////////////////
time=COleDateTime(var.date);
year=time.GetYear();
month=time.GetMonth();
day=time.GetDay();
strValue.Format("%d-%d-%d",year,month,day);//格式化为年-月-日;
//////////////////////////////////
break;
case VT_BOOL: strValue.Format("%d", var.boolVal); break;
case VT_INT: strValue.Format("%d",var.intVal);break;
case VT_UINT:strValue.Format("%u",var.uintVal);break;

default: strValue = _T(""); break;
}
return strValue;

}


应该够你用的。
回复
firstyi 2002-06-06
//字符型的处理
m_kind=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("kind");
//数值型的处理
m_serial=m_pRecordset->GetCollect("serial").lVal ;
//日期型的处理
m_publishdata=m_pRecordset->GetCollect("publishdata").date;

_variant_t vbookname,vpublishdata;
vbookname=m_bookname ;
vpublishdata=m_publishdata ;
m_pRecordset ->PutCollect("serial",(long)1);
m_pRecordset ->PutCollect("bookname",vbookname);
m_pRecordset ->PutCollect("publishdata",vpublishdata);
回复
蒋晟 2002-06-05
Put和Get是存取Collect属性用的
非标准的类型转换都是显示写一个operator函数来实现的
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-06-05 06:12
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……