3

sdf ファイルで DB の構造とデータを表す c# の DataSet に問題があります。DBで自動テストを行っているので、テーブルに行を追加し、テストを実行して、テーブルから追加された行を削除する必要があります。

テーブル スキーマ:

Num - ID, autoincrementing, primary key
Name - string
Photo - Image (binary)

私のコードは次のとおりです。

    adapter.Fill(set);
    row1 = datatable.Rows.Add(null, "Name1", File.ReadAllBytes(@"Images\photo1.jpg"));
    row2 = datatable.Rows.Add(null, "Name2", File.ReadAllBytes(@"Images\photo2.jpg"));
    adapter.Update(set);

    ... perfoming test...

    adapter.Fill(set);
    row1.Delete();
    row2.Delete();
    adapter.Update(set);

ただし、追加された行はまだベースにあります。使ってみた

datatable.Rows.Remove(row1);
datatable.Rows.Remove(row2);

しかし、DB の実際の自動インクリメント値とは異なる、行 1 と行 2 の「Num」値が間違っているため、no- such-row-exception が発生します。

  1. 行を追加するときに Num の真の値を取得するにはどうすればよいですか?
  2. 「行を追加する」->「何かを実行する」->「追加された行を削除する」問題のよりスマートな解決策はありますか?

前もって感謝します。

4

2 に答える 2

0

私は自分で解決策を見つけました。まず、DB で SQL クエリを作成しました。これは行を追加し、新しい行の Num 値を返します。

INSERT INTO [Table] ([Name], [Photo]) VALUES (@Name, @Photo);
SELECT  @@IDENTITY

私はそれを「InsertAndReturnIdentificator」と呼びました。次に、DataSet を使用せずに、(この新しいクエリを使用して) アダプターの行を直接挿入および削除しました。

private Nullable<decimal> row1;
private Nullable<decimal> row2;

row1 = adapter.InsertAndReturtIdentificator("Name1", File.ReadAllBytes(@"Images\Photo1.jpg")) as Nullable<decimal>;
row2 = adapter.InsertAndReturtIdentificator("Name2", File.ReadAllBytes(@"Images\Photo2.jpg")) as Nullable<decimal>;

... performing test ...

adapter.Delete(Decimal.ToInt32(row1.Value));
adapter.Delete(Decimal.ToInt32(row2.Value));
于 2013-03-22T07:43:33.650 に答える
-1

問題はここにあると思います:

row1 = datatable.Rows.Add(null, "Name1", File.ReadAllBytes(@"Images\photo1.jpg"));

ステートメントを次のように置き換えてみてください。

int i = 0;
datatable.Rows.Add(i++, "Name1", File.ReadAllBytes(@"Images\photo1.jpg"));
datatable.Rows.Add(i++, "Name2", File.ReadAllBytes(@"Images\photo2.jpg"));

そして削除します

datatable.Rows[i].Delete();

MSDN の次のリンクを確認してください。

于 2013-03-21T09:53:51.873 に答える