c#检查订单号是否已经存在
本文关键字:存在 是否 检查 订单号 | 更新日期: 2023-09-27 18:14:38
我一直在研究如何检查用户id已经存在,看看如何做到这一点。
我试图让这个工作在我的代码,但它不工作。我没有得到错误或其他东西,但它只是在数据库中写入数据,即使订单号已经存在。
函数: 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!");
}
}
对于这个众所周知的重复问题,我很抱歉,但是由于某种原因,我无法让它工作。
您调用了错误的命令,更改
SqlDataReader reader = sqlCommand.ExecuteReader();
SqlDataReader reader = cmd.ExecuteReader();
问题就在这里:
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));
虽然您的代码充满了问题(魔术按钮,SQL注入,缺少using
),但有一个主要问题。您想要实现的方法将在并发插入上失败,因此不能使用。
korder
值:
- 第一次执行
SELECT
-给定值的记录不存在; - 第二次执行
SELECT
-记录的给定值不存在; - 第一次执行
INSERT
-给定值的记录是否存在; - 第二次执行
INSERT
-哎呀…我们有一个副本;
为了避免重复,必须在数据库中使用唯一索引。不要依赖你的代码
检查HasRows
是否为INSERT INTO testtabel bla...bla..bla..
而不是' select * from testtable where 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!");
}
}