假设我的这个方法来 self 的 MySQLOperations
类:
public bool checkIfRowExists(string tableName, string columnToLookIn, string dataToLookFor)
{
string myConnectionString = "Server = " + server + "; Database = " + dbName + "; UID = " + user + "; Password = " + password + ";";
int isExisting = 0;
using (MySqlConnection myConnection = new MySqlConnection(myConnectionString))
{
using (MySqlCommand myCommand = new MySqlCommand("SELECT EXISTS (SELECT 1 FROM @tablename WHERE @columnname = @data);", myConnection))
{
myCommand.Parameters.AddWithValue("@tablename", tableName);
myCommand.Parameters.AddWithValue("@columnname", columnToLookIn);
myCommand.Parameters.AddWithValue("@data", dataToLookFor);
try
{
myConnection.Open();
isExisting = (int)myCommand.ExecuteScalar();
myConnection.Close();
}
catch (Exception ex)
{
myConnection.Close();
MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return (isExisting == 1);
}
}
}
在另一个类中,我创建了一个 MySQLOperations
对象。
我在 if 语句中调用了此方法:if(objSQLOperations.checkIfRowExists("tblInventory", "ItemID", txtItemID.Text))
。我们假设 txtItemID 包含有效的 10 位数字。在我的数据库中,我有一个名为 tblInventory
的表,其中有一列 ItemID
。
我的问题是我的 catch block 中的语句执行时显示我的 SQL 语法有错误。 “您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 ''tblInventory' WHERE 'ItemID' = '11111111111'' 附近使用的正确语法。”当我的 txtItemID 包含文本“1111111111”时,会在 MessageBox 中弹出。
我相信我的 SELECT EXISTS
语句是正确的。
最佳答案
不,您不能使用表名或列名的参数。您必须通过连接动态构建 SQL 字符串。
喜欢:
var sql = "SELECT EXISTS(SELECT 1 FROM " + tablename +
" WHERE " + columnNameToLookIn + " = @data);"
using (MySqlCommand myCommand = new MySqlCommand(sql, myConnection))
这当然会让你进入 SQL injection如果tableName
和columnNameToLookIn
可以由用户输入。但是,如果 tableName
和 columnNameToLookIn
仅在代码中设置(如示例中所示),那么这不是问题。
相关:
关于C# 和 MySQL - 语法不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829661/