C#从SQL Server数据库中选择
如果记录存在,我想在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.");
}
}
}
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));
}
}
非常感谢你! –
我该怎么做一个字符串类型? –
问题在于command1.ExecuteNonQuery()
,它返回修改行的数量。您的查询不会修改任何内容,只能从数据库中读取数据,因此返回值始终为-1。
因此使用ExecuteScalar
而不是 - 它会返回您的autonr
值。请记住检查它null
和投改正类型:
int auto = 0;
object result = command1.ExecuteScalar();
if (result != null)
auto = (int)result;
请使用的ExecuteScalar,的ExecuteNonQuery将不会返回结果。
的ExecuteNonQuery只返回该行,这是修改/添加/删除 ,如果你想知道你有多少在查询计数使用,并得到rows'number
SELECT Count(*) as CountAutonr FROM auto WHERE autonr [email protected]
,然后你会得到来自CountAutonr的行数
这段代码有很多错误,我真的建议你将这些数据库查询封装在一个业务类中,它将连接到数据库,检索数据并返回为一个DAO对象......但这不会回答你的问题。
的问题是,在选择命令执行,ExecuteNonQuery
是为执行UPDATE,INSERT和DELETE语句,返回受影响的行数:
con.Open();
**int auto = command1.ExecuteNonQuery();**
con.Close();
您必须使用ExecuteReader
方法来检索SELECT结果下面的文章中解释说:
尝试设置它作为参数值时,您铸造'autonrTextBox.Text'为int。 – krillgar