2011-02-05 86 views
3

我一直在使用Linq數據映射Ms Access數據庫。我照常創建一個OleDbConnection,並將其傳遞給DataContext使用Access數據庫的Linq數據映射:「在SQL語句末尾缺少分號(;)」。

到目前爲止,這一直很好地工作,從基於複雜查詢的表中檢索數據,甚至關係也能自動填充1-N關係中的子實體列表。

然而,當我嘗試使用下面的代碼中插入數據:

[Table(Name = "test_table")] 
    public class test_item { 
     [Column(IsPrimaryKey = true, IsDbGenerated = true)] 
     public int field1; 
     [Column] 
     public int field2; 
    } 
    public void Test() { 
     Table<test_item> tbl = this.GetTable<test_item>(); 
     test_item x = new test_item(); 
     x.field2 = 1222; 
     tbl.InsertOnSubmit(x); 
     this.SubmitChanges(); 
    } 

我收到以下錯誤:

"Missing semicolon (;) at end of SQL statement." 
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) 
at System.Data.OleDb.OleDbCommand.ExecuteDbDataReader(CommandBehavior behavior) 
at System.Data.Common.DbCommand.ExecuteReader() 
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item) 
at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item) 
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
at System.Data.Linq.DataContext.SubmitChanges() 
at MyClass.Test() in C:\...\MyClass.cs:line 123 

如果我刪除IsDbGenerated標誌,它不會崩潰,但在那種情況下,我不得不指定主鍵(x.field1 = 55),但我希望它自動分配。

如何避免發生此異常?

回答

3

我見過這個:)。你似乎在Linq2SQL缺乏連接類型強制執行;)。 Linq2SQL在Access上不受支持,而大多數讀取查詢和某些插入查詢由於Access SQL和TSQL的相似性而起作用,但其他內容根本無法實現,其中一種情況是插入自動標識列。 原因是Linq生成兩個查詢作爲相同插入命令的一部分(一個插入一條記錄,另一個檢索新生成的標識),並且不適合Access。一種解決方法是可行的,但比較難看,你需要繼承你的DataContext,然後創建所有問題的插入*方法(在你的情況InsertTest_Table),然後使用這些方法來發出相同的交易

void InsertTest_Table(Test_Table t) 
{ 
    IDbCommand cmd; 
    cmd = Connection.CreateCommand(); 
    cmd.Transaction = this.Transaction; 
    cmd.CommandText = "INSERT INTO [Test_Table] ([Field2]) VALUES (@p0)"; 
    cmd.Parameters.Add(new OleDbParameter("p0", t.field2)); 
    cmd.ExecuteNonQuery(); 

    cmd = Connection.CreateCommand(); 
    cmd.Transaction = this.Transaction; 
    cmd.CommandText = "SELECT @@IDENTITY"; 
    t.field1 = Convert.ToInt32(cmd.ExecuteScalar()); 
} 

內的兩個consequtive命令我建議,轉儲如果你可以訪問並切換到SQLExpress(甚至.SDF更好)crea

1

這聽起來像你正在使用Linq to SQL。 Linq to SQL是爲SQL Server設計的,而不是Access。

爲什麼不試試Linq到實體?

我明白,但從來沒有這樣做過,Access有必要的ADO.NET提供程序,所以它應該與EF一起工作。

+0

不幸的是,EF不支持MS Access。 – Igor 2014-05-31 12:43:32