我收到一CString类型的值(例子值:“ECA382975611503009123456780D8613000000000”)通过代码解析后插入到数据库中。数据库的表名为info2,字段类型分别为:
C_num, Center, Dir,Now, State, Effect    为nvarchar类型
Today                                     为datatime类型
La, Lo, v, Angle                          为float类型
我插入数据库中的时候总是出现错误,对话框提示为“将截断字符串或二进制数据”请大家帮我调试错误并告知原因。
/*以下为程序代码*/
CString info = m_dataInfo;//该处为用一临时变量获得该CString类型的值
        //以下为获得系统时间的值
int m_nHour ,m_nMinute ,m_nSecond ,m_nYear ,m_nMonth ,m_nDay;
CString m_state ,m_effect ,m_today ,m_now ,m_Cnum,m_Dir;
CString m_Lo ,m_La ,m_v ,m_Angle,m_Centernum;
SYSTEMTIME sysTm;
::GetLocalTime(&sysTm);
m_nYear = sysTm.wYear;
m_nMonth = sysTm.wMonth;
m_nDay = sysTm.wDay;
m_nHour = sysTm.wHour;
m_nMinute = sysTm.wMinute;
m_nSecond = sysTm.wSecond;
CString a,b,c,d,e,f;
a.Format(_T("%i"),m_nYear);
b.Format(_T("%i"),m_nMonth);
c.Format(_T("%i"),m_nDay);
m_today = a +  "-" + b + "-" + c;                 //**日期
d.Format(_T("%i"),m_nHour);
e.Format(_T("%i"),m_nMinute);
f.Format(_T("%i"),m_nSecond);
m_now = d +  "时" + e + "分" + f + "秒";          //**时间
if(info.Mid(0,2) == "EC")
{
            m_state = "EC"; }
else
    m_state = "11"; CString aa = info.Mid(3,2);
CString bb = info.Mid(5,2);
CString cc = info.Mid(7,3);
float longi = float(atoi(aa) + atoi(bb)/60.0 + atoi(cc)/3600.0);
        m_La.Format(_T("%10.6f"),longi); CString dd = info.Mid(10,3);
CString ee = info.Mid(13,2);
CString ff = info.Mid(15,3);
float lati = float(atoi(dd) + atoi(ee)/60.0 + atoi(ff)/3600.0);
        m_Lo.Format(_T("%10.6f"),lati); CString m_v1 = info.Mid(18,3);
CString m_v2 = info.Mid(21,1);
float gg = float(atoi(m_v1) + atoi(m_v2) / 10.0);
m_v.Format(_T("%10.1f"),gg); CString m_Angle1 = info.Mid(22,3);
CString m_Angle2 = info.Mid(25,1);
float hh = float(atoi(m_Angle1) + atoi(m_Angle2) / 10.0);
m_Angle.Format(_T("%10.1f"),hh);  
if( hh >= 0 && hh <= 22.5)
{
    m_Direction = "zbfx";
}
else
    m_Direction = "xbfx"; m_Cnum = info.Mid(30,11);
        m_Centernum = "";
_variant_t strQuery; strQuery = "insert into info2 (C_num, Today, Now, State, Effect, La, Lo, v, Angle, Center, Dir) values ('"+m_Cnum+"', '"+m_today+"', '"+m_now+"', '"+m_state+"', '"+m_effect+"', '"+m_La+"', '"+m_Lo+"', '"+m_v+"', '"+m_Angle+"', '"+m_Centernum+"', '"+m_Dir+"')"; theApp.ADOExecute(theApp.m_pADOSet,strQuery);
}

