C# SQL Server 2008中对不同表的多个插入

C# SQL Server 2008中对不同表的多个插入,c#,.net,sql-server-2008,C#,.net,Sql Server 2008,我正在Visual studio 2010中使用C#、.NET framework 3.5编写一个web服务。我的问题可能是基本的,但我没能成功 我可以通过web服务成功地将数据提交到SQL db。我希望能够做到的是,在SQL db的一个表中插入记录/行时,我希望能够将数据插入到另一个表中,比如说表B。表B有5列。它将从上一个表(通过web服务插入的表A)中获取两个列值。表B中的一列是主键值,其余两列将具有静态文本值 这是表A的结构 id int (primary key) CustName v

我正在Visual studio 2010中使用C#、.NET framework 3.5编写一个web服务。我的问题可能是基本的,但我没能成功

我可以通过web服务成功地将数据提交到SQL db。我希望能够做到的是,在SQL db的一个表中插入记录/行时,我希望能够将数据插入到另一个表中,比如说表B。表B有5列。它将从上一个表(通过web服务插入的表A)中获取两个列值。表B中的一列是主键值,其余两列将具有静态文本值

这是表A的结构

id int (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)
CustQuoteDate varchar(45)
CustLoginId varchar(45)
表B结构:

id int (primary key)
OrderId varchar(45) NOT NULL //This will get value from table A's Primary key
OrderReqDate [varchar](45) NOT NULL //This will get value from table A's  CustQuotDate 
OrderStatus [varchar](45) NOT NULL // This will be a static value "Requested"
OrderGroup [varchar](45) NOT NULL // This will be a static value "GGGG"
所以我测试了第二次插入的查询:

INSERT INTO dbo.TableB(OrderId , currstatus, OrderReqDate, OrderGroup) 
SELECT ta.id, 'REQUESTED', ta.CustQuoteDate, 'GGGG' from dbo.TableA ta
where ta.CustLoginId = 'kenw1'
因此,对于TableA中新添加的每个CustLoginId,第二个表即.TableB也会从TableA中获得一个带有一些字段的行插入

我的问题是如何/在何处编辑下面的web服务代码,以便能够进行第二次插入?我们将非常感谢你花时间和精力帮助我。蒂亚

以下是我的web服务:

[WebMethod(Description = "Adds a Customer Request Form data to the database [TableA].")]
public void AddCustRequestRecord(string CustName, string CustAddress, string custContacts, string custQuoteDate, string CustLoginId)
{
    //Static text values for columns in tableB
    string OrderStatus = "REQUESTED";
    string OrderGroup = "GGGG";

    string connectionString =
      ConfigurationManager.ConnectionStrings["myDatabase"].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        DateTime now = DateTime.Now;
        string QuoteDt = now.ToString();

        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.CommandText = "INSERT INTO TableA "
          + "(CustName, CustAddress, custContacts, CustLoginId, custQuoteDate) "
          + "VALUES (@CustName, @CustAddress, @custContacts, @CustLoginId,'" + Quotedt + "')";

        cmd.Parameters.AddWithValue("CustName", CustName);
        cmd.Parameters.AddWithValue("CustAddress", CustAddress);
        cmd.Parameters.AddWithValue("custContacts", custContacts);
        cmd.Parameters.AddWithValue("CustLoginId", CustLoginId);
        cmd.Parameters.AddWithValue("custQuoteDate", custQuoteDate);

        cmd.Connection = conn;

        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();                
        }
        catch
        {
            // Handle the error using your own preferred error-handling method
        }
        finally
        {
            conn.Close();
        }
    }
}

您可以通过多种方式实现它

1.可以使用第二个命令对象(此命令将使用相同的连接)进行另一次插入

2.您可以调用一个存储过程,在该存储过程中,您可以处理多个插入并访问表a中最近插入的数据

3.您可以始终使用诸如Linq到SQL或EF之类的ORM


4.在表A的Insert上使用触发器。

有多种方法可以实现它

1.可以使用第二个命令对象(此命令将使用相同的连接)进行另一次插入

2.您可以调用一个存储过程,在该存储过程中,您可以处理多个插入并访问表a中最近插入的数据

3.您可以始终使用诸如Linq到SQL或EF之类的ORM


4.在表A的Insert上使用触发器。

根据您所拥有的,您需要使用一个连接和第二个命令。为两个命令保持连接打开,但确保使用事务,以便在出现错误时回滚两个sql插入


