我一直在努力检查数据库表中是否存在记录。我有以下代码,它无法正常工作。
MySqlConnection connection = new MySqlConnection("My connection string");
string check = string.Format("Select COUNT(*) FROM User_Class WHERE user_class_name = '{0}'", TextBox1.Text);
string query = string.Format("INSERT INTO User_Class (user_class_name) VALUE ('{0}');", TextBox1.Text);
MySqlCommand cmd = new MySqlCommand(check, connection);
MySqlCommand cmd2 = new MySqlCommand(query, connection);
//MySqlDataReader reader;
connection.Open();
if (cmd.BeginExecuteNonQuery().Equals(0))//record does not exist
{
cmd2.BeginExecuteNonQuery();
Label1.Text = "User Class Created!";
Label1.ForeColor = Color.Green;
}
else
{
Label1.Text = "User Class Already Exists";
Label1.ForeColor = Color.Red;
}
此代码总是转到其他情况。我也尝试使用MySqlDataReader
执行此操作,但这也无效。为什么它不返回0(或false / null)?检查空回报的最佳方法是什么?
答案 0 :(得分:3)
这里至少有两个问题。
首先,您正在调用BeginExecuteNonQuery
- 它不返回整数,它返回IAsyncResult
。我强烈怀疑你根本不想处理异步API。
其次,使用ExecuteNonQuery
无论如何都不适合查询。我怀疑你实际上想要ExecuteScalar
:
if ((int) cmd.ExecuteScalar() == 0)
您可能需要投放到long
而不是int
;我不知道它将返回什么类型的价值。但是,对于“SELECT COUNT”查询来说,这是一个更明智的调用。
我然后建议您使用ExecuteNonQuery
进行INSERT ...更改代码后使用参数化SQL而不是现在使用的SQL-injection-inviting方法
答案 1 :(得分:1)
检查此链接
http://msdn.microsoft.com/en-us/library/ca56w9se%28v=vs.110%29.aspx
http://msdn.microsoft.com/en-us/library/7b6f9k7k%28v=vs.110%29.aspx
这是一种显示异步数据的方法
答案 2 :(得分:1)
有几点 - 你没有正确调用BeginExecuteNonQuery()
命令 - 我认为你不是所有的异步方法。
此外,您正在使用ExecuteNonQuery
调用检查 - 只执行查询并返回结果状态 - 除非SQL失败将始终成功,您应该使用:
if ((long)(cmd.ExecuteScalar() ?? 0) == 0)
这将为您提供Count(*)
最后 - 编写你喜欢的嵌入式SQL让你开始讨厌 - 看看这个:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html