C# 如何插入数据?

C# 如何插入数据?,c#,ms-access,ado.net,C#,Ms Access,Ado.net,如何使用C#?将数据插入到Access数据库的多个表中,这些表具有内部联接,我不知道它是否在Access中工作,但您可以尝试: INSERT INTO table (col1, col2, col3) SELECT t1.col1, t1.col2, t2.col3 FROM table1 t1 INNER JOIN table2 t2 ON t1.Id = t2.Id 如果需要在不同的表上执行此操作,执行不同的插入,JET Engine不允许在单个语句上执行多个查询,根据我假设join指的是

如何使用C#?

将数据插入到Access数据库的多个表中,这些表具有内部联接,我不知道它是否在Access中工作,但您可以尝试:

INSERT INTO table (col1, col2, col3)
SELECT t1.col1, t1.col2, t2.col3
FROM table1 t1
INNER JOIN table2 t2 ON t1.Id = t2.Id

如果需要在不同的表上执行此操作,执行不同的插入,JET Engine不允许在单个语句上执行多个查询,根据

我假设join指的是与另一个表的外键的关系。联接指的是查询而不是表


您可以简单地执行多个插入,根据需要为每个表插入一个,将记录添加到父表,获取刚刚添加的新记录的键,然后使用该ID插入任何子表,该ID将是子表中的外键。

根据我的经验,没有标准方法,但有解决方法,但这些方法取决于表/数据库的结构

我不确定访问支持触发器、SP和功能。我认为没有,所以如果这是真的,那么下面的解决方法是无效的

  • 您可以在子表上使用触发器,但若您有一个外键约束,它将失败,因为您可能会在子表中插入父表中不存在的值。在父级上使用触发器是无用的,因为您不能将参数传递给触发器

  • 另一种解决方法是从前端应用程序调用存储过程,并从该存储过程调用多个insert语句。然而,从你的问题我推断这不是你愿意做的,因为问题说“从单插入语句”

  • 另一种解决方法类似于触发方法,即定义一个函数,然后可以从插入查询调用函数。从函数中插入数据到子表中。但是,如果存在任何完整性约束,那么最终可能会遇到与触发器相同的问题。因为函数将在插入之前首先运行

  • 另一种方法是;创建一个表,该表是来自所需表的字段的并集(为了便于参考,我们将其称为根表)。然后在该表上为insert定义触发器。现在,在这个根表和触发器中插入记录,并在所需的表中插入相应的字段。(您需要在原子性触发器中使用事务)

  • 假设您有一个表结构liek emp(empid,name);empContacts(contactid、empid、编号);empAddress(地址ID,empid,地址); 所以您创建了另一个表,它是来自emp和emp Contacts name it Rootemp(empid、name、contactid、number、addressId、address)字段的并集

    为此表创建一个触发器,并在事务中的emp、empContacts和empAddress表中插入触发器记录

    不过,这是一种变通方法,因为您可以从前端看到您正在调用单个insert语句,而数据库仍在调用多个insert语句

    这可能不是最好的选择,因为解决方案从来都不需要


    PS:emp、empContact和empAdress的示例可能不是一个非常聪明的示例,但我希望它确实传达了信息。

    我同意这个问题很模糊,但暗示了ACE/Jet引擎经常被问到的问题,“如果我能在两个表之间创建
    内部联接
    ,我能用一条SQL语句将
    插入到两个表中吗?”通常紧跟在限定符之后,“…如果表之间存在
    外键
    (访问=与引用完整性的关系),则引用表中生成的
    标识号
    /AutoNumber能否自动添加到引用表中?”

    这些问题的答案是肯定的:创建一个带有
    内部联接
    视图
    (或等效项),包括
    标识
    列和引用
    标识
    列的列,然后
    插入
    视图
    中,忽略
    标识
    列及其引用列

    下面是一个ANSI-92查询模式语法的快速示例(我假设您使用的是OLE DB):


    如果您能提供一个表结构的示例,那么提供一个答案可能会更容易。这肯定需要澄清,才有可能得到一个有用的答案。我认为这有点推动了它。有很多有用的答案。为什么你不先找出一些关于Jet的信息,然后再发布一个毫无价值的答案呢?Jet没有触发器,没有存储过程(在任何实际意义上,也就是说,其中包含过程逻辑)。如果您阅读了我的回答,我已经提到“我不确定Access是否支持触发器、SP和函数。我相信没有。因此,如果是真的,则以下解决方法无效。”如果您不确定,请检查!比完成你剩下的答案要快。
    CREATE TABLE TableA
    (
       ID IDENTITY NOT NULL UNIQUE, 
       a_col INTEGER NOT NULL
    )
    ;
    
    CREATE TABLE TableB
    (
       ID INTEGER NOT NULL UNIQUE
          REFERENCES TableA (ID),  
       b_col INTEGER NOT NULL
    )
    ;
    
    CREATE VIEW TestAB
    (
       a_ID, a_col, 
       b_ID, b_col
    )
    AS 
    SELECT A1.ID, A1.a_col, 
           B1.ID, B1.b_col
      FROM TableA AS A1
           INNER JOIN TableB AS B1
              ON A1.ID = B1.ID
    ;
    
    INSERT INTO TestAB (a_col, b_col) VALUES (55, 99)
    ;