MSDN上的
SqlConnection.BeginTransaction
展示了如何对其进行编码的一个很好的示例。

根据您拥有的内容,您需要使用一个连接和第二个命令。为两个命令保持连接打开,但确保使用事务,以便在出现错误时回滚两个sql插入


MSDN上的
SqlConnection.BeginTransaction
展示了如何对其进行编码的一个很好的示例。

老实说,最合适的方法是使用存储过程。第一,它更好地避免了SQL注入;第二,它可以通过一个连接和一个对数据库的调用实现您想要的功能,而且效率更高。让SQL Server为您完成这项工作。

老实说,最合适的方法是使用存储过程。第一,它更好地避免了SQL注入;第二,它可以通过一个连接和一个对数据库的调用实现您想要的功能,而且效率更高。让SQL Server为您完成这项工作。

表A中OP CustLoginID的每条注释都是唯一的。我建议您将数据设计更改为第三范式。使用自然键,不要重复列

Table A
CustLoginId varchar(45) (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)
CustQuoteDate varchar(45)

Table B 
id int (primary key)
CustLoginId varchar(45) NOT NULL 
OrderReqDate varchar(45) NOT NULL 
OrderStatus varchar(45) NOT NULL 
OrderGroup varchar(45) NOT NULL
现在您可以直接插入到表B中,因为您不需要来自A的ID。您已经有了CustLoginId

但我质疑LogonID是独一无二的说法。这意味着您只有每个LogonID的CustQuoteDate。我怀疑客户可能有多个报价。假设客户可以有多个报价,这就是设计。为什么约会是一个变形金刚?由于数据时间已降到毫秒,因此在TableB上不应出现PK冲突。如果您希望允许两个quotedate对一个LogonID使用相同的值,那么只需从表B中删除PK即可

Table A
CustLoginId varchar(45) (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)


Table B 
CustLoginId varchar(45) (primary key) foreign key relation to Table A
CustQuoteDate datetime (primary key)
OrderReqDate varchar(45)   
OrderStatus varchar(45)  
OrderGroup varchar(45) 

表A中OP CustLoginID的每条注释都是唯一的。我建议您将数据设计更改为第三范式。使用自然键,不要重复列

Table A
CustLoginId varchar(45) (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)
CustQuoteDate varchar(45)

Table B 
id int (primary key)
CustLoginId varchar(45) NOT NULL 
OrderReqDate varchar(45) NOT NULL 
OrderStatus varchar(45) NOT NULL 
OrderGroup varchar(45) NOT NULL
现在您可以直接插入到表B中,因为您不需要来自A的ID。您已经有了CustLoginId

但我质疑LogonID是独一无二的说法。这意味着您只有每个LogonID的CustQuoteDate。我怀疑客户可能有多个报价。假设客户可以有多个报价,这就是设计。为什么约会是一个变形金刚?由于数据时间已降到毫秒,因此在TableB上不应出现PK冲突。如果您希望允许两个quotedate对一个LogonID使用相同的值,那么只需从表B中删除PK即可

Table A
CustLoginId varchar(45) (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)


Table B 
CustLoginId varchar(45) (primary key) foreign key relation to Table A
CustQuoteDate datetime (primary key)
OrderReqDate varchar(45)   
OrderStatus varchar(45)  
OrderGroup varchar(45) 

答案很简单,但你尝试过什么?你不能在插入tableA时使用触发器来插入B吗?@Chris Moutray,我只是尝试创建第二个命令对象,第二个连接来进行第二次插入。没有错误,但没有插入到我的第二个表中。请检查“TableA中新添加的CustLoginId”上的逻辑,除非该列具有唯一约束,否则您可以拥有重复的CustLoginId。对于重复的CustLoginId,第二个命令将插入的不仅仅是新创建的。如果CustLoginId是唯一的,则将其用作主键。否则,您需要从第一次插入中检索id。@谢谢您的建议。实际上,tableA的数据来自InfoPath表单。InfoPath将进行检查,以确保用户不能使用其CustLoginId多次填写表单。所以我不必担心在我的代码中处理它。谢谢你的一些见解。答案很简单,但你尝试过什么?你不能在插入tableA时使用触发器来插入B吗?@Chris Moutray,我只是尝试创建第二个命令对象,第二个连接来进行第二次插入。没有错误,但没有插入到我的第二个表。请检查“TableA中新添加的CustLoginId”上的逻辑,除非该列具有唯一约束,否则您可以拥有重复的CustLoginI