【问题标题】:Get error on insert date from code sqlite从代码 sqlite 获取插入日期错误
【发布时间】:2021-05-24 19:14:59
【问题描述】:

我正在尝试将此字符串 2021-02-22T16:11 插入 sqlite 数据库。我使用VARCHAR(20) 来存储这个字符串。当我从 SQLite Studio 执行 sql 查询时,一切都很好。 但是当我从我的 ASP Net Core 应用程序运行相同的代码时,它会抛出一个错误:

代码 = 错误 (1),消息 = System.Data.SQLite.SQLiteException (0x800007BF): SQL 逻辑错误无法识别令牌:“22T16”

我已经为此列尝试了不同的数据类型(TEXT、STRING、DATETIME),但没有任何效果。无法理解为什么它甚至不能将字符串插入到 VARCHAR 列中。

调用插入查询的函数:

public async Task<int> AssignTaskToUser(SaveTaskRequest req, int userId)
        {
            using (SQLiteConnection connection = new SQLiteConnection(_configuration.GetConnectionString("Default")))
            {
                long nextInvokeUnix = ((DateTimeOffset)DateTime.Parse(req.NextInvoke)).ToUnixTimeSeconds();
                long intervalUnix = ((DateTimeOffset)DateTime.Parse(req.TimeInterval)).ToUnixTimeSeconds() +
                    (3600 * 24) * req.DaysInterval;
                connection.Open();
                SQLiteCommand command = new SQLiteCommand();
                command.CommandText = $"INSERT INTO UserTasks " +
                    $"(Name, UserId, TaskId, NextInvokeString, NextInvokeUnix, DaysInterval, TimeInterval, IntervalUnix)" +
                    $"VALUES ({req.Name}, {userId}, {req.TaskId}, {req.NextInvoke}, {nextInvokeUnix}, {req.DaysInterval}, {req.TimeInterval}, {intervalUnix});" +
                    $"{getLastIdRequest}";
                command.Connection = connection;
                long userTaskId = (long)(await command.ExecuteScalarAsync());

                foreach (var param in req.parameters)
                {
                    command.CommandText = $"INSERT INTO UserTaskParameters " +
                       $"(UserTaskId, PrameterId, Value)" +
                       $"VALUES ({userTaskId}, {param.ParameterId}, {param.Value});";
                    await command.ExecuteScalarAsync();
                }

                return await GetChangesAsync(connection);
            }
        }

表创建脚本

CREATE TABLE UserTasks(
    Id INTEGER PRIMARY KEY AUTOINCREMENT,
    Name VARCHAR(30) NOT NULL,
    UserId INTEGER NOT NULL,
    TaskId INTEGER NOT NULL,
    NextInvokeString VARCHAR(20),
    NextInvokeUnix INTEGER,
    DaysInterval INTEGER,
    TimeInterval VARCHAR(6),
    IntervalUnix INTEGER,
     FOREIGN KEY (UserId)
         REFERENCES Users (Id),
     FOREIGN KEY (TaskID)
         REFERENCES APITasks (Id)
);

【问题讨论】:

  • 你需要提供更多信息,在这里粘贴你的整个代码(sql & asp)
  • @eshirvana 添加。此外,如果我将此字符串“2021-02-22T16:11”硬编码到查询中,错误会显示在“:11”
  • 您要插入什么参数?您有 5 个日期时间参数。
  • @Sergey req.NextInvoke。它包含以下格式的日期和时间:YYYY-MM-DDTHH:MM。用任何其他字符或空格替换 T 没有任何意义。
  • 您能否展示您的数据库表创建脚本和 req.NextInvoke - 什么类型和值。

标签: c# sql sqlite datetime


【解决方案1】:

您是否尝试使用它来代替

2021-02-22T16:11:59 

//or 

2021-02-22T16:11:00 

也许你也可以试试这个:

 $"VALUES ( '{req.Name}', {userId}, {req.TaskId}, '{req.NextInvoke}', {nextInvokeUnix}, ...

【讨论】:

  • 它做了一些改变。如果我将带有秒数的日期时间硬编码到查询中,它可以正常工作,但是如果我将“:00”附加到 req.NextInvoke,它会抛出完全相同的错误。
  • 它确实有效。我忘记了插入字符串时的引号。
  • 您现在可以尝试使用具有新格式的 DateTime,例如 2021-02-22T16:11:00
猜你喜欢
  • 2012-09-04
  • 2023-03-22
  • 1970-01-01
  • 2011-03-25
  • 2011-07-10
  • 2012-08-21
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多