多个插入到SQL Server 2008中的不同表

时间:2012-08-02 11:27:40

标签: c# .net sql-server-2008

我在Visual Studio 2010中使用C#,.NET framework 3.5编写Web服务。我的问题可能是基本的,但我没有运气使它工作。

我可以通过Web服务成功将数据提交到SQL数据库。我希望能够做的是在SQL db中的一个表中插入记录/行时,我希望能够将数据插入到另一个表中,例如表B.表B有5个列。它将从前一个表中获取两个列值(表A通过Web服务插入)。表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中某些字段的行插入。

我的问题是如何/在哪里编辑我的网络服务代码以便能够进行第二次插入?我非常感谢您花时间和精力帮助我。 TIA。

这是我的网络服务:

[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();
        }
    }
}

4 个答案:

答案 0 :(得分:1)

根据您所拥有的内容,您需要使用一个连接和第二个命令。保持两个命令的连接都打开,但确保使用事务,这样如果出现错误,则会回滚两个sql插件。

MSDN上的SqlConnection.BeginTransaction显示了如何编码的http://msdn.microsoft.com/en-us/library/86773566.aspx的好例子。

答案 1 :(得分:1)

老实说,最合适的方法是使用存储过程。第一,最好避免SQL注入,两个它可以通过一个连接和一个数据库调用来实现您想要的效果,并且效率更高。让SQL Server为您完成工作。

答案 2 :(得分:1)

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

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。我怀疑客户可以有多个报价。假设客户可以有多个报价,那就是设计。为什么date是varchar?由于数据时间已降至毫秒,因此不应在TableB上获得PK违规。如果你想允许两个引用相同的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) 

答案 3 :(得分:0)

有多种方法可以实现它

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

2.您可以调用存储过程,您可以在其中处理多个插入和放大可以访问表A中最近插入的数据。

3.您可以始终将Linq等ORM用于SQL或EF。

4.在表A的插入中使用触发器。