2

したがって、リストボックスから行を削除したいのですが、これはユーザーが削除を押す場所であり、プログラムがその処理を実行する必要があります。唯一のことはそうではないということです。名を削除するだけでは正常に機能し、データベースが更新されますが、名と名の両方を削除しようとすると機能しません。誰か助けてくれませんか。私はこれに不慣れで、これは学校への割り当てのためです。どうもありがとうございます。

乾杯

SqlConnection cn;
        cn = new SqlConnection();
        cn.ConnectionString = "Data source=(local); Initial Catalog=INT422Assignment1;Integrated Security=SSPI;";
        cn.Open();
        SqlCommand cmd;
        cmd = new SqlCommand();
        cmd.Connection = cn;
        cmd.CommandText = "DELETE FROM myTable WHERE firstName=@firstName AND lastName=@lastName";


        SqlParameter param;
        param = new SqlParameter("@firstName", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = firstNameDelete.Text;
        cmd.Parameters.Add(param);

        param = new SqlParameter("@lastName", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = lastNameDelete.Text;
        cmd.Parameters.Add(param);


        cmd.ExecuteNonQuery();

        cn.Close();




        MessageBox.Show("Deleted");
        this.Close();
4

4 に答える 4

0

最初から間違ったアプローチをしていると思います。John Smith と John Doe という 2 人の John がいるとします。クエリが次の場合:

DELETE FROM myTable WHERE FirstName="John";

つまり、ファースト ネームが「John」であるすべてのエントリが削除されます。両方とも John です。

あなたが持っている場合:

DELETE FROM myTable WHERE FirstName="John" AND LastName="Doe";

理論的には、John Doe は削除されます。繰り返しますが、John Doe が複数ある場合はどうでしょうか。それらをすべて削除しますか?

単一のエントリを削除する場合は、一意の ID を含むリスト内の非表示の列に従って削除するか、リストボックスをテーブルにバインドすることをお勧めします。

于 2012-10-27T01:37:16.340 に答える
0

このクエリを使用してみて、小文字または大文字の文字を確認してください

DELETE FROM myTable WHERE Upper(FirstName)=Upper(@firstName) AND Upper(LastName)=Upper("@LastName");

または、正確に単語を検索しない場合は Like not = を使用できます

実行の影響を受ける行を確認できます

int numberOfRecords = cmd.ExecuteNonQuery();

于 2012-10-27T01:53:21.207 に答える
0

そのコードには本質的に「間違った」ものは何もありません。ただし(および主にコメントの要約):

  1. 入力値が期待どおりであることを確認し1、SSMS または同様の対話型 SQL クライアントでコマンドが (期待される値で) 実行されることを確認します2

  2. ケーシング/スペースが正しいことを確認してください。これが問題になるかどうかは、特定の列の COLLATION 設定によって異なります。繰り返しますが、SSMS または同様のツールからコマンドを実行すると、これが機能するかどうかが表示されます。

  3. ExecuteNonQuery変更された「レコード数」の結果を調べます。DELETE が成功した場合は 1 になります。トランザクション スコープが進行中の場合、非常に怪しいことが発生する可能性があるため、この値を観察することが重要です。名だけで「正常に動作する」場合、これはありそうにありませんが、これは実行するのに適したチェックです。


1 Visual Studio デバッガーを使用して、パラメーターにバインドされた時点で値を調べます。

2トランザクションを使用して、これらのテスト中に「実際に削除する」ことを回避できます。または、実際のクエリ ( ) ロジックに影響を与えないため、DELETEに変更することもできます。SELECTWHERE .. AND

于 2012-10-27T02:02:19.113 に答える
0

ああ、返事が遅くなってごめんなさい。したがって、本質的にこれは私が間違ったことです:私のメインフォームで、リストボックスにデータを入力していたとき、これが私が使用したものです:

s = reader["firstName"].ToString() + "-" + reader["lastName"].ToString(); studentInfoListBox.Items.Add(s); } 

そしてdeleteItemフォームで、私は次のことをしました:

string[] b = curItem.Split('-'); firstNameDelete.Text = b[0].ToString(); lastNameDelete.Text = b[1].ToString(); 

そのため、メインフォーム部分に余分なスペースを入れていました " - "

于 2012-10-27T17:34:27.723 に答える