解决方案 »

  1.   

    CString aa = info.Mid(3,2);这可能是错误的,因为一个整型变为字符串是两位么?
      

  2.   

    /*上面代码后面多了个括号,请参考以下代码*/
    CString info = m_dataInfo;//该处为用一临时变量获得该CString类型的值
    //以下为获得系统时间的值
    int m_nHour ,m_nMinute ,m_nSecond ,m_nYear ,m_nMonth ,m_nDay;
    CString m_state ,m_effect ,m_today ,m_now ,m_Cnum,m_Dir;
    CString m_Lo ,m_La ,m_v ,m_Angle,m_Centernum;
    SYSTEMTIME sysTm;
    ::GetLocalTime(&sysTm);
    m_nYear = sysTm.wYear;
    m_nMonth = sysTm.wMonth;
    m_nDay = sysTm.wDay;
    m_nHour = sysTm.wHour;
    m_nMinute = sysTm.wMinute;
    m_nSecond = sysTm.wSecond;
    CString a,b,c,d,e,f;
    a.Format(_T("%i"),m_nYear);
    b.Format(_T("%i"),m_nMonth);
    c.Format(_T("%i"),m_nDay);
    m_today = a +  "-" + b + "-" + c;                 //**日期
    d.Format(_T("%i"),m_nHour);
    e.Format(_T("%i"),m_nMinute);
    f.Format(_T("%i"),m_nSecond);
    m_now = d +  "时" + e + "分" + f + "秒";          //**时间if(info.Mid(0,2) == "EC")
    {
        m_state = "EC";
    }
    else
        m_state = "11";CString aa = info.Mid(3,2);
    CString bb = info.Mid(5,2);
    CString cc = info.Mid(7,3);
    float longi = float(atoi(aa) + atoi(bb)/60.0 + atoi(cc)/3600.0);
    m_La.Format(_T("%10.6f"),longi);CString dd = info.Mid(10,3);
    CString ee = info.Mid(13,2);
    CString ff = info.Mid(15,3);
    float lati = float(atoi(dd) + atoi(ee)/60.0 + atoi(ff)/3600.0);
    m_Lo.Format(_T("%10.6f"),lati);CString m_v1 = info.Mid(18,3);
    CString m_v2 = info.Mid(21,1);
    float gg = float(atoi(m_v1) + atoi(m_v2) / 10.0);
    m_v.Format(_T("%10.1f"),gg);CString m_Angle1 = info.Mid(22,3);
    CString m_Angle2 = info.Mid(25,1);
    float hh = float(atoi(m_Angle1) + atoi(m_Angle2) / 10.0);
    m_Angle.Format(_T("%10.1f"),hh);  

    if( hh >= 0 && hh <= 22.5)
    {
        m_Direction = "zbfx";
    }
    else
        m_Direction = "xbfx";m_Cnum = info.Mid(30,11);
    m_Centernum = "";
    _variant_t strQuery;strQuery = "insert into info2 (C_num, Today, Now, State, Effect, La, Lo, v, Angle, Center, Dir) values ('"+m_Cnum+"', '"+m_today+"', '"+m_now+"', '"+m_state+"', '"+m_effect+"', '"+m_La+"', '"+m_Lo+"', '"+m_v+"', '"+m_Angle+"', '"+m_Centernum+"', '"+m_Dir+"')";theApp.ADOExecute(theApp.m_pADOSet,strQuery);
      

  3.   

    broadoceans:
    CString aa = info.Mid(3,2);这句话没错啊,是指aa取字符串info中从第四个字节开始取两个字节做为aa的值。
    比如
    CString info ="123456789";
    CString aa = info.Mid(3,2);
    那么
    aa = "45";
      

  4.   

    我是说这和放进去的长度不一样。
    所以当你取到汉字时,可能取了一半。
    这就会出现上面的错误。Do you understand what I've said?
      

  5.   

    我如果把数据库中对应的字段的类型改为nvarchar长度为15的话,这是不出问题了,可是插入m_v和m_Angle就有问题了.我只想用FLOAT类型插入,另外不可能有汉字啊.
    本人愚笨请说详细点好吗,谢谢
      

  6.   

    “将截断字符串或二进制数据”
    只有一种可能内容比字段长度长需要截断内容老兄你为什么总是用这种笨格式很难看很难维护
    strQuery = "insert into info2 (C_num, Today, Now, State, Effect, La, Lo, v, Angle, Center, Dir) values ('"+m_Cnum+"', '"+m_today+"', '"+m_now+"', '"+m_state+"', '"+m_effect+"', '"+m_La+"', '"+m_Lo+"', '"+m_v+"', '"+m_Angle+"', '"+m_Centernum+"', '"+m_Dir+"')";
    用这种吧
    strQuery.format( "insert info t2 (a,b,c,d,e,f) vaules 
    ('%s','%s','%s',%f,%f)",cA,cB,cC,cD,fE,fF);
      

  7.   

    strQuery是什么类型声明的时候是
    CString or _variant_t ?
      

  8.   

    没有正确答案吗?
     windcao:
    Format不是_variant_t 的成员
    如果用CString strQuery;
    那么你这句话strQuery.format( "insert info t2 (a,b,c,d,e,f) vaules 
    ('%s','%s','%s',%f,%f)",cA,cB,cC,cD,fE,fF);
    参数又不对
      

  9.   

    按windcao的方法,编译通过了,运行也没问题,不过数据库中却没有数据,说明,数据没插入到数据库中.请帮我找找原因.
      

  10.   

    你把这条插入语句直接在查询分析器里执行,看能不能插入
    insert into info2 (C_num, Today, Now, State, Effect, La, Lo, v, Angle, Center, Dir) values ('13000000000', '2003-12-25', '14时41分44秒', 'EC', '', ' 38.693333', '115.052500', '     123.4', '     567.8', '', '')
      

  11.   

    pan7861(风间火月) 真不好意思没说清楚
    我用的是 CString strSql
    varSql
    可以 strSql.Format (...);
    varSql.SetString (strSql.GetBuffer(0));
    我感觉好些,你爱怎么用就怎么用吧
    参数怎么错了?
      

  12.   

    执行插入的时候try一下吧 
    这应该是数据库内部的错误