C#检查订单号是否已存在

时间:2015-09-25 07:45:11

标签: c# sql

我一直在调查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!");

            }



        }

很抱歉这是一个众所周知且重复的问题,但出于某种原因,我无法让它发挥作用。

4 个答案:

答案 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值对同一个数据库运行此代码:

  • 1st执行SELECT - 具有给定值的记录不存在;
  • 第二次执行SELECT - 具有给定值的记录不存在;
  • 1st执行INSERT - 具有给定值的记录存在;
  • 2nd执行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!");

            }



        }