C# 使用Ms Access数据库进行Linq数据映射:“0”;SQL语句结尾缺少分号(;);
我在Ms Access数据库中使用Linq数据映射。我像往常一样创建一个C# 使用Ms Access数据库进行Linq数据映射:“0”;SQL语句结尾缺少分号(;);,c#,linq,ms-access,linq-to-objects,data-mapping,C#,Linq,Ms Access,Linq To Objects,Data Mapping,我在Ms Access数据库中使用Linq数据映射。我像往常一样创建一个OleDbConnection,并将其传递给DataContext 到目前为止,这种方法工作得很好,可以基于复杂查询从表中检索数据,甚至关系也可以自动填充1-N关系中的子实体列表 但是,当我尝试使用以下代码插入数据时: [Table(Name = "test_table")] public class test_item { [Column(IsPrimaryKey = true, IsDbG
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();
}
如果我删除IsDbGenerated
标志,它不会崩溃,但在这种情况下,我必须指定主键(x.field1=55
),但我希望自动分配它
如何避免出现此异常?我看到了以下内容:)。您似乎是在背负Linq2SQL缺少连接类型强制的缺陷;)。Access不支持Linq2SQL,虽然大多数读取查询和一些插入查询由于Access SQL和TSQL的相似性而工作,但其他事情根本不可行,其中之一就是使用自动标识列插入。
原因是Linq生成两个查询作为同一个insert命令的一部分(一个用于插入记录,另一个用于检索新生成的标识),这与Access不匹配。解决方法是可能的,但相当难看,您需要对DataContext进行子类化,然后创建所有有问题的Insert*方法(在InsertTest_表中),然后使用这些方法在同一事务中发出两个CONSEQUITY命令
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());
}
我的建议是,如果可以的话,转储访问并切换到SQLExpress(甚至.SDF更好)crea听起来您正在使用linqtosql。Linq to SQL是为SQL Server而设计的,而不是为访问而设计的 为什么不尝试使用Linq to实体
我理解,但从来没有这样做过,Access有必要的ADO.NET提供程序,因此它应该与EF一起工作。您的代码生成是从SQL Server生成的,对于SQL Server,MS SQL Server不必使用分号。尝试修改类的分部方法,请使用此链接-。也许它可以帮助您。不幸的是,EF不支持MS访问。
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());
}