【问题标题】:Prevent the user entering the same number twice in database c#防止用户在数据库c#中两次输入相同的数字
【发布时间】:2014-02-20 02:33:18
【问题描述】:

我已经创建了windows窗体,其功能是将信息添加到数据库中。但是,我有一个问题。当我在“产品代码”列中输入“SM0001”这样的数字并按回车键时,它将数据存储到数据库中,当我输入与之前输入的相同数字时,它不会阻止用户喜欢输入的“产品代码”已存在于数据库中。所以,这是我目前的数据库(显示在系统的datagridview中):

如您所见,“1”行和“2”行具有相同的“产品代码”。我的问题是:如何防止用户输入相同的数字两次?

这是我用来存储到数据库的代码:

private void AddDatabase(object sender, EventArgs e)
        {
            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                string query = "INSERT INTO [Record] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)";
                string _query = "INSERT INTO [TransRecord] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)";

                conn.Open();

                using (OleDbCommand cmd = new OleDbCommand(query, conn))
                {
                    cmd.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.VarChar);
                    cmd.Parameters["@ProductCode"].Value = this.numericTextBox1.Text;

                    cmd.Parameters.Add("@Quantity", System.Data.OleDb.OleDbType.Integer);
                    cmd.Parameters["@Quantity"].Value = Convert.ToInt32(this.numericUpDown1.Value);

                    cmd.Parameters.Add("@Description", System.Data.OleDb.OleDbType.VarChar);
                    cmd.Parameters["@Description"].Value = this.textBox5.Text;

                    cmd.Parameters.Add("@SubTotal", System.Data.OleDb.OleDbType.Integer);
                    cmd.Parameters["@SubTotal"].Value = Convert.ToInt32(this.numericTextBox2.Text);

                    cmd.Parameters.Add("@Total", System.Data.OleDb.OleDbType.Integer);
                    cmd.Parameters["@Total"].Value = Convert.ToInt32(this.numericTextBox3.Text);

                    cmd.Parameters.Add("@IssuedBy", System.Data.OleDb.OleDbType.VarChar);
                    cmd.Parameters["@IssuedBy"].Value = this.textBox1.Text;

                    cmd.Parameters.Add("@To", System.Data.OleDb.OleDbType.VarChar);
                    cmd.Parameters["@To"].Value = this.textBox2.Text;

                    cmd.Parameters.Add("@Dates", System.Data.OleDb.OleDbType.Date);
                    cmd.Parameters["@Dates"].Value = this.textBox3.Text;

                    cmd.Parameters.Add("@Times", System.Data.OleDb.OleDbType.DBTimeStamp);
                    cmd.Parameters["@Times"].Value = DateTime.Now.ToShortTimeString();

                    cmd.ExecuteNonQuery();

                    using (OleDbCommand _cmd = new OleDbCommand(_query, conn))
                    {
                        _cmd.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.VarChar);
                        _cmd.Parameters["@ProductCode"].Value = this.numericTextBox1.Text;

                        _cmd.Parameters.Add("@Quantity", System.Data.OleDb.OleDbType.Integer);
                        _cmd.Parameters["@Quantity"].Value = Convert.ToInt32(this.numericUpDown1.Value);

                        _cmd.Parameters.Add("@Description", System.Data.OleDb.OleDbType.VarChar);
                        _cmd.Parameters["@Description"].Value = this.textBox5.Text;

                        _cmd.Parameters.Add("@SubTotal", System.Data.OleDb.OleDbType.Integer);
                        _cmd.Parameters["@SubTotal"].Value = Convert.ToInt32(this.numericTextBox2.Text);

                        _cmd.Parameters.Add("@Total", System.Data.OleDb.OleDbType.Integer);
                        _cmd.Parameters["@Total"].Value = Convert.ToInt32(this.numericTextBox3.Text);

                        _cmd.Parameters.Add("@IssuedBy", System.Data.OleDb.OleDbType.VarChar);
                        _cmd.Parameters["@IssuedBy"].Value = this.textBox1.Text;

                        _cmd.Parameters.Add("@To", System.Data.OleDb.OleDbType.VarChar);
                        _cmd.Parameters["@To"].Value = this.textBox2.Text;

                        _cmd.Parameters.Add("@Dates", System.Data.OleDb.OleDbType.Date);
                        _cmd.Parameters["@Dates"].Value = this.textBox3.Text;

                        _cmd.Parameters.Add("@Times", System.Data.OleDb.OleDbType.DBTimeStamp);
                        _cmd.Parameters["@Times"].Value = DateTime.Now.ToShortTimeString();

                        _cmd.ExecuteNonQuery();
                    }

                    if (_choice.comboBox1.Text == "English")
                    {
                        System.Media.SoundPlayer _sound = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                        _sound.Play();

                        DialogResult _dialogResult = MessageBox.Show("Added Successfully!", "Success", MessageBoxButtons.OK);

                        if (_dialogResult == DialogResult.OK)
                        {
                            ViewDatabase(sender, e);

                            ClearTextBox(sender, e);
                        }
                    }

                    dataGridView1.ClearSelection();
                }

                conn.Close();
            }
        }

