2

フロントエンドに Gridview があり、Grid には次のような ID と Order の 2 つの列があります。

 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
4

3 に答える 3

1

これらのコンマ区切りの文字列を解析するための組み込み関数はありません。ただし、SQLServerの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;

ライブデモ

次に、これをストアドプロシージャなどの中に入れることができます。

注:これらすべてを手動で行う必要はありませんでした。このグリッドビューで、データバインディングを介して基になるデータテーブルを自動的に更新する方法が必要です。このような苦痛の代わりに、このようなものを検索する必要があります。

于 2013-02-04T07:01:37.577 に答える
1

テーブル値パラメーターを使用して、区切り記号で区切られた値や 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
    

    ご覧のとおり、SQL は、XML や区切り文字列の解析に比べて簡単です。

  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;
    }
    

    (コードはこの質問から削除されました)

ご覧のとおり、このアプローチ (SQL-Server 2008 以降に固有) により、構造化データをパラメーターとしてプロシージャーに渡すことがより簡単かつ正式になります。さらに、型の安全性に常に取り組んでいるため、文字列/xml 操作で発生する傾向がある解析エラーの多くは問題になりません。

于 2013-02-04T08:17:29.710 に答える