2016-12-15 119 views
0

如果記錄存在,我想在C#應用程序中進行額外的控制。C#從SQL Server數據庫中選擇

我得到了以下代碼 - 但它保持返回-1的結果,即使記錄確實存在於SQL Server數據庫中。

有人可以幫助我嗎?我已經添加了 - >它出錯的地方

private void btnVerwijderen_Click(object sender, RoutedEventArgs e) 
{ 
    if (autonrTextBox.Text == "") 
    { 
     MessageBox.Show("Waarschuwing u kunt geen auto verwijderen indien er GEEN autonr is ingevuld"); 
    } 
    else 
    { 
    --> SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-RSEBNR7;Initial Catalog=AudiDealer;Integrated Security=True"); 
    --> string check = "SELECT autonr FROM auto WHERE autonr [email protected]"; 

    --> SqlCommand command1 = new SqlCommand(check, con); 
    --> command1.Parameters.AddWithValue("@autonr", autonrTextBox.Text); 

     con.Open(); 
     int auto = command1.ExecuteNonQuery(); 
     con.Close(); 

--> X - 1 MessageBox.Show(auto.ToString()); 

     if (auto > 0) 
     { 
      try 
      { 
       con.Open(); 

       using (SqlCommand command = new SqlCommand("DELETE FROM auto WHERE autonr =" + autonrTextBox.Text, con)) 
       { 
        command.ExecuteNonQuery(); 
       } 

       con.Close(); 
      } 
      catch (SystemException ex) 
      { 
       MessageBox.Show(string.Format("An error occurred: {0}", ex.Message)); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Het opgegeven autonr komt niet voor in de database. controleer deze."); 
     } 
    } 
} 
+0

嘗試設置它作爲參數值時,您鑄造'autonrTextBox.Text'爲int。 – krillgar

回答

6

ExecuteNonQuery()方法不能像你認爲的那樣工作。此方法的返回值是已更改的行數,而不是結果集中的任何值。 SELECT查詢不會更改行,因此-1是預期結果。 0行意味着WHERE子句與UPDATE,DELETE或INSERT中的行不匹配。 -1用於指示不同的情況......不改變行或回滾的語句。檢查documentation for the method.中的備註部分

您想改爲使用ExecuteScalar()方法。

int auto = -1; 
using (var con = new SqlConnection(@"Data Source=DESKTOP-RSEBNR7;Initial Catalog=AudiDealer;Integrated Security=True")) 
using (var cmd = new SqlCommand("SELECT autonr FROM auto WHERE autonr [email protected]", con)) 
{ 
    cmd.Parameters.Add("@autonr", SqlDbType.Int).Value = int.Parse(autonrTextBox.Text); 
    con.Open(); 
    auto = (int)cmd.ExecuteScalar(); 
} 

終於...爲什麼在刪除前檢查?這只是浪費。只需發出DELETE語句。沒有必要先做一個SELECT。你的try/catch和if()檢查已經處理了記錄不存在的情況。

int autonr = 0; 
if (!int.TryParse(autonrTextBox.Text, autonr)) 
{ 
    MessageBox.Show("Waarschuwing u kunt geen auto verwijderen indien er GEEN autonr is ingevuld"); 
} 
else 
{ 
    try 
    { 
     using (var con = new SqlConnection(@"Data Source=DESKTOP-RSEBNR7;Initial Catalog=AudiDealer;Integrated Security=True")) 
     using (var cmd = new SqlCommand("DELETE FROM auto WHERE autonr = @autonr;", con)) 
     { 
      cmd.Parameters.Add("@autonr", SqlDbType.Int).Value = autonr; 
      con.Open(); 
      int result = cmd.ExecuteNonQuery(); 
      if (result <= 0) 
      { 
       MessageBox.Show("Het opgegeven autonr komt niet voor in de database. controleer deze."); 
      } 
     } 
    } 
    catch (SystemException ex) 
    { 
     MessageBox.Show(string.Format("An error occurred: {0}", ex.Message)); 
    } 
} 
+0

非常感謝你! –

+0

我該怎麼做一個字符串類型? –

0

問題在於command1.ExecuteNonQuery(),它返回修改行的數量。您的查詢不會修改任何內容,只能從數據庫中讀取數據,因此返回值始終爲-1。

因此使用ExecuteScalar而不是 - 它會返回您的autonr值。請記住檢查它null和投改正類型:

int auto = 0; 
object result = command1.ExecuteScalar(); 
if (result != null) 
    auto = (int)result; 
0

請使用的ExecuteScalar,的ExecuteNonQuery將不會返回結果。

0

的ExecuteNonQuery只返回該行,這是修改/添加/刪除 ,如果你想知道你有多少在查詢計數使用,並得到rows'number

SELECT Count(*) as CountAutonr FROM auto WHERE autonr [email protected] 

,然後你會得到來自CountAutonr的行數

0

這段代碼有很多錯誤,我真的建議你將這些數據庫查詢封裝在一個業務類中,它將連接到數據庫,檢索數據並返回爲一個DAO對象......但這不會回答你的問題。

的問題是,在選擇命令執行,ExecuteNonQuery是爲執行UPDATE,INSERT和DELETE語句,返回受影響的行數:

con.Open(); 
**int auto = command1.ExecuteNonQuery();** 
con.Close(); 

您必須使用ExecuteReader方法來檢索SELECT結果下面的文章中解釋說:

Retrieving Data Using a DataReader