如果数据库中已存在值,如何显示消息?

时间:2015-07-03 01:05:58

标签: c# mysql .net winforms visual-studio-2013

我目前正在写我的第一个.Net&使用Visual Studio的C#应用​​程序,需要从应用程序向MySQL写入生成的值。 目前,我可以写出正确的值 - 但我需要能够检查是否存在值并显示该行是否存在,否则将新行插入表中。我的连接字符串在表单的顶部定义。

我已经定义了以下内容,如果LicenseKey列中不存在重复值,它会成功写入数据库。如果存在重复,则会抛出未处理的异常。

private void SaveDetails()
{
    // MySQL 'insert' command
    string InsertNewLicense = "insert into BCOM.LicenseDetails(LicenseeName,ComputerName,ContactName,ContactEmail,LicenseKey,CreationDate) values('" +this.textBoxLicenseeName.Text+ "','" +this.textBoxComputerName.Text+ "','" +this.textBoxContactName.Text+ "','" +this.textBoxContactEmail.Text+ "','" +this.textBoxLicenseKey.Text+ "','" +this.textBoxCreationDate.Text+ "');";
    //MySQL instance details
    MySqlConnection InsertLicenseDetails = new MySqlConnection(LicenseDatabaseConnection);
    //MySQL command execution
    MySqlCommand InsertCommand = new MySqlCommand(InsertNewLicense, InsertLicenseDetails);
    // Handles command outputs.
    MySqlDataReader InsertReader;
    //Opens connection to run query on database
    InsertLicenseDetails.Open();
    // Here our query will be executed and data saved into the database.
    MessageBox.Show("License Details Saved. Please ensure you have emailed the license to the customer.");
    while (InsertReader.Read())
    {

    }
    InsertLicenseDetails.Close();
}

我想要发生的是在执行不同的操作之前,在LicenseKey列上运行检查以查看该值是否存在。 如果该值不存在,我想将新行插入表中(就像我现有的命令一样)。

但是,如果存在,我想弹出一个表单,显示副本作为表单出现的行中的值。

我将在哪里放入事件处理程序来读取MySQLException值?对于重复值或没有数据库响应,我必须回复什么异常?

2 个答案:

答案 0 :(得分:0)

我同意其他人在评论中所说的内容,您可以更改SQL查询以进行检查而不是2。

IF(SELECT ... WHERE A = B)
     RETURN THAT THE VALUE ALREADY EXISTS    
ELSE 
     INSERT NEW VALUE

对SQL注入和参数化查询也有很好的评论。查询字符串看起来应该更像

INSERT into BCOM.LicenseDetails(LicenseeName,ComputerName,ContactName,ContactEmail,LicenseKey,CreationDate) values(@LicenseeName, @ComputerName, @ContactName ...);

并且您的SqlCommand被参数化

InsertCommand.Paramaters.AddWithValue("@LicenseeName", this.textBoxLicenseeName.Text);
InsertCommand.Paramaters.AddWithValue("@ComputerName", this.textBoxComputerName.Text);
...

这应该是让你前进的良好开端。

答案 1 :(得分:0)

查看查询一段时间后,我决定尝试不同的方法 - 而不是使用直接检查它是否存在,我选择使用count(*)查询。当我单击表单上的保存按钮时,buttonClick_event调用SaveDetails(),它运行以下命令:

    private void SaveDetails()
    {
        string InsertNewLicense = "INSERT into BCOM.LicenseDetails(LicenseeName,ComputerName,ContactName,ContactEmail,LicenseKey,CreationDate) values(@LicenseeName, @ComputerName, @ContactName, @ContactEmail, @LicenseKey, @CreationDate)";
        string LicenseExistence = "SELECT COUNT(*) FROM BCOM.LicenseDetails WHERE LicenseKey LIKE @LicenseKey";

        MySqlConnection LicenseDetails = new MySqlConnection(LicenseDatabaseConnection);

        MySqlCommand InsertCommand = new MySqlCommand(InsertNewLicense, LicenseDetails);
        InsertCommand.Parameters.AddWithValue("@LicenseeName", this.textBoxLicenseeName.Text);
        InsertCommand.Parameters.AddWithValue("@ComputerName", this.textBoxComputerName.Text);
        InsertCommand.Parameters.AddWithValue("@ContactName", this.textBoxContactName.Text);
        InsertCommand.Parameters.AddWithValue("@ContactEmail", this.textBoxContactEmail.Text);
        InsertCommand.Parameters.AddWithValue("@LicenseKey", this.textBoxLicenseKey.Text);
        InsertCommand.Parameters.AddWithValue("@CreationDate", this.textBoxCreationDate.Text);

        MySqlCommand QueryCommand = new MySqlCommand(LicenseExistence, LicenseDetails);
        QueryCommand.Parameters.AddWithValue("@LicenseKey", this.textBoxLicenseKey.Text);

        MySqlDataReader InsertReader;

        LicenseDetails.Open();
        if ((int)(long)QueryCommand.ExecuteScalar() >0)
        {
            MessageBox.Show("This license already exists in the database.");
        }
        else
        {
            InsertReader = InsertCommand.ExecuteReader();
            MessageBox.Show("License Details Saved. Please ensure you have emailed the license to the customer.");
            while (InsertReader.Read())
            {

            }
        }
        LicenseDetails.Close();

因此,如果针对许可证密钥的查询返回任何结果(返回的行数超过0行),则会弹出一个消息框,显示该密钥已存在。如果结果行数为0,则运行insert命令。

通过查看MySQL命令说明,使用phpMyAdmin进行测试,在线匹配现有项目以及以下支持: SELECT查询得到了@Seige的大力支持。 根据{{​​3}}的建议,在Seige的帮助下参数化了查询。非常感谢他们俩。 改变计数方法是在另一个社区的编码员的建议下完成的 - 一个好朋友和一个出色的编码员。