我目前正在写我的第一个.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值?对于重复值或没有数据库响应,我必须回复什么异常?
答案 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的帮助下参数化了查询。非常感谢他们俩。 改变计数方法是在另一个社区的编码员的建议下完成的 - 一个好朋友和一个出色的编码员。