2011-02-05 3 views
3

나는 Ms Access 데이터베이스로 Linq 데이터 매핑을 사용 해왔다. 평소와 같이 OleDbConnection을 만들고 DataContext으로 전달합니다.Ms 액세스 데이터베이스를 사용하는 Linq 데이터 매핑 : "SQL 문의 끝에 세미콜론 (;)이 누락되었습니다."

복잡한 쿼리를 기반으로 테이블에서 데이터를 검색하기 위해 지금까지 문제가 없었으며 관계조차도 1-N 릴레이션의 하위 엔티티 목록을 자동으로 채 웁니다.

그러나 나는 다음과 같은 코드를 사용하여 데이터를 삽입 할 때 :하지만, 나는이 IsDbGenerated 플래그를 제거하면

"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 

, 그것은 충돌하지 않습니다 나는 다음과 같은 오류가

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

을 이 경우 기본 키 (x.field1 = 55)를 지정해야하지만 자동으로 할당되기를 바랍니다.

이 예외가 발생하지 않도록하려면 어떻게해야합니까?

답변

3

나는 이것을 보았습니다. :) 당신 Linq2SQL의 연결 유형 집행 부족에 피기 백 것 같습니다;). Linq2SQL은 Access에서 지원되지 않으며 대부분의 읽기 쿼리와 일부 삽입 쿼리는 Access SQL과 TSQL의 유사성으로 인해 작동하지만 다른 것들은 단순히 수행 할 수 없으며 자동 식별 열과 함께 삽입됩니다. 그 이유는 Linq가 동일한 삽입 명령의 일부로 두 개의 쿼리를 생성하기 때문입니다 (하나는 레코드를 삽입하고 두 번째는 새로 생성 된 ID를 검색하기 위해). 해결 방법은, 당신이 당신의 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은 Access가 아닌 SQL Server 용으로 설계되었습니다.

Linq를 엔티티와 함께 ​​사용해 보시지 않겠습니까?

나는 그것을 이해하지 못했지만 Access에는 필요한 ADO.NET 공급자가 있으므로 EF와 함께 작동해야합니다.

+0

불행히도 EF는 MS Access를 지원하지 않습니다. – Igor