0

我正在使用 Visual Studio 2010 中的 C#、.NET 框架 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 服务代码以便能够进行第二次插入?非常感谢您为我提供帮助的时间和精力。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

4 回答 4

1

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

SqlConnection.BeginTransactionMSDN 上找到的内容显示了一个很好的示例http://msdn.microsoft.com/en-us/library/86773566.aspx,它应该如何编码。

于 2012-08-02T11:57:51.963 回答
1

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

于 2012-08-02T13:08:33.470 回答
1

表 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。我怀疑一个客户可以有不止一个报价。假设客户可以有多个报价,这将是设计。为什么日期是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) 
于 2012-08-02T14:32:45.723 回答
0

There are multiple ways in which you can achieve it

1.You can use second command object(This command will use the same connection)to have another insert.

2.You can call a stored procedure where in you can handle multiple inserts & have access to recently inserted data in table A.

3.You can always use ORMs like Linq to SQL or EF.

4.Use trigger on Table A's Insert.

于 2012-08-02T11:37:43.053 回答