MFC中如何读取编辑框中的字符串,转换为CTime类型,然后插入到Access数据库中的CTime类型? 20
环境为VS2010,Access数据库中有一个CTime类型的字段,在MFC中读取一个编辑框(格式为“YYYY-MM-DD”)中的内容,然后插入到该数据库中,代码如下:/...
环境为VS2010,Access数据库中有一个CTime类型的字段,在MFC中读取一个编辑框(格式为“YYYY-MM-DD”)中的内容,然后插入到该数据库中,代码如下:
//首先将编辑框中的内容转换为CTime类型
CString sql;
int nYear, nMonth, nDay;
sscanf(m_normalDate, "%d-%d-%d", &nYear, &nMonth, nDay);
//m_normalDate为编辑框中的日期,CString类型
CTime time(nYear, nMonth, nDay);
//执行SQL语句
sql.Format(L"insert into 表 values('%①')", time);
m_db.ExecuteSQL(sql);
问题1:编辑框中CString类型转换为CTime类型的方法是否正确?
编译时报错:无法将sscanf函数中第一个参数从“CString”转换为“const char *”
我上网搜过了,试过const char * str = m_normalDate.GetBuffer(sizeof(m_normalDate));,还是不行
问题2:Access中为CTime类型,sql.Format(L"insert into 表 values('%①')", time);这句话中①处应该填入什么?或者有没有其他方式插入到数据库中。
多谢各位大神! 展开
//首先将编辑框中的内容转换为CTime类型
CString sql;
int nYear, nMonth, nDay;
sscanf(m_normalDate, "%d-%d-%d", &nYear, &nMonth, nDay);
//m_normalDate为编辑框中的日期,CString类型
CTime time(nYear, nMonth, nDay);
//执行SQL语句
sql.Format(L"insert into 表 values('%①')", time);
m_db.ExecuteSQL(sql);
问题1:编辑框中CString类型转换为CTime类型的方法是否正确?
编译时报错:无法将sscanf函数中第一个参数从“CString”转换为“const char *”
我上网搜过了,试过const char * str = m_normalDate.GetBuffer(sizeof(m_normalDate));,还是不行
问题2:Access中为CTime类型,sql.Format(L"insert into 表 values('%①')", time);这句话中①处应该填入什么?或者有没有其他方式插入到数据库中。
多谢各位大神! 展开
1个回答
推荐于2017-07-01
展开全部
1.Access数据库字段没有CTime类型,CTime是和MFC的日期时间控件对应的类型,Access数据库字段类型和时间相关的是DateTime,其入库insert语句和查询select结果都是字符串类型,也就是说如果你MFC程序界面上没有MFC的日期时间控件,你的程序中没必要出现CTime对象;
如果你的程序界面只有一个编辑框,即一个CString类型m_normalDate,那么char* std:string CString之间的转换遵循如下方式:
CString转char *
CString cstr;
char *p = (LPSTR)(LPCTSTR)cstr;
string 转 CString CString.Format(”%s”, string.c_str());//用string.c_str()要比string.data()好.
//c_str(),返回有”/0“的字符串数组,data(),返回没有”/0“的字符串数组
char 转 CString CString.format(”%s”, char*);
char 转 string string s(char *); //这是初始化,在不是初始化的地先要string.assign().
string 转 char* char *p = string.c_str();
CString 转 string string s(CString.GetBuffer());//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
那么解决第一个报错:
sscanf((LPSTR)(LPCTSTR)m_normalDate, "%d-%d-%d", &nYear, &nMonth, nDay);
或者
sscanf(m_normalDate.GetBuffer().c_str(), "%d-%d-%d", &nYear, &nMonth, nDay);
2.Access入库语句在DateTime类型时就是一个前后添加‘#’号的字符串,所以%①肯定是%s。
CTime time(nYear, nMonth, nDay);
CString dateTime("#");
dateTime+=time.Format("YYYY-mm-dd"));
dateTime+="#";
sql.Format(L"insert into tbl_Table values(%s)",(LPSTR)(LPCTSTR)dateTime);
insert into tbl_Table values(#2013-04-15 23:01#)"
"select date(field_name) from tbl_Table"
"select time(field_name) from tbl_Table"
"select Format(field_name, "yyyy-mm-dd") from tbl_Table"
"select Format(field_name, "hh:ss") from tbl_Table"
如果你的程序界面只有一个编辑框,即一个CString类型m_normalDate,那么char* std:string CString之间的转换遵循如下方式:
CString转char *
CString cstr;
char *p = (LPSTR)(LPCTSTR)cstr;
string 转 CString CString.Format(”%s”, string.c_str());//用string.c_str()要比string.data()好.
//c_str(),返回有”/0“的字符串数组,data(),返回没有”/0“的字符串数组
char 转 CString CString.format(”%s”, char*);
char 转 string string s(char *); //这是初始化,在不是初始化的地先要string.assign().
string 转 char* char *p = string.c_str();
CString 转 string string s(CString.GetBuffer());//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
那么解决第一个报错:
sscanf((LPSTR)(LPCTSTR)m_normalDate, "%d-%d-%d", &nYear, &nMonth, nDay);
或者
sscanf(m_normalDate.GetBuffer().c_str(), "%d-%d-%d", &nYear, &nMonth, nDay);
2.Access入库语句在DateTime类型时就是一个前后添加‘#’号的字符串,所以%①肯定是%s。
CTime time(nYear, nMonth, nDay);
CString dateTime("#");
dateTime+=time.Format("YYYY-mm-dd"));
dateTime+="#";
sql.Format(L"insert into tbl_Table values(%s)",(LPSTR)(LPCTSTR)dateTime);
insert into tbl_Table values(#2013-04-15 23:01#)"
"select date(field_name) from tbl_Table"
"select time(field_name) from tbl_Table"
"select Format(field_name, "yyyy-mm-dd") from tbl_Table"
"select Format(field_name, "hh:ss") from tbl_Table"
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询