1

저는 C# 및 SQL Server로 로그인 응용 프로그램을 만들고 있습니다.ExecuteNonQuery() 항상 -1을 반환합니다.

내 프로그램이 수행하는 작업 : 지정된 사용자 이름과 암호를 데이터베이스에서 찾을 수 있는지 확인합니다.

찾을 수있는 경우 ExecuteNonQuery()은 1 (1 row found)을 반환해야합니다.

조합이없는 경우 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를 사용하고 msdn의 반환 된 개체 HasRows – Steve

+0

, UPDATE, INSERT 및 DELETE 문의 경우 반환 값은 명령의 영향을받는 행 수입니다. 삽입 또는 갱신중인 테이블에 트리거가 존재하면, 리턴 값에는 삽입 또는 갱신 조작과 트리거 또는 트리거에 의해 영향을받는 행의 수에 영향을받는 행 수가 포함됩니다. 다른 모든 유형의 명령문의 경우, 리턴 값은 -1입니다. 롤백이 발생하면 반환 값은 -1입니다. – Shyju

+0

결과가 단일 열로 된 단일 행이 있으므로 ExecutScalar를 사용하여 더 나은 쿼리를 실행해야합니다. – Steve

답변

1

당신이 하나의 방법은 데이터베이스에 대해 가능한 모든 작업을 수행 할 것으로 보인다. 이것은 사실상 불가능합니다. 더 나은 방법은 데이터베이스에서 상호 작용하는 특정 메서드를 사용하는 것입니다.

예를 들어 Gebruikerklasse을 변경하고 Exists이라는 메서드를 추가하여 특정 작업에 대한 상호 작용을 미세 조정할 수 있습니다. 2 개만 필요할 때 많은 매개 변수를 작성할 필요가 없습니다. ....

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); 
     } 
    } 
} 

이 당신의 작업에 OOP 접근 방식을 만드는 단지 첫 번째 단계되어야한다 등, 다시 저장로부터 정보를 얻기 위해 전화를 더 확대됨에 ExecuteScalar는 사용 (정정). 다음은 데이터베이스 코드와 모델을 분리하는 방법을 배우는 것입니다.

사이드 노트 : 항목이 존재하는지 여부를 발견하기 위해 테이블의 수를 낭비하는 것은 낭비입니다. 여기에 많은 도움이되는 특정 SQL 문이 있습니다. IF에 대한
검색이 존재하고 나는이 질문에 대한 답이 알고있는이 문서
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

관련 문제