gpt4 book ai didi

c# - Linq 数据映射与 Ms Access 数据库 : "Missing semicolon (;) at end of SQL statement."

转载 作者:行者123 更新时间:2023-11-30 15:45:46 25 4
gpt4 key购买 nike

我一直在使用 Linq 数据映射和 Ms Access 数据库。我像往常一样创建一个 OleDbConnection 并将其传递给 DataContext

到目前为止,这一直运行良好,可以根据复杂查询从表中检索数据,甚至关系也可以自动填充 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),但是我希望它被自动分配。

如何避免出现此异常?

最佳答案

我看过这个 :)。您似乎在依赖 Linq2SQL 缺乏连接类型强制;)。 Access 不支持 Linq2SQL,虽然由于 Access SQL 和 TSQL 的相似性,大多数读取查询和一些插入查询都可以工作,但其他事情根本不可行,其中一个就是使用自动标识列插入。原因是 Linq 生成两个查询作为同一个插入命令的一部分(一个用于插入记录,第二个用于检索新生成的标识)并且这与 Access 不兼容。一种解决方法是可能的,但相当丑陋,您需要对您的 DataContext 进行子类化,然后创建所有有问题的 Insert* 方法(在您的情况下为 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());
}

我的建议是,如果可以的话转储 Access 并切换到 SQLExpress(甚至 .SDF 更好)crea

关于c# - Linq 数据映射与 Ms Access 数据库 : "Missing semicolon (;) at end of SQL statement.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4906757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com