2016-12-15 90 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