0

テーブルを表示する DataGrigView を持つ winform アプリケーションを作成しています。DB の操作を担当する DAL クラスがあります。

テーブルのデータをロードするメソッドが 1 つあります。

 public static void GetItemsByOrder(int orderId, ref DataSet dataSet)
    {
        string queryString = @"Select Id,OrderId as [מס' הזמנה],ItemCode as[מק""ט], ItemName as [שם פריט], ReceiptDate as [ת. הספקה],
                WarrantyExpDate as [באחריות עד],SuppliersItemCode as [מק""ט ספק], Supplier as [ספק], Count as[כמות], Active 
                FROM OrdersManager_Items where OrderId = @param";

        SqlConnection connection = new SqlConnection(connectionString);
        SqlCommand command = new SqlCommand(queryString, connection);
        command.Parameters.AddWithValue("@param", orderId);

        SqlDataAdapter adapter = new SqlDataAdapter(command);


        try
        {
            lock (myLock)
            {
                adapter.Fill(dataSet,"Items");
            }
        }
        catch (Exception ex)
        {
            LogWriter.WriteLogEntry(LogWriter.LogType.ERROR, string.Format("Failed to get Items by OrderId code from DB."+
                "This is due to exception: {0},\n StackTrace: {1}. ", ex.Message, ex.StackTrace));

            dataSet = null;
        }
    }

そして、テーブルに加えられた変更で DB を更新する責任がある 2 番目の方法:

public static bool UpdateItemsByOrder(int orderId, DataSet data)
    {

        string queryString = @"Select Id,OrderId as [מס' הזמנה],ItemCode as[מק""ט], ItemName as [שם פריט], ReceiptDate as [ת. הספקה],
                WarrantyExpDate as [באחריות עד],SuppliersItemCode as [מק""ט ספק], Supplier as [ספק], Count as[כמות], Active 
                FROM OrdersManager_Items where OrderId = @param";


        SqlConnection connection = new SqlConnection(connectionString);
        SqlCommand command = new SqlCommand(queryString, connection);
        command.Parameters.AddWithValue("@param", orderId);

        SqlDataAdapter adapter = new SqlDataAdapter(command);


        try
        {
            lock (myLock)
            {

                SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
                int rowsUpdated = adapter.Update(data,"Items");

                return true;
            }
        }
        catch (Exception ex)
        {
            LogWriter.WriteLogEntry(LogWriter.LogType.ERROR, string.Format("Failed to update Items table in DB. This is due to exception: {0},\n StackTrace: {1}. ", ex.Message, ex.StackTrace));

            return false;
        }
    }

問題: Items テーブルで新しい行が追加または削除された場合、UpdateItemsByOrder は期待どおりに DB の行を追加/削除します。ただし、Items テーブルの既存の行を更新しても、DB では更新されません。

エラーや例外はありません。builder.GetUpdateCommand() コマンドを追加しようとしました = 結果がありません。

ヘルプやアドバイスをいただければ幸いです。ありがとう

P>S> この MSDN LINKを使用して、SQLAdapter の操作方法を学習しています

4

2 に答える 2

1

わかりました、sallushan のアドバイスで解決策を得ました: DataAdapter が DB を更新しない理由は、DataTable の更新された行の RowState 値が「Modified」ではなく「Unchanged」であるためです。

この問題を解決するには、次の 2 つの基本的な方法があります。

  1. DGV ではなく、DataTable で直接データを更新します。
  2. Here で説明されているように、DGV を介して更新を行った後、DataTable.Rows[indexOfUpdatedRowInDGV].EndEdit() メソッドを呼び出します。

助けてくれてありがとう:-)

于 2014-06-02T13:39:53.373 に答える
0

update の代わりに SELECT コマンドを実行していることに気付きましたか? 私の推測ではadapter.Update、行が更新されていないため、行が更新されていないことを選択して報告するだけです。

于 2014-06-01T15:01:00.040 に答える