Sqlite - Insert给出错误 - 无效的强制转换异常 - “从'DateTime'到'Int32'的无效强制转换。”

时间:2011-02-28 16:20:47

标签: c# sqlite ado.net

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();

我正在尝试调试此INSERT,但我没有太多运气。为什么sqllite试图将我的日期时间转换为int?数据库模式需要一个datetime对象。有没有办法在插入命令文本时将其发送到db?

以下是我要插入的类型:

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; }

以下是插入的示例:

  

INSERT INTO DATAOUT(id,uid,   application,eventname,clienttoken,   版本,日期时间,数据)价值('   00000000-0000-0000-0000-000000000000' , '123abcd','我的   应用“‘’,”测试   客户端 ' '1.0.0', '1/1/2000','[{ “ID”: “alpha_123”, “问题”:“ronunciations   在前经典时代或在非阁楼   方言。对于   DET “ ”答案“:” nunciations   “},{” ID “:” beta_456" , “问题”:“官   法律等文件   一个“‘答案’:”或   改性的 “},{” ID “:” gamma_789" , “问题”:”   保持或修改略微适合   希腊语音学;从而,   ?“,”回答“:”   阁楼 “},{” ID “:” delta_098" , “问题”:“econstructed   Attic的发音在5月下旬   一个“,”回答“:”   “},{” ID “:” epsilon_076" , “问题”:“erent   风格变体,随着   下降的尾巴要么是直的   down o“,”回答“:”整个   一堆 “},{” ID “:” zeta_054" , “问题”:“粗   当它开始说话时呼吸。   另一个变音使用“,”回答“:”其他   直径“}]')

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

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

更新

删除了insert语句中参数的引号。它导致插入字符串文字@paramname。 谢谢!

2 个答案:

答案 0 :(得分:3)

我的猜测是你在查询中没有@dateTimeParam左右的引号,而查询解析器假设它是int

真正让我烦恼的是你为什么要用引号括起参数。

试试这个:

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);

<强>更新

我不知道造成这个问题的原因。我试图模仿this code。这有帮助吗?

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();

答案 1 :(得分:1)

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