MySql Вставьте адаптер легко вставьте запрос для класса - PullRequest
0 голосов
/ 10 октября 2019

Я создал MySql-адаптер для загрузки данных MySql в класс Gerneric. (Легко создать класс http://json2csharp.com/) Первое свойство - это id-индекс этого.

Но моя проблема в том, чтобы создать команду вставки, точнее заполнить экземпляр значениями из Generic T:

public bool SqlInsertOrUpdate<T>(T insertObj, string table, bool updateOnDuplicateKey = true)
{
  try
  {
    using ( var connection = new MySql.Data.MySqlClient.MySqlConnection(connectionString) )
    using ( var command = connection.CreateCommand() )
    {
      command.CommandText = "INSERT INTO " + table;

      var properties = typeof(T).GetProperties();
      var instance = (T)Activator.CreateInstance(typeof(T));

      string commandCols = "";
      string commandValues = "";
      string commanDuplicateKey = "";

      for ( int i = 0; i < properties.Length; i++ )
        if ( properties[i] != null )
        {
          if ( i == 0 )
          {
            commandCols += "(";
            commandCols += properties[i].Name;
            commandValues += " VALUES (?";
            commandValues += "?" + properties[i].Name;
          }
          else if ( i != properties.Length )
          {
            commandCols += ",";
            commandCols += properties[i].Name; commandValues += ", ?";
            commandValues += properties[i].Name;
            commanDuplicateKey += properties[i].Name
                                + "=values(?" + properties[i].Name + "), ";
          }
          else if ( i == properties.Length )
          {
            commandCols += ")";
            commandValues += ")";
            commanDuplicateKey += properties[i].Name
                                + "=values(" + properties[i].GetValue(insertObj) + ")";
          }
          //Value of Generic T ? insert Objekt[0] (properties).insertObj[0] ?
          command.Parameters.AddWithValue("?" + properties[i].Name,
                                                properties[i].GetValue(insertObj));
        }
      command.CommandText += commandCols;
      command.CommandText += commandValues;
      if ( updateOnDuplicateKey )
      {
        command.CommandText += commanDuplicateKey;
      }
      connection.Open();
      command.ExecuteNonQuery();
      connection.Close();
    }
  }
  catch ( Exception ex )
  {
    return false;
  }
  return true;
}
...