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

问题描述 投票:0回答:1

嗯,我已经看到了一些关于这方面的帖子,我能找到的最好答案是使用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() 的所有函数,以发送要设置的字段列表。

编辑(4年后):对于读过这篇文章的人来说,没有必要像我一样浪费时间尝试没有参数,这会浪费时间,有一天你会完成这样做,所以最好改变你的早点养成习惯。

c# mysql apostrophe
1个回答
0
投票

将 ' 替换为 '' ,即 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);
© www.soinside.com 2019 - 2024. All rights reserved.