【问题讨论】:

  • 您需要将 ProductCode 字段设置为数据库中的主键字段 - 然后它将被强制在数据库级别是唯一的。

标签: c# winforms ms-access datagridview


【解决方案1】:

使用 SQL Server EXISTS 语法。

IF NOT EXISTS (SELECT * FROM Recrd WHERE (PRoductCode  = @ProductCode))
BEGIN
    INSERT INTO [Record] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)


    END
    ELSE
    BEGIN
do an update or give me some message
    END

好的,访问权限。我对它不是很好,但我认为这样的东西会起作用:

int intNumRows; 
string query = "SELECT COUNT(*) FROM [Record ] WHERE PRoductCode = @ProductCode "; 
objCmd = new OleDbCommand(strSQL, objConn); 
intNumRows = Convert.ToInt32(objCmd.ExecuteScalar()); 
if(intNumRows > 0) 
{ 
this.lblStatus.Text = "Record already exists for this customer."; 
} 
else
{ 
 string query = "INSERT INTO [Record] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)";
                string _query = "INSERT INTO [TransRecord] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)";

---
---

【讨论】:

  • 访问语法先生怎么样?
【解决方案2】:

根据底层数据库,在所需列上创建一个唯一 = true 的索引

【讨论】:

    【解决方案3】:

    您可以将您的列设为主要列或唯一列,然后当您尝试插入时,您将得到异常。

    如果您无法更改数据库,您可以在插入之前检查ProductCode 是否存在,如下所示

    Select count(*) from [Record] where ProductCode =@ProductCode

    设置参数并运行cmd.ExcuteScaler(),根据返回值可以显示类似"Product Code" already exists的消息或插入

    conn.Open();
    using (OleDbCommand cmd = new OleDbCommand("Select count(*) from  [Record] where ProductCode =@ProductCode", conn))
    {
       cmd.Parameters.AddWithValue("@ProductCode",this.numericTextBox1.Text);
       object count = command.ExecuteScalar();
       int intcount;
       if(count !=null && int.TryParse(count.Tostring(), out intcount) && intcount >0)
       {
         // Product Code already exists, you can show error message to user 
         return;
       }
    }
    
    // your code ..
    string query = "INSERT INTO [Record] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)";
    string _query = "INSERT INTO [TransRecord] ([ProductCode], [Quantity], [Description], [SubTotal], [Total], [IssuedBy], [To], [Dates], [Times]) VALUES (@ProductCode, @Quantity, @Description, @SubTotal, @Total, @IssuedBy, @To, @Dates, @Times)";
    
    using (OleDbCommand cmd = new OleDbCommand(query, conn))
    

    【讨论】:

    • 先生,您能再给我一些例子吗?我明白你的意思,但这有点令人困惑。不过还是谢谢
    • 嗨,先生,我已经尝试过您的代码,每当我输入相同的数字两次时它就可以工作(显示错误消息),但是每当我输入不同的数字时,程序就会停止执行并给我一个int count = (int)command.ExecuteScalar(); 中的“null”错误谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多