【发布时间】: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