2013-02-04 48 views
2

我在前端一個GridView其中網格具有兩列:ID和順序是這樣的:更新從兩個表逗號分隔的參數作爲輸入

ID  Order 

1   1 
2   2 
3   3 
4   4 

現在用戶可以在前端的GridView更新順序等:

ID  Order 

1   2 
2   4 
3   1 
4   3 

現在,如果用戶點擊保存按鈕的ID和順序數據被髮送到存儲過程作爲@sID =(1,2,3,4)和@sOrder =(2,4,1 ,3)

現在,如果我想更新訂單和保存我想將它存儲到數據庫中。通過存儲過程如何更新到表中,這樣的表被更新,並同時選擇它給我的結果,如:

ID  Order 

1   2 
2   4 
3   1 
4   3 

回答

1

沒有內置函數來分析這些逗號分隔字符串。但是,您可以使用SQL Server中的XML功能來執行此操作。喜歡的東西:

DECLARE @sID VARCHAR(100) = '1,2,3,4'; 
DECLARE @sOrder VARCHAR(10) = '2,4,1,3'; 

DECLARE @sIDASXml xml = CONVERT(xml, 
          '<root><s>' + 
          REPLACE(@sID, ',', '</s><s>') + 
          '</s></root>'); 

DECLARE @sOrderASXml xml = CONVERT(xml, 
         '<root><s>' + 
         REPLACE(@sOrder, ',', '</s><s>') + 
         '</s></root>'); 

;WITH ParsedIDs 
AS 
(
    SELECT ID = T.c.value('.','varchar(20)'), 
    ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowNumber 
    FROM @sIDASXml.nodes('/root/s') T(c) 
), ParsedOrders 
AS 
(
    SELECT "Order" = T.c.value('.','varchar(20)'), 
     ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowNumber 
    FROM @sOrderASXml.nodes('/root/s') T(c) 
) 
UPDATE t 
SET t."Order" = p."Order" 
FROM @tableName AS t 
INNER JOIN 
(
    SELECT i.ID, p."Order" 
    FROM ParsedOrders p 
    INNER JOIN ParsedIDs i ON p.RowNumber = i.RowNumber 
) AS p ON t.ID = p.ID; 

Live Demo

然後你就可以把這個存儲過程或什麼的裏面。

請注意:您不需要手動執行所有這些操作,應該通過某種方式使GridView通過數據綁定自動更新底層數據表。你應該尋找這樣的東西,而不是所有的痛苦。

+0

非常感謝,但什麼是T.c.value? – user1446764

+0

@ user1446764 [**'value()**](http://msdn.microsoft.com/zh-cn/library/ms178030.aspx)是SQL Server中四種XML數據類型方法之一。它用於提取xml節點內的值。 –

0

您可以使用CHARINDEX像

DECLARE @id VARCHAR(MAX) 
DECLARE @order VARCHAR(MAX) 

SET @id='1,2,3,4,' 
SET @order='2,4,1,3,' 

WHILE CHARINDEX(',',@id) > 0 
BEGIN 
DECLARE @tmpid VARCHAR(50) 
SET @tmpid=SUBSTRING(@id,1,(charindex(',',@id)-1)) 
DECLARE @tmporder VARCHAR(50) 
SET @tmporder=SUBSTRING(@order,1,(charindex(',',@order)-1)) 

UPDATE dbo.Test SET 
[Order][email protected] 
WHERE ID=convert(int,@tmpid) 

SET @id = SUBSTRING(@id,charindex(',',@id)+1,len(@id)) 
SET @order=SUBSTRING(@order,charindex(',',@order)+1,len(@order)) 
END 
1

你可以使用一個table valued parameter,以避免發送分隔符分隔值甚至XML數據庫。要做到這一點,你需要:

  1. 聲明的參數類型在數據庫中,這樣的:

    CREATE TYPE UpdateOrderType TABLE (ID int, Order int) 
    
  2. 之後,你可以定義程序使用參數作爲

    CREATE PROCEDURE UpdateOrder (@UpdateOrderValues UpdateOrderType readonly) 
    AS 
    BEGIN 
        UPDATE t 
        SET OrderID = tvp.Order 
        FROM <YourTable> t 
         INNER JOIN @UpdateOrderValues tvp ON t.ID=tvp.ID 
    END 
    

    正如你所看到的,與解析XML或分隔字符串相比,SQL是微不足道的。

  3. 使用從C#中的參數:

    using (SqlCommand command = connection.CreateCommand()) { 
        command.CommandText = "dbo.UpdateOrder"; 
        command.CommandType = CommandType.StoredProcedure; 
    
        //create a table from your gridview data 
        DataTable paramValue = CreateDataTable(orderedData) 
        SqlParameter parameter = command.Parameters 
              .AddWithValue("@UpdateOrderValues", paramValue); 
        parameter.SqlDbType = SqlDbType.Structured; 
        parameter.TypeName = "dbo.UpdateOrderType"; 
    
        command.ExecuteNonQuery(); 
    } 
    

    其中CreateDataTable是一樣的東西:

    //assuming the source data has ID and Order properties 
    private static DataTable CreateDataTable(IEnumerable<OrderData> source) { 
        DataTable table = new DataTable(); 
        table.Columns.Add("ID", typeof(int)); 
        table.Columns.Add("Order", typeof(int)); 
        foreach (OrderData data in source) { 
         table.Rows.Add(data.ID, data.Order); 
        } 
        return table; 
    } 
    

    (代碼this question解除)

正如你可以看到這種方法(特定於SQL Server 2008和更高版本)使得更容易和更正式地通過將結構化數據中的數據作爲過程的參數。更重要的是,您一直在使用類型安全,所以在字符串/ xml操作中出現的大量解析錯誤不是問題。

相關問題