Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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# Sqlite-Insert给出错误-无效的强制转换异常-“;来自'的无效强制转换;日期时间';至';Int32'&引用;_C#_Sqlite_Ado.net - Fatal编程技术网

C# Sqlite-Insert给出错误-无效的强制转换异常-“;来自'的无效强制转换;日期时间';至';Int32'&引用;

C# Sqlite-Insert给出错误-无效的强制转换异常-“;来自'的无效强制转换;日期时间';至';Int32'&引用;,c#,sqlite,ado.net,C#,Sqlite,Ado.net,我正在尝试调试这个插件,但运气不太好。为什么sqllite试图将我的datetime转换为int??数据库架构需要一个datetime对象。有没有办法在insert命令文本发送到db时查看它 下面是我尝试插入的类型: var idParam = new SQLiteParameter("@idParam", SqlDbType.Text) { Value = insertData.ID }; var userIdParam = new SQLiteParameter("@userIdParam"

我正在尝试调试这个插件,但运气不太好。为什么sqllite试图将我的datetime转换为int??数据库架构需要一个datetime对象。有没有办法在insert命令文本发送到db时查看它

下面是我尝试插入的类型:

var idParam = new SQLiteParameter("@idParam", SqlDbType.Text) { Value = insertData.ID };
var userIdParam = new SQLiteParameter("@userIdParam", SqlDbType.VarChar) { Value = insertData.Uid };
var applicationNameParam = new SQLiteParameter("@applicationNameParam", SqlDbType.VarChar) { Value = insertData.Application };
var eventNameParam = new SQLiteParameter("@eventNameParam", SqlDbType.VarChar) { Value = insertData.EventName };
var clientTokenParam = new SQLiteParameter("@clientTokenParam", SqlDbType.VarChar) { Value = insertData.ClientToken };
var versionParam = new SQLiteParameter("@versionParam", SqlDbType.VarChar) { Value = insertData.Version };
var dateTimeParam = new SQLiteParameter("@dateTimeParam", SqlDbType.DateTime) { Value = insertData.DateTime };
var dataParam = new SQLiteParameter("@dataParam", SqlDbType.Text) { Value = insertData.Data };

SQLiteCommand command = new SQLiteCommand("INSERT INTO DATAOUT (id, uid, application, eventname, clienttoken, version, datetime, data)" +
    " VALUES ('@idParam','@userIdParam','@applicationNameParam','@eventNameParam','@clientTokenParam','@versionParam',@dateTimeParam,'@dataParam')",Connection);
command.Parameters.Add(idParam);
command.Parameters.Add(userIdParam);
command.Parameters.Add(applicationNameParam);
command.Parameters.Add(eventNameParam);
command.Parameters.Add(clientTokenParam);
command.Parameters.Add(versionParam);
command.Parameters.Add(dateTimeParam);
command.Parameters.Add(dataParam);

command.ExecuteNonQuery();
以下是插入的示例:

插入数据输出(id、uid、, 应用程序、eventname、clienttoken、, 版本、日期时间、数据)值(' 00000000-0000-0000-0000-000000000000','123abcd','My 应用程序','',测试 客户','1.0.0','1/1/2000','[{“id”:“alpha_123”,“问题”:“发音” 在前古典时期或非阁楼时期 方言 “回答”:“说明” “},{”id“:“beta_456”,“问题“:”官方 法律等文件 “答案”:“或 modif“},{“id”:“gamma_789”,“问题”: 稍微保持或修改以适合 希腊音系学;因此, ?,“答案”:“对 阁楼“},{“id”:“delta_098”,“问题”:“econstructed” 五世纪后期阁楼的发音 一个“答案”:“不承认” },{“id”:“epsilon_076”,“问题”:“erent” 风格变体,带有 下降的尾巴要么直着走 向下“o”,“回答”:“全部” 束“},{“id”:“zeta_054”,“问题”:“粗糙” 当它开始一个单词时呼吸。 另一个变音用法是“回答”:“其他” 直径“}]')

最后一个值是JSON字符串。dateTime字段显然是问题所在(第7个参数)。对于上面的例子,我刚刚添加了文本“1/1/2011”。代码通过参数构造insert。datetime参数在调试器中具有有效日期

当我检查参数“dateTimeParam”时,调试器显示dbType=Int32。怎么回事

更新

删除了insert语句中参数周围的引号。它将生成要插入的字符串文本@paramname。
谢谢

我猜在查询中,
@dateTimeParam
周围没有引号,查询解析器假设它是一个
int

但真正让我头疼的是,为什么要用引号括住参数。

试试这个:

public string Uid { get; private set; }
public string Application { get; private set; }
public string EventName { get; private set; }
public string ClientToken { get; private set; }
public string Version { get; private set; }
public DateTime DateTime { get; private set; }
public string Data { get; private set; }
更新

我不知道是什么导致了这个问题。我试着模仿。这有用吗

var command = new SQLiteCommand (
   "INSERT INTO DATAOUT (id, uid, application, eventname, clienttoken, version, datetime, data)" +
    " VALUES (@idParam, @userIdParam, @applicationNameParam, @eventNameParam, @clientTokenParam, @versionParam, @dateTimeParam, @dataParam)",
    Connection);

我的问题是由于使用参数数据类型:System.data.DbType.DateTime2而导致的,.NET Sqlite api无法识别此枚举。

您在谈论哪个参数?只有
dateTimeParam
?您在调试器中看到了什么?您要插入的实际值是什么?表本身的结构是什么?除了date(日期时间)之外,每一列都是varchar或文本。为什么参数被引号包围?实际上引号“”是错误的。这是在db中插入@paraName的字符串文字。。dohI建议您删除所有引号,而不是用
替换它们。现在的例外是输入字符串的格式不正确。“这很奇怪,但我粗略猜测一下:您是否尝试将@dateTimeParam像其他参数一样用单引号括起来?我刚才看到了。”。。让我试试
var command = new SQLiteCommand (
    "INSERT INTO DATAOUT (id, uid, application, eventname, clienttoken, version, datetime, data)" +
    " VALUES (@idParam,@userIdParam,@applicationNameParam,@eventNameParam,@clientTokenParam,@versionParam,@dateTimeParam,@dataParam)",
    Connection);

command.Parameters.AddWithValue("@idParam", insertData.ID);
command.Parameters.AddWithValue("@userIdParam", insertData.Uid);
command.Parameters.AddWithValue("@applicationNameParam", insertData.Application);
command.Parameters.AddWithValue("@eventNameParam", insertData.EventName);
command.Parameters.AddWithValue("@clientTokenParam", insertData.ClientToken);
command.Parameters.AddWithValue("@versionParam", insertData.Version);
command.Parameters.AddWithValue("@dateTimeParam", insertData.DateTime);
command.Parameters.AddWithValue("@dataParam", insertData.Data);

command.ExecuteNonQuery();