2016-05-31 5 views
0

У меня есть проект MVC-Razor, и я обязан сделать это без использования ORM. Я использую только SQL команды, а в методе добавить (модель) для контроллера БД я выполнить команду строки запроса в следующем формате:C# строка запроса автоматизации

string queryString = 
       "INSERT INTO USERS VALUES(@EMAIL,@PAIS,@IDIOMA,@CODPROMO,@NOMBREUSU"+ 
       ",@PASS,@PIN,@TRATAMIENTO,@NOMBREPERS,@APELLIDOS,@FECHANAC,@DIRECCION,@NUMPISO"+ 
       ",@CP,@CIUDAD,@NIF,@NUMMOVIL,@SUBSCRIBIR,@CONDICIONES,@PRIVACIDAD)"; 

Как вы можете видеть, что есть много параметров, чтобы вставить в таблицу , Затем мне нужно связать эти @параметры с command.Parameters.AddWithValue("@EMAIL",socio.Mail);

Есть ли какой-либо более быстрый способ сделать все это (что-то более динамичное, возможно?) Без всякой записи?

+5

копия + паста я предполагаю – Jonesopolis

+0

Предполагая, все параметры свойства в классе можно использовать отражение в цикле по классу и создать строку запроса – JaredStroeb

+0

, почему бы вам не создать хранимую процедуру .. или создать класс, который имитирует структуру вашего запроса или запросов. – MethodMan

ответ

3

Таким образом, любой более быстрый способ сделать это без всего этого письма?

Да, если это то, что вам нужно сделать, рассмотрите возможность рефакторинга кода SQL и потяните его в stored procedure(SP) и вызовите этот SP в свой код. Вы можете также рассмотреть возможность использования переменной типа таблицы, если вы хотите отправить структурированные данные.

2

Вот краткий пример отражения для построения строки запроса. Идея состоит в том, чтобы иметь класс, который отражает столбцы таблицы. Следующий код может использоваться для создания вставки для любого класса модели данных. Он построит инструкцию insert и заполнит параметры, затем выполнит оператор.

public static void GenericSqlInsert(string connectionString, string table, Object model) 
    { 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      string commandText = "Insert into " + table + "Values("; 
      SqlCommand command = new SqlCommand(); 
      PropertyInfo[] properties = model.GetType().GetProperties(); 

      foreach (PropertyInfo property in properties) 
      { 
       commandText += "@" + property.Name + ","; 
       command.Parameters.AddWithValue("@" + property.Name, property.GetValue(model)); 
      } 
      commandText = commandText.TrimEnd(','); 
      commandText += ") "; 

      try 
      { 
       command.Connection = connection; 
       command.CommandText = commandText; 

       connection.Open(); 

       Int32 rowsAffected = command.ExecuteNonQuery(); 
       Console.WriteLine("RowsAffected: {0}", rowsAffected); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 

Я не знаю, рекомендую ли я этот метод, но это интересное использование отражения.

отредактирован, чтобы отразить предложение Алексея Левенков

отредактирован, чтобы сделать функцию более общий

+0

Рекомендация SQL-инъекции - не очень хорошая идея (особенно без каких-либо предупреждений). Аналогичные параметры добавления образцов заслуживают вместо этого. –

+0

@Alexei Levenkov Я внесла изменения в использование параметров sql-запроса. Мой первоначальный ответ не отражает лучших практик. – JaredStroeb

+0

Выглядит хорошо, не забудьте добавить * использование * параметров в 'command', чтобы построить строку, аналогичную показанной OP. –

Смежные вопросы