mySQL.Format(_T("update %s set name=\'%s\',tele =\'%s\',address=\'%s\',email=\'%s\' where personID=\'%s\'"),tableName,name,tele,addr,email,personID);
mysql_real_query(&(pDlg->mysql),(const char *)mySQL.GetBuffer(),(UINT)mySQL.GetLength())!=0
表示这样怎么都执行不了,我试了,是mySQL为CString的原因,要是char *的话,就成功,
我怎么把CString的内容拷贝到char[]里面去啊

解决方案 »

  1.   

    多看看msdn,那里面写的挺全面的
    试试getbuffer什么的
      

  2.   

    试下这个CString::operator LPCTSTRoperator LPCTSTR ( ) const;返回值:返回一个指向字符串的数据的字符指针。说明:
    这个非常有用的强制操作符提供了一种非常有效的方法来访问存放在CString对象中的以空字符结尾的C字符串。此函数不拷贝字符而仅返回一个指针。如果你在获取指针之后修改此CString对象,则可能导致内存被重新分配,并使该指针无效。
      

  3.   

    #include <atlbase.h>USES_CONVERSION;
    T2A();
      

  4.   

    char   chs[100];
    CString   str( "134 ");
    sprintf(chs,str);void   CDlgcsdn20Dlg::OnButton2()  
    {
    char   chs[100];
    CString   str( "134 ");
    //sprintf(chs,str);
    strcpy(chs,str);} 
    楼主用这个吧
      

  5.   

    #include <afxpriv.h>char * ch;
    USES_CONVERSION;
    ch = T2A(CString);
      

  6.   

    我估计不是宽字符窄字符的问题,就算是,那么楼上的都讲的差不多了!我认为是mysql接口设计不好的原因,明明它需要一个字符串,自己又不会修改这个字符串,却将参数设计成了char*(正规的话应该是const char*),既然这样,建议楼上强转(因为mysql是肯定不会修改字符串的),如下:
    ..., (LPTSTR) (LPCTSTR) mySQL, ...如果还是无法编译,那就是宽字符与窄字符的问题了,上面已经有答案了。
      

  7.   

    直接用strcpy();函数就可以拷贝了
    如:
    char *pData = new char[mySQL.GetLength()+1];
    memset(pData,0,mySQL.GetLength()+1);
    strcpy(pData,mySQL);
      

  8.   

    如果是在VC6.0下,可以直接这样使用:
    char*ptr ; 
    CString str = "123" ;ptr = (LPSTR)(LPCTSTR)str ;  
      

  9.   

    mySQL.Format(_T("update %s set name=\'%s\',tele =\'%s\',address=\'%s\',email=\'%s\' where personID=\'%s\'"),tableName,name,tele,addr,email,personID);
    mysql_real_query(&(pDlg->mysql),(const char *)CStringA(mySQL),(UINT)mySQL.GetLength())!=0
      

  10.   

    strSQL.Format("select * from ...");
    m_pRecordset->Open(_variant_t(strSQL), m_pConnect.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);    我一直这样使用ADO连接和读写数据库操作
      

  11.   

    我用的VS2008,里面默认使用unicode。宽字符。不管你怎么改变指针,都不会转化成char*,T2A没试过,我把工程的字符集改成了多字符集,就好了
      

  12.   

    你百度一下 有很多关于CString 转char *,_tchar 的 
      

  13.   

    CString  unicode  ansi 是不同的 
     CString  转char*  得分情况转对于unicode 的代码,网上应该有 搜索一下
      

  14.   

    首先如果只转const char *的话,不用GetBuffer(),因为CString本身有(LPCTSTR)运算符重载,所以可以直接用。注意使用了GetBuffer()之后如果要用其它CString功能必须ReleaseBuffer恢复其自动管理。
    你在同一行里出现了GetBuffer()和GetLength()是不行的。
    另外就是ANSI和Unicode的问题。VS2008应该默认用的Unicode编码,不过转换很简单,无需WideCharToMultiByte等复杂方法。
    MYSQL应该用的ANSI编码。所以可以这样:
    CStringA mySQLA;
    mySQLA.Format("update %s set name=\'%s\',tele =\'%s\',address=\'%s\',email=\'%s\' where personID=\'%s\'",
                  tableName,
                  name,
                  tele,
                  addr,
                  email,
                  personID);
    mysql_real_query(&(pDlg->mysql),(LPCSTR)mySQLA,(UINT)mySQLA.GetLength()+1)!=0注意GetLength的返回大小不含\0
      

  15.   

    只有要按C风格修改(即非const的LPTSTR)CString,才需要GetBuffer
      

  16.   

    CString::operator LPCTSTRoperator LPCTSTR ( ) const;
      

  17.   

    我这么用过memcpy(chbuf, strInfo.GetBuffer, strInfo.GetLength()+1)
      

  18.   

    如果用额外的char数组的话,直接用_tcscpy或者strcpy(对于ANSI)就可以了,无需memcpy,更不用GetLength
    注意memcpy或者strcpy得源地址都是const指针的,所以可以直接使用CString或CStringA的(LPCTSTR)或(LPCSTR)的运算符就可以了,不需要GetBuffer。只有你明确要按C风格去修改CString内容是才要用GetBuffer
      

  19.   

    Unicode下CString与char *转换 
    http://blog.csdn.net/gemmo/article/details/6799776
    希望对你有帮助。