我一直在调查How to check user id already exists,看看如何做到这一点。
我试图在我的代码中使用它,但它无法正常工作。我不会得到错误或其他东西,但它只是在数据库中写入数据,即使订单号已经存在。
功能:
private void createorderButton_Click(object sender, EventArgs e)
{
SqlConnection myConnection = dbHelper.initiallizeDB();
String query = "INSERT INTO testtabel (knaam, korder) VALUES ('" + knaamTextBox.Text + "','" + kordernrTextBox.Text + "')";
SqlCommand sqlCommand = new SqlCommand(query, myConnection);
SqlCommand cmd = new SqlCommand("select * from testtabel where korder = @korder", myConnection);
SqlParameter param = new SqlParameter();
param.ParameterName = "@korder";
param.Value = kordernrTextBox.Text;
cmd.Parameters.Add(param);
//sqlCommand.Connection.Open();
SqlDataReader reader = sqlCommand.ExecuteReader();
if (reader.HasRows)
{
MessageBox.Show("Order already exist");
}
else
{
reader.Close();
}
// opens execute non query
int rows_inserted = sqlCommand.ExecuteNonQuery();
if (rows_inserted > 0)
{
label2.Text = "Order has been created";
}
else
{
Console.Write("Oops! Something wrong!");
}
}
很抱歉这是一个众所周知且重复的问题,但出于某种原因,我无法让它发挥作用。
答案 0 :(得分:2)
您调用了错误的命令,更改了
SqlDataReader reader = sqlCommand.ExecuteReader();
到
SqlDataReader reader = cmd.ExecuteReader();
答案 1 :(得分:1)
问题在于:
SqlDataReader reader = sqlCommand.ExecuteReader();
您应该先执行另一个命令
SqlCommand cmd = new SqlCommand("select * from testtabel where korder = @korder", myConnection);
后一个命令,何时执行将告诉您testtabel
表中是否有任何记录。如果有,那么你应该显示消息:
订单已存在
否则,您将执行第一个插入行的命令。
顺便说一下,当你编写sql查询时,请尽量避免字符串连接。它是最着名的安全漏洞之一。您的代码对SQL注入是开放的。您可以使用参数化查询:
String query = "INSERT INTO testtabel (knaam, korder) VALUES (@knaam, @korder)";
SqlCommand sqlCommand = new SqlCommand(query, myConnection);
sqlCommand.Parameters.Add(new SqlParamete("@knaam",knaamTextBox.Text));
sqlCommand.Parameters.Add(new SqlParamete("@korder",kordernrTextBox.Text));
答案 2 :(得分:1)
虽然您的代码充满了问题(魔术按钮,SQL注入,缺少using
),但主要问题仍然存在。您要实现的方法将在并发插入时失败,并且不得使用。
想象一下,两个用户使用相同的korder
值对同一个数据库运行此代码:
SELECT
- 具有给定值的记录不存在; SELECT
- 具有给定值的记录不存在; INSERT
- 具有给定值的记录存在; INSERT
- ooops ...我们有重复; 为避免重复,您必须在数据库中使用唯一索引。不要依赖你的代码。
答案 3 :(得分:0)
你检查HasRows
INSERT INTO testtabel bla...bla..bla..
是否不是'来自testtabel的选举* korder'
也许你可以使用它(它来自我的头,而不是编译,请用你自己的情况调整)
private void createorderButton_Click(object sender, EventArgs e)
{
SqlConnection myConnection = dbHelper.initiallizeDB();
String query = "INSERT INTO testtabel (knaam, korder) VALUES ('" + knaamTextBox.Text + "','" + kordernrTextBox.Text + "')";
SqlCommand sqlCommand = new SqlCommand(query, myConnection);
SqlCommand cmd = new SqlCommand("select * from testtabel where korder = @korder", myConnection);
SqlParameter param = new SqlParameter();
param.ParameterName = "@korder";
param.Value = kordernrTextBox.Text;
//sqlCommand.Connection.Open();
SqlDataReader cmdReader = sqlCommand.ExecuteReader();
if (cmdReader.HasRows)
{
MessageBox.Show("Order already exist");
}
else
{
cmdReader.Close();
}
SqlDataReader reader = sqlCommand.ExecuteReader();
// opens execute non query
int rows_inserted = sqlCommand.ExecuteNonQuery();
if (rows_inserted > 0)
{
label2.Text = "Order has been created";
}
else
{
Console.Write("Oops! Something wrong!");
}
}