Как передать строку C # в MySQL, включая специальные символы - PullRequest
0 голосов
/ 21 января 2019

Ну, я уже видел некоторые сообщения на этот счет, и лучший ответ, который я смог найти, это использовать Параметры , но в моем случае это невозможно:

Я создал отдельную библиотеку, которая отправляетзапросы к 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 (), для отправки списка полей для установки.

1 Ответ

0 голосов
/ 21 января 2019

заменить 'как' ', то есть 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);
...