所以我使用的是 MySQL 服务器版本 8.0.16,如果我尝试动态创建新用户,我确实会收到一条错误消息,内容如下:>>您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法。在第 1 行<< 的“$password”附近使用。
我无法理解,因为如果我用实际值替换参数并用 shell 尝试它,它就可以完美工作。我让我的代码以 root 身份连接,并检查连接是否打开。因此,如果我进入代码并检查参数是否正确,一切看起来都很好。我还在 thext 字符串的开头和结尾添加了 >>'<< 来替换参数,但它没有改变错误或发生的情况。
public bool CreateNewUser(string name, string password, string host)
{
string query = "CREATE USER $name@$host IDENTIFIED BY $password;";
List<MySqlParameter> mies = new List<MySqlParameter>
{
new MySqlParameter("$name", name),
new MySqlParameter("$password", password),
new MySqlParameter("$host", host)
};
return InsertIntoQuery(query, mies);
}
//The InsertIntoQuery looks like this
private bool InsertIntoQuery(string sql, List<MySqlParameter> sqlParameters = null)
{
bool retBl = false;
try
{
using (var SqlConnection = new MySqlConnection(ConnectionStr))
{
SqlConnection.Open();
using (var cmd = new MySqlCommand(sql, SqlConnection))
{
if (sqlParameters != null)
foreach (var item in sqlParameters)
cmd.Parameters.AddWithValue(item.ParameterName, item.Value);
cmd.Prepare();
var retValNonQuery = cmd.ExecuteNonQuery();
retBl = (retValNonQuery > 0) ? true : false;
}
}
}
catch (Exception e)
{
MessageBox.Show("Error: " + e.Message);
}
return retBl;
}
我希望它创建一个新用户,但事实并非如此。
最佳答案
不,对于CREATE USER
命令,我认为您不能同样传递命令参数。而是使用字符串插值语法替换该值,如下所示。
string query = $"CREATE USER '{name}@{host} IDENTIFIED BY {password}";
对于较旧的 C# 版本,请考虑使用 string.Format()
string query = string.Format("CREATE USER '{0}'@'{1}' IDENTIFIED BY '{2}'",name,host,password);
根据OP的评论:你不能因为它不是DML操作。如果您担心SQL注入(inject)可能会导致输入值来自用户输入,那么您将不得不以某种方式对其进行清理,而且如果您观察到输入被引用。
我再次建议这种管理操作应该放在数据库引导脚本中,而不是放在应用程序代码中。
关于c# - 使用 MySQL 参数创建新用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56593368/