Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Ms Access数据库进行Linq数据映射:“0”;SQL语句结尾缺少分号(;);_C#_Linq_Ms Access_Linq To Objects_Data Mapping - Fatal编程技术网

C# 使用Ms Access数据库进行Linq数据映射:“0”;SQL语句结尾缺少分号(;);

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

我在Ms Access数据库中使用Linq数据映射。我像往常一样创建一个
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());
}