刚才的帖子没有说清楚问题,重新发一遍。我需要将数据存入数据库,在将CString类型转换为_bstr_t类型时,字符串的长度被自动截短了。程序及调试结果如下://将单个实验结果存入数据库
void CResultData::SaveResult(SAVEMCU &aSaveMcu)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
...
CString strSQL;
////////////////////////////////////////////////////////////////////////////
//主要看这里!!!
strSQL.Format("INSERT INTO Result (Tid,Name,Field,PicNum,Time,EnK1,EnK2,EnK3,EnK4,ReK1,ReK2,ReK3,ReK4,ReTr,ReVd) VALUES(%d,\'%s\',\'%s\',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",nResult,strName,strField,nNumber,nTime,bKey1,bKey2,bKey3,bKey4,bRespondKey1,bRespondKey2,bRespondKey3,bRespondKey4,bTrue,bValid); _bstr_t vSQL(strSQL.AllocSysString(),FALSE);
//问题出自上面!!!
////////////////////////////////////////////////////////////////////////////
//执行INSERT语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();}m_AdoConn是我自己编的一个函数,用于连接数据源和执行SQL语句。调试发现,strSQL和转换后的vSQL里的字符串不一样,分别为:
strSQL == {"INSERT INTO Result (Tid,Name,Field,PicNum,Time,EnK1,EnK2,EnK3,EnK4,ReK1,ReK2,ReK3,ReK4,ReTr,ReVd) VALUES(2,'陈劲','A',1,38550,1,0,0,0,0,1,1,0,0,1)"}
转换后,
vSQL == {"INSERT INTO Result (Tid,Name,Field,PicNum,Time,EnK1,EnK2,EnK3,EnK4,ReK1,ReK2,ReK3,ReK4,ReTr,ReVd) VALUES(2,'陈劲','A',1,38550,1," (1)}转换成_bstr_t后,INSERT语句被自动截短了,是不是由于_bstr_t有长度限制呢?如果是这样,我应该怎样回避这个问题?如果不是,那是由于什么问题呢?(按照前面的回复,我试验了FreeSysString和强制类型转换,问题仍然没有改善)
void CResultData::SaveResult(SAVEMCU &aSaveMcu)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
...
CString strSQL;
////////////////////////////////////////////////////////////////////////////
//主要看这里!!!
strSQL.Format("INSERT INTO Result (Tid,Name,Field,PicNum,Time,EnK1,EnK2,EnK3,EnK4,ReK1,ReK2,ReK3,ReK4,ReTr,ReVd) VALUES(%d,\'%s\',\'%s\',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)",nResult,strName,strField,nNumber,nTime,bKey1,bKey2,bKey3,bKey4,bRespondKey1,bRespondKey2,bRespondKey3,bRespondKey4,bTrue,bValid); _bstr_t vSQL(strSQL.AllocSysString(),FALSE);
//问题出自上面!!!
////////////////////////////////////////////////////////////////////////////
//执行INSERT语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();}m_AdoConn是我自己编的一个函数,用于连接数据源和执行SQL语句。调试发现,strSQL和转换后的vSQL里的字符串不一样,分别为:
strSQL == {"INSERT INTO Result (Tid,Name,Field,PicNum,Time,EnK1,EnK2,EnK3,EnK4,ReK1,ReK2,ReK3,ReK4,ReTr,ReVd) VALUES(2,'陈劲','A',1,38550,1,0,0,0,0,1,1,0,0,1)"}
转换后,
vSQL == {"INSERT INTO Result (Tid,Name,Field,PicNum,Time,EnK1,EnK2,EnK3,EnK4,ReK1,ReK2,ReK3,ReK4,ReTr,ReVd) VALUES(2,'陈劲','A',1,38550,1," (1)}转换成_bstr_t后,INSERT语句被自动截短了,是不是由于_bstr_t有长度限制呢?如果是这样,我应该怎样回避这个问题?如果不是,那是由于什么问题呢?(按照前面的回复,我试验了FreeSysString和强制类型转换,问题仍然没有改善)
解决方案 »
- 在动态库中创建的线程,当动态库卸载时,系统是如何处理这些线程的?
- 大家好,我真的没分了,前辈们想问下我该怎么继续学习呢???
- 菜鸟问~~~搞开发要不要学数据库?
- ATL怎么传一个字符串出来,让网页中的javascript 调用?
- csdn网站上保存的*.xml网页用什么可以浏览阿
- 有谁知道如何取bitmap的width和height?
- 怎么修改一条记录
- windows media player控件能打开的url总共有哪些
- 在线跪求串口程序接收数据一段时间后出现乱码
- dll里需要一个CxxxDLG 的指针,把CxxxDLG.h 加进去之后,编译dll不认识mfc 里的类型
- 奇怪的问题:VC用odbc向access空表中加入第一条数据总会出错?
- 请教私网的机器和外网主机连接失败的问题
UpdateData(TRUE);
sql.Format("insert into [StandardVisit] values(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',%f,\'%s\',\'%s\',\'%s\',\'%d-%d-%d\',%f)",m_zone,grade,m_devcode,pole,ins,m_transname,m_distance,m_standcode,m_long,m_lat,m_colltime.GetYear(),m_colltime.GetMonth(),m_colltime.GetDay(),m_standistance);
MessageBox(sql);
m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);上面是从我以前的代码里取出来的,完全可以执行。强制转换!
强制转换应该没有问题的。
//// 执行SQL语句
BOOL ADOConn::ExecuteSQL(CString strSQL)
{
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
///////////////////////////////////////////////////////////////////////////
//主要问题如下
m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText);
///////////////////////////////////////////////////////////////////////////
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}结果和上面的帖子一样,仍然不全(最后的一段自动被截去了,然后加上了"(1)".laiyiling(最熟悉的陌生人)先生程序里的字符串长度很长吗?
我怀疑是不是转换后的字符串限制长度?
CString sTemp;
for (int i = 0; i < 1000; i ++) //将sTemp添充1000个字符
{
sTemp += "x";
}
_bstr_t var = (_bstr_t)sTemp; //强制转换成_bstr_t
//在这里Watch窗口就是显示的是"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(1)"呵呵,和你显示的一样,也是以“(1)”结尾,但是不是被截断了呢?
int ss = var.length(); //ss = 1000,表明并没有被截断*/
你看看SQL语句执行的结果怎么样?应该是看不到,但都还在的。