Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有C的SQLite数据库无法比较datetime数据类型_C#_Database_Sqlite_Datetime - Fatal编程技术网

C# 带有C的SQLite数据库无法比较datetime数据类型

C# 带有C的SQLite数据库无法比较datetime数据类型,c#,database,sqlite,datetime,C#,Database,Sqlite,Datetime,我正在使用C.NET和SQLite数据库。 我在SQLite数据库中有一个表,其中有一个名为InvoiceDate的列。我在db表中选择了与文本相同的数据类型,因为我需要它作为datetime变量 我正在使用System.Data.SQLite引用 以下是我面临问题的命令文本: command.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN '" + date1.

我正在使用C.NET和SQLite数据库。 我在SQLite数据库中有一个表,其中有一个名为InvoiceDate的列。我在db表中选择了与文本相同的数据类型,因为我需要它作为datetime变量

我正在使用System.Data.SQLite引用

以下是我面临问题的命令文本:

command.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN '" 
                     + date1.ToString() + "' AND '" 
                     + date2.ToString() + "' ORDER BY InvoiceNumber";
我需要找到InvoiceDate列位于给定日期date1和date2之间的所有结果。但问题是,即使我选择了其他日期,我也会得到结果。例如,即使我选择了不同的年份,我在同一个月份和日期也会得到相同的结果。命令文本有问题,我还需要知道应该在db表中选择什么类型的数据类型。请务必让我知道如何编写select命令。

来自

文本为ISO8601字符串YYYY-MM-DD HH:MM:SS.SSS

由于ToString不生成这种格式,您可以使用自定义格式,如

date1.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)
date2.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)
但更重要的是,您应该始终使用。这种类型的字符串连接对攻击是开放的

我对格式不是百分之百的了解,但你可能想用哪一种表示

。。使用保留的模式的自定义日期和时间格式字符串 时区信息,并发出符合ISO的结果字符串 8601


您可以创建一个方法来转换日期时间

 private string DateTimeSQLite(DateTime datetime)
  {
    string dateTimeFormat = "{0}-{1}-{2} {3}:{4}:{5}.{6}";
    return string.Format(dateTimeFormat, datetime.Year,   
                         datetime.Month,datetime.Day, 
                         datetime.Hour, datetime.Minute,  
                          datetime.Second,datetime.Millisecond);
  }
或者最好将其作为一种扩展方法

 private static string DateTimeSQLite(this DateTime datetime)
 {}
还可以使用参数化查询来避免sql注入

string commandText = "SELECT * FROM InvoiceMaster 
                  WHERE InvoiceDate BETWEEN @date1 and @date2
                  ORDER BY InvoiceNumber"
yourcommand.Parameters.Add("@date1",date1.DateTimeSQLite());
yourcommand.Parameters.Add("@date2",date1.DateTimeSQLite());

由于您已选择将日期存储为数据库中的文本字段,因此必须使用ISO8601对其进行格式化。例如:

2016-02-03T20:34:22Z
因此,一旦确保它们以这种方式存储,剩下的就是对查询进行参数化:

DateTime date1 = ... get from somewhere
DateTime date2 = ... get from somewhere

using (var conn = new SQLiteConnection("Data Source=mydb.db;Version=3;"))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN @startDate AND @endDate";
    cmd.Parameters.AddWithValue("@startDate", date1.ToString("o"));
    cmd.Parameters.AddWithValue("@endDate", date2.ToString("o"));
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // do something with the results here
        }
    }
}

请注意,我是如何使用.ToStringo格式说明符来确保将日期正确传递到数据库的。

使用准备好的语句/参数绑定,您的问题就会得到解决。您能给我一个示例代码吗……您是否先进行了基本搜索?您在提供的链接中有一个示例,只是想在google中找到它……您需要正确设置日期字符串的格式……我认为这不是一个好主意,因为一位数的月、日、时、分和秒部分不会有前导零。这很有趣,因为格式为yyyy mm ddThh:mm:ss[.mmm]。SQLite文档表明T不是本标准的一部分。ISO 8601与区域性无关。但不是以SQLite文档中显示的格式。请检查并纠正一个@lad2025你有一个观点,但我写了这个格式,因为医生这么说。我从来没有诚实地使用过Sqlite,这就是为什么我不能百分之百确定。尝试了以下操作:command.CommandText=SELECT*FROM InvoiceMaster,其中InvoiceDate介于“DATETIME+date1.ToString yyyy-MM-dd HH:MM:ss.fff,CultureInfo.InvariantCulture+”和“DATETIME+date2.ToString yyy-MM-dd HH:MM:ss.fff,CultureInfo.InvariantCulture+”;还是没有WORK@SlickGuy我更新了我的答案。你能看一下吗?
DateTime date1 = ... get from somewhere
DateTime date2 = ... get from somewhere

using (var conn = new SQLiteConnection("Data Source=mydb.db;Version=3;"))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT * FROM InvoiceMaster WHERE InvoiceDate BETWEEN @startDate AND @endDate";
    cmd.Parameters.AddWithValue("@startDate", date1.ToString("o"));
    cmd.Parameters.AddWithValue("@endDate", date2.ToString("o"));
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // do something with the results here
        }
    }
}