none
CString类型的时间字符串如何存入Access时间字段中? RRS feed

  • 问题

  • 我从MFC编辑框获取的CSting类型的日期和时间字符串,分别定义为:CString strDate = L"2011年08月09日";CString strTime = L"18::20:33";

    构造SQL插入指令,CSting strSQL; strSQL。Format(L"INSERT INTO 表(Date, Time) VALUES (#%s#, #%s#)", strDate, strTime);运行出错,警告 Access日期语法错误

    我又改为CString strDate = L"format('2011年08月09日', 'yyyy-mm-dd')";CString strTime = L'format('18::20:33', 'hh:nn:ss')"; CSting strSQL; strSQL。Format(L"INSERT INTO 表(Date, Time) VALUES (%s, %s)", strDate, strTime);运行后去掉strTime就没问题,加上就出错,您不一定按我的思路,我主要的文帝纠结于,将CStirng 的日期和时间分别插入Access的时间:长日期和长时间字段中,SQL插入语句怎么写?我用ODBC,语言VC++2010,您当vc++6.0即可。

    2011年8月9日 10:31

答案

  • CDatabase db1;
    db1.Open(NULL, false, false, _T("ODBC;DSN=SQL;UID=admin;"));

    CRecordset cd(&db1);
    cd.Open(AFX_DB_USE_DEFAULT_TYPE, L"SELECT * FROM [N]");
    cd.MoveFirst();
    CDBVariant varID, varDate, varTime;
    cd.GetFieldValue(L"MYID", varID);
    cd.GetFieldValue(L"mDate", varDate);
    cd.GetFieldValue(L"mTime", varTime);

    if(!cd.IsEOF())
    {
    CString str = L"";
    CTime date(varDate.m_pdate->year, varDate.m_pdate->month, varDate.m_pdate->day,
    varTime.m_pdate->hour, varTime.m_pdate->minute, varTime.m_pdate->second);
    str.Format(L"ID: %ld, Date:%s", varID.m_lVal, date.Format(L"%y-%m-%d %H:%M:%S"));
    MessageBox(str);

    }
    else
    {
    MessageBox(L"没找到");
    }

    cd.Close();
    db1.Close();

    • 已标记为答案 Sunrain2011 2011年8月10日 15:55
    2011年8月10日 15:55

