0

テーブルから行をフェッチして別のテーブルに挿入しようとしています。そのために、この簡単なコードを書きましたが、何が問題なのかわかりません。

ご覧のとおりExecuteNonQuery、ステートメントを実行した後に使用し、メッセージボックスを使用して出力を表示しましたが、メッセージボックスの出力は-1です

for (int i = 1; i <= 10; i++)
{
    SqlCommand cmd = new SqlCommand("Select exp_date from tbl_expences where exp_id='" + i + "'", con);

    int j = cmd.ExecuteNonQuery();

    MessageBox.Show(Convert.ToString(j));

    if (j > 1)
    {
       string date = cmd.ExecuteScalar().ToString();

       MessageBox.Show(date);
       SqlCommand cmd1 = new SqlCommand("update other_expensive set exp_date='" + date + "' where exp_id='" + i + "'", con);
    }
}
4

2 に答える 2

2

ExecuteNonQuery()INSERTUPDATEまたはに使用されDELETEます。を使いExecuteReader()たい場合に使用しますSELECT

于 2012-06-23T22:41:09.497 に答える
0

なぜこのために 20 個 (このコードで他に何が起こるかによっては 30 個) のステートメントを実行するのでしょうか?

ExecuteNonQueryのドキュメントから:

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1です。ロールバックが発生した場合、戻り値も -1 です。

(強調を追加)

それだけではない理由:

update oe set exp_date=e.exp_date
from
    other_expensive oe
       inner join
    tbl_expense e
       on
          oe.exp_id = e.exp_id
where
    e.exp_id between 1 and 10

1つのクエリを使用してすべての更新を並行して行い、ループを回避し、使用しようとしているように見える「段階的な」アプローチを行います。

于 2012-06-24T08:47:22.560 に答える