2

私はこのコードを持っていて、それは常に-1を返します。私は3つのテーブルを持っています(写真はより示唆的です): ここに画像の説明を入力してください

行がすでにReservationDetailsテーブルにあるかどうか、および挿入されていないかどうかを確認したいと思います。

try
        {
            SqlConnection conn = new SqlConnection... 
            SqlCommand slct = new SqlCommand("SELECT * FROM ReservationDetails WHERE rID=@rID AND RNumber=@RNumber", conn);
            slct.Parameters.AddWithValue("@rID", (int)comboBox1.SelectedValue);
            slct.Parameters.AddWithValue("@RNumber", dataGridView1.SelectedRows[0].Cells[0].Value);

            int noRows;//counts if we already have the entry in the table
            conn.Open();
            noRows = slct.ExecuteNonQuery();
            conn.Close();
            MessageBox.Show("The result of select="+noRows);

            if (noRows ==0)    //we can insert the new row
4

5 に答える 5

7

あなたがすべき

1)TSQLを次のように変更します

 SELECT COUNT(*) FROM ReservationDetails WHERE ...

(さらに良いのは、IF EXISTS...を使用する)

2)そして使用するExecuteScalar()

noRows = (int) slct.ExecuteScalar();

また、トランザクション(または他のアトミック手法)を使用する必要があります。そうしないと、テストと挿入の間に行を挿入する可能性があります...

とはいえ、パラメータを指定し、アトミックにテストしてテーブルに挿入し、1成功した0場合、または行がすでに存在する場合に返すストアドプロシージャを作成することをお勧めします。

于 2012-04-07T08:42:14.063 に答える
7

のドキュメントを読んだことがありますSqlCommand.ExecuteNonQueryか?

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

そして、あなたのクエリはSELECTです。

于 2012-04-07T08:42:32.540 に答える
2

サーバーを2回要求する必要がないように、1つのクエリで実行することをお勧めします。

このようなプロシージャを作成し、コードから呼び出します。

IF EXISTS (SELECT 1 from ReservationDetails WHERE rID=@rID AND RNumber=@RNumber)
BEGIN
 insert into ReservationDetails values(@rID,@RNumber)
END
于 2012-04-07T08:47:35.920 に答える
2

Microsoftによると:

You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables), or to change the data in a database without using a DataSet by executing UPDATE, INSERT, or DELETE statements.

ExecuteNonQueryの代わりに必要なのはExecuteScalarで、選択したクエリにCOUNTを入力します。

すなわち

SqlCommand slct = new SqlCommand("SELECT COUNT(*) FROM ReservationDetails WHERE   rID=@rID AND RNumber=@RNumber", conn);

また、C#のusingステートメントを利用してみてください。そうすれば、問題が発生した場合でも、手動で接続を閉じることを心配する必要はありません。

すなわち

using (SqlConnection conn = new SqlConnection(connString))
{
    SqlCommand cmd = new SqlCommand(sql, conn);
    try
    {
        conn.Open();
        newProdID = (Int32)cmd.ExecuteScalar();
    }
    catch (Exception ex)
    {
        //Do stuff
    }
}

参照: http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

于 2012-04-07T08:48:45.237 に答える
1

@nickNatra

あなたが使うときはいつでも

コマンドを選択

それはあなたに値を返します。どちらでも使用できます

DataSetまたはSqlDataReader

だが

command.ExecuteNonQuery()

使用している場合にのみ使用されます

テーブル内の行が影響を受ける場所に挿入、更新、削除

はい、クエリに含まれるレコードの量を知りたい場合。あなたが実行することができます

a)クエリ「selectcount(*)fromtable」を変更ます

ここでは、1つの値のみを取得します。行の数。

b)このクエリ実行コマンドを使用します。行数である最初の行と最初の列のみを返すExecuteScalar()

したがって、これはあなたの要件を満たします。

乾杯!!

于 2012-04-07T08:54:52.333 に答える