Как проверить, существуют ли данные в базе данных и показать ошибку - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь отобразить сообщение об ошибке, когда пользователь, отправляющий данные за ту же дату, не должен этого делать.Я не слишком уверен в том, как это сделать, но уже нанес удар, но не работает.я не уверен, как заставить читателя работать.

public string conString = "***ConnectionString***";

    private void mileage_submit_btn_Click(object sender, EventArgs e)
    {
        if (location_comboBox.Text == "" || mileage_textbox.Text == "" || other_location_textBox.Text == "" || other_mileage_textBox.Text == "")
        {
            MessageBox.Show("Fill all required fields", ("Validation"), MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            SqlConnection con = new SqlConnection(conString);
            con.Open();
            if (con.State == System.Data.ConnectionState.Open)

            {
                string query = "INSERT INTO Mileage_Table(eb_number , Date, Location, Mileage, Other_location, Other_Miles, Total_Miles) values(@eb_number, @Date, @Location, @Mileage, @Other_location,@Other_Miles, @Total_Miles)";
                SqlCommand cmd = new SqlCommand(query, con);
                cmd.Parameters.Add("@eb_number", SqlDbType.Text).Value = Username_Mileage_lbl.Text.ToString();
                cmd.Parameters.Add("@Location", SqlDbType.Text).Value = location_comboBox.Text.ToString();
                cmd.Parameters.Add("@Mileage", SqlDbType.Decimal).Value = Decimal.Parse(mileage_textbox.Text);
                cmd.Parameters.Add("@Other_Location", SqlDbType.Text).Value = other_location_textBox.Text.ToString();
                cmd.Parameters.Add("@Other_Miles", SqlDbType.Decimal).Value = Decimal.Parse(other_mileage_textBox.Text);
                cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Parse(Mileage_dateTimePicker.Text).ToString("dd-MM-yyyy");
                decimal b = Convert.ToDecimal(mileage_textbox.Text);
                decimal c = Convert.ToDecimal(other_mileage_textBox.Text);
                cmd.Parameters.Add("@Total_Miles", SqlDbType.Decimal).Value = Convert.ToString(b + c);


                using (var reader = cmd.ExecuteReader(System.Data.CommandBehavior.SingleRow))
                {
                    while (reader.Read())
                    {
                        if (reader.HasRows == true)
                        {
                            MessageBox.Show("Date = " + reader[7].ToString() + "Already Exists");
                        }
                    }
                }
                cmd.ExecuteNonQuery();
                decimal TotalMiles = b + c;
                MessageBox.Show(TotalMiles + " Miles has been Logged");
                con.Close();

1 Ответ

1 голос
/ 23 апреля 2019

Предполагая, что вы используете Sql Server, вы можете сделать это одним из способов, используя следующий SQL

If NOT Exists(select from table where datecolumn = @myDateParam)
    Insert Into table (col list) values (@param list);

Затем вы вызываете этот sql с помощью

int retVal = cmd.ExecuteNonQuery( ..  ); // for plain sql number of affected rows returned. 0 - would mean nothing inserted
MessageBox.Show((retVal > 0 ? "Record Inserted" : "Record with specific date already existed"));

Теперь, если вы хотитечтобы вывести вставленные значения, используя cmd.ExecuteReader, вам нужно добавить к вашей вставке Sql OUTPUT INSERTED предложение https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...