0

予約システムを作っています。

DBに挿入する前に、一連のデータの検証アルゴリズムを理解できません。主キーは、システムによって自動生成される予約IDになります。

bdate、btime、snameを検証する必要があります。(bdate =予約時間、btime =予約時間、sname =スタッフ名)

bdateの場合、btimeとsnameはクライアントが入力したものと同じです。スタッフはすでに同じ日時に予約しているため、システムは重複を警告します。

以下で私の挿入クエリを見つけてください。正しい方法を教えていただければ幸いです。

 private void btn_save_Click(object sender, EventArgs e)
    {
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;

        //query for duplicate
        cmd.CommandText = "select count(*) from Booking where sname = @newName and bdate = @newDate and btime = @newTime";
       // cmd.Parameters.Add("@newName", OleDbType.VarChar).Value = txt_cname.Text;
        //cmd.Parameters.Add("@newDate", OleDbType.DBDate).Value = dtp_bdate.Value.Date;
       // cmd.Parameters.Add("@newTime", OleDbType.VarChar).Value = dtp_btime.Value.ToString("hh:mm tt");

        cmd.CommandText = "insert into Booking(cname, bdate, btime, ccontact, sname) Values('" + txt_cname.Text + "','" + dtp_bdate.Value.Date + "','" + dtp_btime.Value.ToString("hh:mm tt") + "','" + txt_ccontact.Text + "','" + txt_sname.Text + "')";
        cmd.Connection = myCon;
        myCon.Open();

        int recordCount = Convert.ToInt32(cmd.ExecuteScalar());

        myCon.Close();

        if (recordCount>0)

        {
            // handle duplicates
            MessageBox.Show("Duplicated", "My Application",
            MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
        }

       // cmd.Connection = myCon;
        //myCon.Open();
       //cmd.ExecuteNonQuery();
        //myCon.Close();
        //MessageBox.Show(dtp_bdate.Value.ToString());
        //MessageBox.Show("Booking completed", "My Application",
       // MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
    }
4

4 に答える 4

2
    private bool RecordExists(string name, DateTime date, string time)
    {
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;

        //query for duplicate
        cmd.CommandText = "select count(*) from Booking where sname = @newName and bdate = @newDate and btime = @newTime";
        cmd.Parameters.Add("@newName", OleDbType.VarChar).Value = txt_cname.Text;
        cmd.Parameters.Add("@newDate", OleDbType.DBDate).Value = dtp_bdate.Value.Date;
        cmd.Parameters.Add("@newTime", OleDbType.VarChar).Value = dtp_btime.Value.ToString("hh:mm tt");

        myCon.Open();

        int recordCount = Convert.ToInt32(cmd.ExecuteScalar());

        myCon.Close();

        return recordCount > 0;
    }

    private void btn_save_Click(object sender, EventArgs e)
    {
        if (RecordExists(txt_cname.Text, dtp_bdate.Value.Date, dtp_btime.Value.ToString("hh:mm tt"))
        {
            MessageBox.Show("Duplicated", "My Application", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
            return;
        }

        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;

        cmd.CommandText = "insert into Booking(cname, bdate, btime, ccontact, sname) Values(@newName, @newDate, @newTime, @newContact, @newSName)";
        cmd.Parameters.Add("@newName", OleDbType.VarChar).Value = txt_cname.Text;
        cmd.Parameters.Add("@newDate", OleDbType.DBDate).Value = dtp_bdate.Value.Date;
        cmd.Parameters.Add("@newTime", OleDbType.VarChar).Value = dtp_btime.Value.ToString("hh:mm tt");
        cmd.Parameters.Add("@newContact", OleDbType.VarChar).Value = txt_ccontact.Text;
        cmd.Parameters.Add("@newSName", OleDbType.VarChar).Value = txt_sname.Text;

        cmd.Connection = myCon;
        myCon.Open();
        cmd.ExecuteNonQuery();
        myCon.Close();

        MessageBox.Show(dtp_bdate.Value.ToString());
        MessageBox.Show("Booking completed", "My Application", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
    }
于 2012-06-15T09:04:56.870 に答える
1

挿入を実行する前に予約が存在するかどうかを確認する必要があるため、追加の手順を追加する必要があります。

OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;

cmd.CommandText = "select count(*) from booking where cname = @newName and bdate = @newDate and ctime = @newTime";

cmd.Parameters.Add("@newName", OleDbType.VarChar).Value = txt_cname.Text;
cmd.Parameters.Add("@newDate", OleDbType.DBDate).Value = dtp_bdate.Value.Date;
cmd.Parameters.Add("@newTime", OleDbType.VarChar).Value = dtp_btime.Value.ToString("hh:mm tt");

cmd.Connection = myCon;
myCon.Open();

int recordCount = Convert.ToInt32(cmd.ExecuteScalar());

myCon.Close();

if (recordCount>0)
{
    // handle duplicates
}

これを実行すると、一致する行の数が返されます。これが1以上の場合は、重複するロジックを呼び出す必要があります。

コードを修正するために編集

于 2012-06-12T16:16:54.397 に答える
0

既存のフィールドがあるかどうかを確認するには、を作成しSelectてから比較します。

bool InfoRepeated()
    {
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = string.Format("SELECT cname FROM yourTable;");
        cmd.Connection = myCon;
        myCon.Open();
        try
        {
            OleDbDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                if (txt_cname.Text.Equals((rdr[0].ToString())))
                {
                    myCon.Close();
                    return true;
                }
            }
            myCon.Close();
            return false;
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
            myCon.Close();
            return false;
        }
    }

それが機能するかどうか、またはエラーが発生するかどうかをお知らせください。

于 2012-06-12T16:19:36.330 に答える
0

動作する便利なコードこれを試してください

BOMaster obj_data = new BOMaster();

obj_data.productid = tempid;
obj_data.categoryid =int.Parse(cmbcategory.SelectedValue.ToString());
obj_data.productcode = txtproductcode.Text;
obj_data.productname = txtproductname.Text;
obj_data.mqty = decimal.Parse(txtmqty.Text.ToString());

OleDbCommand mycmd = new OleDbCommand("select * from productmaster where productname=?", new OleDbConnection(Common.cnn));
BOMaster obj_datan = new BOMaster();

mycmd.Parameters.Add(new OleDbParameter("productname", txtproductname.Text));
mycmd.Connection.Open();

OleDbDataReader myreader = mycmd.ExecuteReader(CommandBehavior.CloseConnection);

if (myreader.HasRows == true)
{
    // savestutus = "false";
    MessageBox.Show("Product Name Already Exist", "Product", MessageBoxButtons.OK, MessageBoxIcon.Information);
    txtproductname.Focus();
    return;
}
mycmd.Connection.Close();

ProductDAL obj_dal = new ProductDAL();

if (obj_dal.Save(obj_data))
{
    Clear();
}
于 2013-04-08T09:36:09.983 に答える