c# - 如何将包含特殊字符的 C# 字符串传递给 MySQL

标签 c# mysql apostrophe

嗯,我已经看到了一些关于此的帖子,我能找到的最佳答案是使用 Parameters ,但就我而言不可能:

我制作了一个单独的库,用于向 MySQL 或 MSSQL 发送请求,具有以下功能:

public long Insert(string query)
   {
      if (this.OpenConnection() == true)
      {
         if (isMySQL)
         {
            MySqlCommand cmd = new MySqlCommand(query.Replace("[v-steel].", ""), connection);
            cmd.ExecuteNonQuery();
            long lastId = cmd.LastInsertedId;
            this.CloseConnection();
            return lastId;
         }
         else
         {
         using (SqlCommand command = new SqlCommand(query + "; SELECT SCOPE_IDENTITY () As NewID", MSconnection))
            {
               SqlDataReader dataReader = command.ExecuteReader();
               if (dataReader.HasRows)
               {
                  dataReader.Read();
                  long lastId = long.Parse(dataReader["NewID"].ToString().Trim());
                  return lastId;
               }
            }
         }
      }
      return -1;
   }

因此,由于此函数对于任何查询/表都是全局的,因此我无法使用参数。

我最后想要的是能够在我的数据库中发送撇号、逗号等字符...我发现的所有内容都是替换函数或参数,是否有一种“更简单”的方法来实现我的函数插入和更新,所以我确信我永远不会收到错误消息,并且这些字符将被考虑在内。 通常我会遇到发回用户评论的问题,评论里可以写任何东西。

编辑:

第二种可能性是在插入功能中编辑我的请求(在发送查询之前)

发送的请求看起来像这样(在我的具体示例中):

string requete = "INSERT INTO [v-steel].assemblage_avancement_histo(ID_ASS_AV,ID_USER,ID_OP,ID_OP_NEXT,COMM) VALUES(" + this.IdAssAv + "," + this.IdUser + "," + this.IdOp+","+this.IdOpNext+",\'"+this.Comm+"\')";
            this.ID=DataBase.Insert(requete);

正如你所理解的,我的问题是在“this.Comm”上遇到的,这是用户留下的评论,我希望允许用户写任何他们想要的东西。

编辑:

根据MarcGravell的评论,我添加了一个新对象ElementInput

public class ElementInput
{
   private string field;
   public string Field
   {
      get { return field; }
      set { field = value; }
   }
   private string valeur;
   public string Valeur
   {
      get { return valeur; }
      set { valeur = value; }
   }
 }

然后修改插入函数如下:

public long Insert(string table,List<ElementInput> listElements)
  {
    if (this.OpenConnection() == true)
    {
      if (isMySQL)
      {
        string query = "INSERT INTO [v-steel]." + table + "(";
        for(int i=0;i<listElements.Count();i++)
        {
          if(i>0)
          {
            query += ",";
          }
          query += listElements[i].Field;
        }
        query += ") values (";
        for (int i = 0; i < listElements.Count(); i++)
        {
          if (i > 0)
          {
            query += ",?valeur"+i;
          }
          else
          {
            query += "?valeur"+i;
          }
         }
         query += ")";
         MySqlCommand cmd= new MySqlCommand(query.Replace("[v-steel].", ""), connection);
         for(int i=0;i< listElements.Count(); i++)
         {
           cmd.Parameters.Add(new MySqlParameter("valeur"+i, listElements[i].Valeur));
         }
         cmd.ExecuteNonQuery();
         long lastId = cmd.LastInsertedId;
         this.CloseConnection();
         return lastId;
       }
       else
       {
           //same thing for MSSQL         
       }
      }
      return -1;
    }

剩下的唯一一件事就是编辑我调用 Insert() 的所有函数,以发送要设置的字段列表。

最佳答案

将 ' 替换为 '' ,即 this.Comm.Replace("'", "''")

string requete = "INSERT INTO [v-steel].assemblage_avancement_histo(ID_ASS_AV,ID_USER,ID_OP,ID_OP_NEXT,COMM) VALUES(" + this.IdAssAv + "," + this.IdUser + "," + this.IdOp+","+this.IdOpNext+",\'"+this.Comm.Replace("'", "''")+"\')";
        this.ID=DataBase.Insert(requete);

关于c# - 如何将包含特殊字符的 C# 字符串传递给 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54285500/

相关文章:

c# - 如何为网页编码撇号

php - 为什么带单引号的字符串在插入数据库时​​会引发错误?

c# - 无法通过 1 个测试用例的同构字符串检查的简单解决方案

c# - 任何字节数组都可以转换为字符串吗?

mysql - 在同一个表中将值从一列复制到另一列

mysql - 将产品插入相邻列表模型中类别和父级层次关系的表中

php - 更改 ShareJS 中的默认文本

mysql - 撇号丛林

c# - 如何在AppDomain中找到尚未加载的类型?

c# - Entity Framework 延迟加载 AsNoTracking()