2017-01-06 33 views
1

私はC#とSQL Serverでログインアプリケーションを作成しています。ExecuteNonQuery()は常に-1を返します

私のプログラムは何ですか:指定されたユーザー名とパスワードがデータベースに存在するかどうかを調べます。

見つかった場合、ExecuteNonQuery()は1(1ローが見つかりました)を返します。

この組み合わせが存在しない場合、ExecuteNonQuery()は別のものを返す必要があります。

私の場合は、良い組み合わせと間違った組み合わせを使用するたびに、常に-1が返されます...これをどのように修正しますか?

私が知っている、そこに同じ質問のためのいくつかの既存の投稿がありますが、それはまだ固定していない...

また、ExecuteNonQuery() & ExecuteScalar()の違いは何ですか?

これは、送信されるクエリです:

private void btn_loginvolgende_Click(object sender, EventArgs e) 
{ 
    gebruiker.Gebruikersnaam = Convert.ToString(tb_gebruikersnaamlogin.Text); 
    gebruiker.Wachtwoord = Convert.ToString(tb_wachtwoordlogin.Text); 
    gebruiker.Achternaam = "a"; 
    gebruiker.Geslacht = "a"; 
    gebruiker.Geslacht = "a"; 
    gebruiker.Huidiggewicht = 1; 
    gebruiker.Streefgewicht = 1; 
    gebruiker.Leeftijd = 1; 
    gebruiker.Naam = "a"; 

    db.QueryToDatabase("Select count (*) from Gebruiker where Wachtwoord = @Wachtwoord AND Gebruikersnaam = @Gebruikersnaam;", gebruiker); 
    Thread.Sleep(500); 

    if (db.Success == false) 
    { 
     MessageBox.Show("Login gegevens kloppen niet!"); 
    } 
    else if (db.Success == true) 
    { 
     MessageBox.Show("U bent met succes ingelogd"); 
    } 
} 

、これは私のクラスである:

public void QueryToDatabase(string commandText, Gebruikerklasse gebruiker) 
{ 
    // nieuwe connectie maken 
    // ontvangt de query vanuit 'buttonclick' en voert hem hier uit 
    // als ExecuteNonQuery niet kan worden uitgevoerd is er iets fout gegaan. D.m.v een bool moet hij dan een bericht tonen 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = new SqlCommand(commandText, conn)) 
    { 
     conn.Open(); 

     cmd.Parameters.AddWithValue("@Naam", gebruiker.Naam); 
     cmd.Parameters.AddWithValue("@Achternaam", gebruiker.Achternaam); 
     cmd.Parameters.AddWithValue("@Leeftijd", gebruiker.Leeftijd); 
     cmd.Parameters.AddWithValue("@Geslacht", gebruiker.Geslacht); 
     cmd.Parameters.AddWithValue("@Huidiggewicht", gebruiker.Huidiggewicht); 
     cmd.Parameters.AddWithValue("@Streefgewicht", gebruiker.Streefgewicht); 
     cmd.Parameters.AddWithValue("@Gebruikersnaam", gebruiker.Gebruikersnaam); 
     cmd.Parameters.AddWithValue("@Wachtwoord", gebruiker.Wachtwoord); 

     int a = cmd.ExecuteNonQuery(); 

     if (a == 1) 
     { 
      Success = true; 
     } 
     else if (a == -1) 
     { 
      Success = false; 
     } 

     conn.Close(); 
    } 
} 
+1

SELECTクエリを実行しています。 ExecuteNonQueryは、UPDATE/INSERT/DELETEを実行するときに影響を受ける行の数を返します。レコードがある場合はkwowにし、ExecuteReaderを使用し、返されたオブジェクトHasRows – Steve

+0

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

+0

結果が1列の単一の行があるため、クエリがExecuteScalarによって実行されます。 – Steve

答えて

1

あなたがデータベースに対して可能なすべてのタスクを実行するための単一の方法を望んでいるようです。これは事実上不可能です。データベースとのやりとりを行うクラス内の特定のメソッドを持つ方がよいでしょう

たとえば、Gebruikerklasseを変更してExistsというメソッドを追加して、特定のタスクの対話を微調整できます。あなたは2つだけ必要なときに多くのパラメータを作成する必要はありません。これはあなたのタスクにOOPのアプローチを作成するための唯一の最初のステップである必要があり

public class Gebruikerklasse 
{ 
    .... 
    public bool Exists() 
    { 
     string commandText = @"Select count (*) from Gebruiker 
           where Wachtwoord = @Wachtwoord AND 
          Gebruikersnaam = @Gebruikersnaam;", 
     using (SqlConnection conn = new SqlConnection(DBClass.GetConnectionString())) 
     using (SqlCommand cmd = new SqlCommand(commandText, conn)) 
     { 
      conn.Open(); 
      cmd.Parameters.AddWithValue("@Gebruikersnaam", gebruiker.Gebruikersnaam); 
      cmd.Parameters.AddWithValue("@Wachtwoord", gebruiker.Wachtwoord); 
      int a = Convert.ToInt32(cmd.ExecuteScalar()); 
      return (a > 0); 
     } 
    } 
} 

....など、バックストレージからあなたの情報を取得するために呼び出すよりパフォーマンスは、ExecuteScalar(と正しい)を使用します。次に、モデルをデータベースコードから切り離す方法を学習します。

サイドノート:エントリが存在するかどうかを検出するためだけにテーブルのカウントを強制することは無駄です。ここで多くのことを助ける特定のSQLステートメントがあります。 IF用
検索は、私はこの質問が回答されている知っているEXISTSと
Exists vs Count The battle never ends

+0

var a =(int)cmd.ExecuteScalar(); if(a> 0) { Succes = true; } else { Succes = false; } それは機能しました!ありがとう!ここでこれらの「ばかげた」質問をするのはちょっと厄介です... – Gigitex

+0

これは同じことですが、上のコードはおそらく別のクラスにあるため、おそらくプロパティーの成功はありません。 – Steve

0

この記事を読んで。しかし、私はあなたのためのいくつかの追加情報を追加したいと思います:

ExecuteNonQuery - クエリを実行し、影響を受けた行を返します。

ExecuteScalar - クエリを実行し、最初の行の最初の列の値を返します。

ExecuteReader - クエリを実行し、SqlDataReaderを返します。要求されたデータベースレコードを読み取るために使用することができます

私は最近「メモリ管理」を含むこのチュートリアルを書きました。参照してください:http://jeroenstevens.blogspot.ca/2017/02/how-to-connect-netc-to-sql-database.html

関連する問題