我使用此代码进入。
private void button1_Click(object sender, EventArgs e)
{
string Coonstring = "datasource=localhost;port=3306;username=root;password=****;Charset=utf8";
string cmd = "Insert into project.name_registry (name ) values('" + this.txt.Text + "');";
MySqlConnection connectionDatabase = new MySqlConnection(Coonstring);
MySqlCommand cmddata = new MySqlCommand(cmd, connectionDatabase);
MySqlDataReader myreader;
try
{
connectionDatabase.Open();
myreader = cmddata.ExecuteReader();
MessageBox.Show("Done");
while (myreader.Read())
{
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
按下此按钮时我需要检查是否显示插入名称消息框,告诉我该名称是否存在并阻止添加。如果没有告诉我插入完成。我怎么能这样做。
问候
答案 0 :(得分:1)
进行此类检查的最佳位置是数据库本身。几乎所有数据库都可以在字段上设置UNIQUE约束。如果将name
中的name_registry
列设置为唯一,则DBMS将不允许您添加具有相同名称的第二个条目,并且将引发异常。这通常是最好的方式。
如果数据库不在您手中且您无法将列设置为唯一,则可以使用@FrancisDucharme和其他人的建议并查询DB以获取给定名称,并仅调用{{1如果它返回0结果:
INSERT
注意,虽然不需要调用SELECT COUNT(*) FROM name_registry WHERE [name] = 'TheName'
,也不需要调用此单结果SELECT语句,也不需要调用上面的INSERT语句 - 您应该调用ExecuteReader
,这将返回单值结果没有加载你真正不需要的全尺度ExecuteScalar
。
最后,作为答案的补充,我不能让你继续前进而不指向至少one tutorial关于在ADO.NET中使用参数化查询的方向,这不仅仅是在我看来,有助于防止SQL注入攻击,还有助于清理代码并使其更具可读性。那里有很多。
答案 1 :(得分:-1)
首先,如前所述:您可以看到MAJOR SQL Injections ......
其次,你应该使用params。
第三,如果你
SELECT *
FROM [TABLE]
WHERE [ColumnName] = @Param