刚才的帖子没有说清楚问题,重新发一遍。我需要将数据存入数据库,在将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和强制类型转换,问题仍然没有改善)

解决方案 »

  1.   

    CString sql;
    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);上面是从我以前的代码里取出来的,完全可以执行。强制转换!
      

  2.   

    我估计楼主是直接放在Watch里面看的吧,那个里面显示字符串可只能显示一定长度哦,如果长度很长,会有显示不出来的部分。
    强制转换应该没有问题的。
      

  3.   

    的确是在Watch里面看的,我的两个变量都是在那里面,我用了一个加长的屏幕,Watch可以显示很长的字符串,上面的数值是我直接拷贝到这里的。应该不是看不全的问题。使用强制转换后的程序如下:
    //// 执行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(最熟悉的陌生人)先生程序里的字符串长度很长吗?
    我怀疑是不是转换后的字符串限制长度?
      

  4.   

    我试验了一下,字符串其实并没有被截断,是用Watch窗口时,并不能显示全部。
    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,表明并没有被截断*/
      

  5.   

    那只是你看到的结果,实际还在的,_bstr_t的长度问题以前讨论的结果是在两个G之内。你看不到的部分都还在,你可以用(LPCTSTR)转化一下再看结果。
    你看看SQL语句执行的结果怎么样?应该是看不到,但都还在的。