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!");
            }

        }

对于这个众所周知的重复问题,我很抱歉,但是由于某种原因,我无法让它工作。

c#检查订单号是否已经存在

您调用了错误的命令,更改

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!");
            }

        }