c# - 使用 MySQL 参数创建新用户

标签 c# mysql

所以我使用的是 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/

相关文章:

c# - 如何使用 TPL 处理长时间运行的进程

mysql - 无法执行MySQL存储过程

mysql - 如何在开发和生产中使用两个连接字符串

sql - 查询以获取足够接近的连续事件

mysql - 从不同的列中选择数据

mysql - 从mysql表中删除选定的行

c# - Oracle.DataAccess.EntityFramework,版本=6.121.2.0 找到的程序集的 list 定义与程序集引用不匹配

c# - 同步框架 : Can I Sync only a subset of my tables?

c# - Windows 服务发送 Toast 通知

c# - 从终结器访问不可终结的对象