全部回复

  • 应该是你插入的日期格式与数据库中的日期格式不一致吧,要去数据库中看看日期格式是怎样的,修改一下相关的符号就可以了,就用#日期时间#插入
    2011年8月9日 11:08
  • 我的Access日期格式:长日期,yyyy年mm月dd日  时间为:长时间,hh:mm:ss,我的主要问题在于怎么构造SQL插入指令,你呢个不能呢过给个具体例子,谢谢各位了。

    2011年8月9日 11:20
  • 你上面的代码

    CString strTime = L"18::20:33"

    应该多了一个冒号吧,改成

    CString strTime = L"18::20:33"
    


    看看

    INSERT INTO 表(Date, Time) VALUES (#2011年08月09日#, #19:25:00#)
    


    时间日期用##括起来

    2011年8月9日 11:25
  • 还有,你日期和时间是不是分开在不同的列,还是在同一列?
    2011年8月9日 11:27
  • 不同的咧,日期和时间分开,

    你上面的代码

    CString strTime = L"18:20:33"

    CString strDate = L"2011年08月09日"

    应该多了一个冒号吧,改成

     

     CString strSQL;

     

     

    strSQL.Format(L"INSERT INTO 表(Date, Time) VALUES (#%s#, #%s#)", strDate, strTime);这样构造形式?我试过不行
    
    2011年8月9日 11:43
  • CString strTime = L"18:20:33"

    CString strDate = L"2011年08月09日"

     

     

     CString strSQL;

     

     

    strSQL.Format(L"INSERT INTO 表(Date, Time) VALUES (#%s#, #%s#)", strDate, strTime);这样构造形式?我试过不行
    
    2011年8月9日 11:44
  • 你试一下直接插入

     

    INSERT INTO 表(Data) VALUES ( #2011年08月09日#)

     

     

    INSERT INTO 表(Time) VALUES ( #21:03:30#)

    分别插入试试看行不行

     

    呵呵 ,我上面忘记修改,不好意思
    2011年8月9日 13:03
  • IstrSQL = L"INSERT INTO 表(Data) VALUES ( #2011年08月09日#)“

     

     

    IstrSQL = ”INSERT INTO 表(Time) VALUES ( #21:03:30#)“
    直接执行SQLExcute(IstrSQL);没问题,只要是我怎么把变量构造成SQL插入指令,格式的问题。
    2011年8月9日 13:07
  • 写错了ExecuteSQL(strSQL);
    2011年8月9日 13:08
  • 格式化写成

    strData = L"2011年08月09日";
    
    strSQL.format(L"INSERT INTO 表(Data) VALUES ( #2011年08月09日#)", strData.GetBuffer(strData.GetLength());
    

    看看行不行,SQL语句没错的话就应该是格式化的问题了

    2011年8月9日 13:20
  • 是写成:strSQL.format(L"INSERT INTO 表(Data) VALUES ( #%s#)", strData.GetBuffer(strData.GetLength());、吗?

     

    2011年8月9日 13:31
  • strSQL.format(L"INSERT INTO 表(Data) VALUES ( #%s#)", strData.GetBuffer(strData.GetLength())执行后:日期语法错误
    2011年8月9日 13:38
  • strSQL.Format(L"INSERT INTO 表(Data) VALUES ( #2011年08月09日#)", strData.GetBuffer(strData.GetLength());

    上面忘记大写了
    然后输出strSQL看看
    2011年8月9日 13:39
  • strSQL.Format(L"INSERT INTO 表(Data) VALUES ( #2011年08月09日#)", strData.GetBuffer(strData.GetLength());这样的话strData.GetBuffer(strData.GetLength()没传入strSQL中,是不是:strSQL.Format(L"INSERT INTO 表(Data) VALUES ( #%s#)", strData.GetBuffer(strData.GetLength());这种我试过,日期语法错误
    2011年8月9日 13:58
  • 我用MessageBox,输出strSQl语句结果是:"INSERT INTO 表(Data) VALUES ( #2011年08月09日#)",还是错误,格式有问题。

    2011年8月9日 14:01
  • 不转换,直接执行:INSERT INTO 表(Data) VALUES ( #2011年08月09日#)没问题,很纠结啊
    2011年8月9日 14:02
  • 这样很奇怪,不清楚是哪里出了问题,能把你的工程的相关源码打包上来我看看么?
    2011年8月9日 15:03
  • INSERT INTO 表(Date, Time) VALUES (?, ?)

    之后用command->CreateParameter和command->Parameters->Append添加类型为VT_DATE的参数



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年8月9日 19:33
    版主
  • 您好,您能不能给个具体例子?我的时间变量CSrting strTime  = L"08:52:55";

    CString strDate = L"2011年08月10日";

    要构造的SQL插入指令:CString strSQL;

    strSQL.Format(L"INSERT INTO 表(Time, Date) VALUES (%s, %s,)", strTime, strDate);

    command->CreateParameter和command->Parameters->Append该怎么添加进去?谢谢。

    Time:在Access中为长时间,Date:为长日期

    2011年8月10日 0:56
  • 怎么打包?我不会?或者您留一E_Mai?
    2011年8月10日 0:58
    1. 其实我找到一个解决办法:就是修改数据库将日期和时间合并在一起构造时间CString strTime = L"format('2011年08月10日 09:05:33', ‘yyyy-mm-dd hh:mm:ss’)";

    CString strSQL; strSQL.Format(L"INSERT INTO 表(Time) VALUES (%s)", strTime); 这条strSQL执行后没问题;

     

         2。只要日期:即CString strTime = L"format('2011年08月10日, ‘yyyy-mm-dd)";CString strSQL; strSQL.Format(L"INSERT INTO 表(Time) VALUES (%s)", strTime); 这样执行也没问题;

          3。日期和时间分开:即CString strDate = L"format('2011年08月10日, ‘yyyy-mm-dd)";CString strTime = L'format('18::20:33', 'hh:nn:ss')";CString strSQL; strSQL.Format(L"INSERT INTO 表(Time) VALUES (%s, %s)", strTime, strDate); 这样能把时间插进数据库,但是在此运行就出现:

     

    2011年8月10日 1:14
  • 你上面那里只指定了一列,但却要插入两个值

    INSERT INTO 表(Time) VALUES (%s, %s)

    2011年8月10日 4:55
  • strSQL.Format(L"INSERT INTO 表(Time, Date) VALUES ('%s', '%s')", strTime, strDate);走了很多弯路,很无语啊,其他的方法我都试了,为什么这么简单的没试啊,很很感谢各位朋友。
    2011年8月10日 6:00
  • 本着负责任的态度,我反复验证了很多次,我能成功地将时间写进数据库,但是很遗憾,我再把写进去的时间读取出来的时候,数据库警告:检索出错,根源还是在于村的时间格式问题.欢迎各位朋友来讨论,谢谢。呵呵
    2011年8月10日 6:43
  • 需要看源代码的朋友,可以和我说一声,并留下E_Mail,谢谢了。欢迎朋友们指正。呵呵,数据库:Access;开发语言:VC++2010
    2011年8月10日 7:33
  • CDatabase db1;
    db1.Open(NULL, false, false, _T("ODBC;DSN=SQL;UID=admin;"));

    CRecordset cd(&db1);
    cd.Open(AFX_DB_USE_DEFAULT_TYPE, L"SELECT * FROM [N]");
    cd.MoveFirst();
    CDBVariant varID, varDate, varTime;
    cd.GetFieldValue(L"MYID", varID);
    cd.GetFieldValue(L"mDate", varDate);
    cd.GetFieldValue(L"mTime", varTime);

    if(!cd.IsEOF())
    {
    CString str = L"";
    CTime date(varDate.m_pdate->year, varDate.m_pdate->month, varDate.m_pdate->day,
    varTime.m_pdate->hour, varTime.m_pdate->minute, varTime.m_pdate->second);
    str.Format(L"ID: %ld, Date:%s", varID.m_lVal, date.Format(L"%y-%m-%d %H:%M:%S"));
    MessageBox(str);

    }
    else
    {
    MessageBox(L"没找到");
    }

    cd.Close();
    db1.Close();

    2011年8月10日 15:55
  • CDatabase db1;
    db1.Open(NULL, false, false, _T("ODBC;DSN=SQL;UID=admin;"));

    CRecordset cd(&db1);
    cd.Open(AFX_DB_USE_DEFAULT_TYPE, L"SELECT * FROM [N]");
    cd.MoveFirst();
    CDBVariant varID, varDate, varTime;
    cd.GetFieldValue(L"MYID", varID);
    cd.GetFieldValue(L"mDate", varDate);
    cd.GetFieldValue(L"mTime", varTime);

    if(!cd.IsEOF())
    {
    CString str = L"";
    CTime date(varDate.m_pdate->year, varDate.m_pdate->month, varDate.m_pdate->day,
    varTime.m_pdate->hour, varTime.m_pdate->minute, varTime.m_pdate->second);
    str.Format(L"ID: %ld, Date:%s", varID.m_lVal, date.Format(L"%y-%m-%d %H:%M:%S"));
    MessageBox(str);

    }
    else
    {
    MessageBox(L"没找到");
    }

    cd.Close();
    db1.Close();

    • 已标记为答案 Sunrain2011 2011年8月10日 15:55
    2011年8月10日 15:55