2012-08-02 89 views
0

我在Visual Studio 2010中使用C#,.NET framework 3.5編寫了一個Web服務。我的問題可能很基本,但我沒有使它成功運行。在SQL Server 2008中對不同表格進行多次插入

我可以成功地通過Web服務將數據提交給SQL數據庫。我希望能夠做到的是在SQL db中的一個表中插入記錄/行時,我希望能夠將數據插入到另一個表中,比如說表B.表B有5個列。它將從前一個表(通過Web服務插入的表A)中獲取兩個列值。表B中的一列是主鍵值,其餘兩列將具有靜態文本值。

下面是表的結構的

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。

這裏是我的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(); 
     } 
    } 
} 
+0

答案很簡單,但是你有什麼試過? – 2012-08-02 11:36:06

+1

你不能在插入tableA插入到B時使用觸發器嗎? – Chris 2012-08-02 11:38:10

+0

@Chris Moutray,我只是嘗試創建第二個命令對象,第二個連接有第二個插入。沒有錯誤,但沒有插入我的第二張桌子。 – Nemo 2012-08-02 11:52:31

回答

1

老實說,最合適的方法是使用存儲過程。一是避免使用SQL注入,二是它可以通過一個連接和一個對數據庫的調用完成你想要的任務,並且效率更高。讓SQL Server爲您做好工作。

+0

感謝您的建議。我使用存儲過程並在我的Web服務中調用它。做得很好!不得不在C#中使用轉義字符在代碼本身中掙扎...讓負擔落在SQL上,它做得很好..更重要的是,sql注入也被避免了。 TY。你們好棒! – Nemo 2012-08-02 15:31:14

0

有多種方式可以在其中實現它

1.You可以使用第二個命令對象(此命令將使用相同的連接)有另一個插。

2.You可以調用存儲過程在那裏你可以處理多個插入&在表A.訪問最近插入的數據

3.You總是可以使用像的LINQ的ORM SQL或EF。

4.使用表A的插入觸發器。

+0

Ty爲您的建議。我嘗試了第一個你認爲最簡單的方法,但是使用了diff連接。這是否是我插入不起作用的原因? – Nemo 2012-08-02 11:57:47

+0

@Nemo你真的想要考慮使用一個連接並利用交易 – 2012-08-02 11:58:52

1

根據你有什麼想要使用一個連接和第二個命令。爲兩個命令保持連接處於打開狀態,但確保使用事務,以便在出現錯誤時兩個SQL插入都會回滾。

在MSDN上找到的SqlConnection.BeginTransaction顯示了一個很好的示例http://msdn.microsoft.com/en-us/library/86773566.aspx它應該如何編碼。

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) 
+0

感謝您的輸入Blam。肯定會考慮重新設計。 – Nemo 2012-08-02 18:04:55

相關問題