zoukankan      html  css  js  c++  java
  • [转]C# Sqlite DateTime 读取和写入格式错误的问题解决

    今天遇到个问题.
    首先插入一个DataTime格式的数据:
    string sql="insert into [table] (date_time) values('" + date_time.ToString() + "'";
    执行如上命令.插入没有报告错误.

    但是,我又用一条命令读取时:
    string sql="select * from [table];
    .....
    IDataReader dr=cmd.ExecuteReader();
    ...
    object obj=dr["data_time"];//在这里出错了,说是无法转换为DataTime格式,字符串不正确

    --------------------------------------------------------------------------------------------

    我找了一天的教程,找了一天的google.
    答案是:sqlite用的全球时间UTC,要用datetime()函数转换若干.
    我也试了,发现好像运行的不像教程上说的那样!

    实在没办法,来硬的吧,硬着头皮看源代码吧.
    他的继承格式大致如下:
    SqliteConvert-->SqliteBase-->Sqlite3
    在SqliteConvert中定义了转换格式,上面说的很明白,默认DataTime格式为 ISO8601
    然后,SqliteConnection 用到了Sqlite3.

    我就研究了SqliteConnection的源代码,发现Sqlite不是用的什么全球的UTC时间.
    其实就是用的国际标准ISO 8601标准.

    那我就着手看怎么才能让我的程序和sqlite兼容.
    我生成的字符串和sqlite的有什么不同.

    最后看了msdn上对iso 8601的描述:(http://msdn.microsoft.com/zh-cn/library/ms187819.aspx)
    给出了字符串示例:
    * 2004-05-23T14:25:10
    * 2004-05-23T14:25:10.487

    而我生成的字符串 data_time.ToString()和他的有一个不同的地方.
    就是没有那个T....(其实我也不明白那个T有什么关键作用,反正Access,MySql,MsSql都没这问题的)

    我又在想,如果我用一个T会如何?
    就尝试.用data_time.ToString("s");这种方法转换成 iso 8601标准字符串格式

    结果我吃屎吃了个酱板头(无锡话,意思是运气好),竟然成功了.

    如下:
    string sql="insert into [table] (date_time)" values('" + date_time.ToString("s") + "'";

    这样,问题就解决了,希望大家能够看到此贴,并发扬光大,到处流传,这样才能发展Sqlite的普及率.

    附注:
    我起先研究了BBSMAX的Sqlite数据库.我认为这个论坛会有好的解决方法.
    但我错了.其实没有.bbsMax用了varchar代替DateTime格式.
    我也照做了,但是当我用到 select * from [table] where date_time > '2006-1-1' and date_time< '2008-1-1'
    类似这样的语句,想查询一个中间的时间类型时,语法错误.

    所以,到头来,我还是从头开始研究DateTime格式.字符串格式虽然能够凑合,但是却没有那么方便和强大.

    如果您要引用本文,请保持版权信息:
    甘蔗皮 2008-8-17 关键字:Sqlite SqliteDataReader SqliteCommand DateTime ISO8601 格式 转换 UTC

    ----

    发现System.Data.Sqlite的

    SQLiteConvert类源码中定义了对如下格式的日期时间格式的支持:

      /// <summary>
      
    /// This base class provides datatype conversion services for the SQLite provider.
      
    /// </summary>
      public abstract class SQLiteConvert
      {
        /// <summary>
        
    /// An array of ISO8601 datetime formats we support conversion from
        
    /// </summary>
        private static string[] _datetimeFormats = new string[] {
          "THHmmss",
          "THHmm",
          "HH:mm:ss",
          "HH:mm",
          "HH:mm:ss.FFFFFFF",
          "yy-MM-dd",
          "yyyy-MM-dd",
          "yyyy-MM-dd HH:mm:ss.FFFFFFF",
          "yyyy-MM-dd HH:mm:ss",
          "yyyy-MM-dd HH:mm",                               
          "yyyy-MM-ddTHH:mm:ss.FFFFFFF",
          "yyyy-MM-ddTHH:mm",
          "yyyy-MM-ddTHH:mm:ss",
          "yyyyMMddHHmmss",
          "yyyyMMddHHmm",
          "yyyyMMddTHHmmssFFFFFFF",
          "yyyyMMdd"
        };

        //...
    }
  • 相关阅读:
    联赛前第七阶段总结
    tomcat启动服务一会后自动关闭
    删除软件服务
    jmeter ramp-up解释
    mysql数据库报错1045
    tomcat在linux上的安装
    ant在linux下的安装部署
    查看一条mysql语句的性能
    linux下安装svn服务器
    InfluxDB数据库报错ERR: unable to parse authentication credentials Warning: It is possible this error is due to not setting a database. Please set a database with the command "use <database>".
  • 原文地址:https://www.cnblogs.com/luqingfei/p/2451758.html
Copyright © 2011-2022 走看看