我試圖打開一個Sqlite文件並使用Mono向表中插入一行。我參考了Mono.Data.Sqlite
,System.Data
和System.Data.Linq
組件。 Sqlite文件和表都存在。 Status
類具有Table
和Column
屬性。當我單獨使用Mono的Sqlite庫時,我可以成功插入。在Mono中插入帶有LINQ的Sqlite數據庫引發TargetInvocationException和SqliteException
Status data = GetStatusFoo();
using (SqliteConnection con = new SqliteConnection("Data Source=" + Config.SQLITE_DB_FILE + ";Version=3;"))
{
con.Open();
using (SqliteCommand cmd = new SqliteCommand("INSERT INTO " + _table + _insert + " VALUES " + _values, con))
{
cmd.Parameters.Add(new SqliteParameter("@Timestamp", data.Timestamp));
// ...
cmd.ExecuteNonQuery();
}
con.Close()
}
但是,我不想輸入1000 SqliteParameters,所以我試圖使用Linq-to-SQL。以下代碼在DataContext
構造函數中引發TargetInvocationException。
Status data = GetStatusFoo();
using (DataContext db = new DataContext("Data Source=" + Config.SQLITE_DB_FILE + ";Version=3;"))
{
Table<Status> statuses = db.GetTable<Status>();
statuses.InsertOnSubmit(data);
db.SubmitChanges();
}
它抱怨Version
不是有效的關鍵字,所以當我將其刪除,只留下
Status data = GetStatusFoo();
using (DataContext db = new DataContext("Data Source=" + Config.SQLITE_DB_FILE + ";")
{
Table<Status> statuses = db.GetTable<Status>();
statuses.InsertOnSubmit(data);
db.SubmitChanges();
}
它在db.SubmitChanges()
的「Server會拋出一個System.Data.SqlClient.SqlException不存在或連接被拒絕「。
但是,這改變了,當我使用SqliteConnection對的DataContext的的IDbConnection,即
Status data = GetStatusFoo();
using (SqliteConnection con = new SqliteConnection("Data Source=" + Config.SQLITE_DB_FILE + ";"))
using (DataContext db = new DataContext(con))
{
Table<Status> statuses = db.GetTable<Status>();
statuses.InsertOnSubmit(data);
db.SubmitChanges();
}
這將引發Mono.Data.Sqlite.SqliteException:SQLite error unrecognized token: "@"
在db.SubmitChanges();
。
添加Version=3;
返回沒有幫助,並嘗試Version=2
拋出一個System.NotSupportedException。控制檯和DataContext.Log給這樣的事情:
INSERT INTO [Status] ([Timestamp], ...) VALUES (@Timestamp, ...)
-- @Timestamp: Input Int64 (Size = 0; Prec = 0; Scale = 0) [1397710927]
-- ...
-- Context: SqlServer Model: AttributedMetaModel Build: 4.0.0.0
SELECT @@IDENTITY
-- @Timestamp: Input Int64 (Size = 0; Prec = 0; Scale = 0) [1397710927]
-- Context: SqlServer Model: AttributedMetaModel Build: 4.0.0.0
Unhandled Exception:
Mono.Data.Sqlite.SqliteException: SQLite error
unrecognized token: "@"
什麼給?爲什麼它不喜歡「@」符號?參數替換失敗嗎?或者是最後的@@IDENTITY
電話?
編輯:附加信息
周圍的堆棧跟蹤戳後,Mono.Data.SqliteCommand.BuildNextCommand發生SqliteException異常,this.CommandText
== "SELECT @@IDENTITY"
。顯然,這個MS/Transact-SQL命令不被SQLite支持。從我可以告訴,一個「outputCommand」爲此創建DbLinq.Data.Linq.Sugar.Implementation.QueryRunner.Upsert (target={Status}, insertQuery={DbLinq.Data.Linq.Sugar.UpsertQuery})
所以我改變了我的問題,包括:我如何告訴Linq避免SQL只命令?