Динамическая вставка в SQL без имен полей - PullRequest
1 голос
/ 01 декабря 2011

Я ищу решение для вставки некоторых данных в таблицу, используя 3 параметра, первый - это имя таблицы, а второй - список с классом, который имеет свойство name и value. У меня есть частично решение (ниже) для этого, но я не думаю, что это рекомендуется, поэтому я ищу лучшую практику для этого.

Если это возможно, я хотел бы предложить создать это с использованием параметров, чтобы избежать инъекций.

private void InsertMetada(string deviceType, List<DeviceFields> deviceFields)
 {
 DataBaseConnection database = new DataBaseConnection ();
 database.Open();
 StringBuilder strb = new StringBuilder();
 stb.Append(string.Format("INSERT INTO DEVICE_{0} ( ", deviceType.ToString().ToUpper()));
 foreach (var item in deviceFields)
 {
    strb.Append(string.Format(" {0}, ",item.name.ToString()));            
 }
 stb.Append(") VALUES ( ");
 foreach (var item in deviceFields)
 {
    strb.Append(string.Format(" '{0}', ", item.value.ToString()));
 }
 strb.Append(")");
 database.executeQuery(strb.ToString());
 database.Close();
 }

РЕДАКТИРОВАНИЕ: Не думаю, что я был очень ясен в своем вопросе. В этом случае DeviceFields.item.name имеет то же имя поля таблицы.

Что мне нужно, так это гарантировать создание разных свойств устройства для разных типов устройств в разных таблицах.

Возможно, моя точка зрения неверна, но я подумал, что если бы я разделил таблицы, я мог бы выполнить быстрый поиск. В этом примере моя таблица (DEVICE_KEYBOARD) выглядит так:

> FIELD NAME  | TYPE
 -------------|---------
 language     | varchar   
 key          | varchar   
 isMultimedia | varchar
 deviceID     | varchar

и список выглядит как

> DeviceFields[0]:
 name = language  
 value = en-us 

> DeviceField[1]:  
 name = key  
 value = 102

> DeviceField[2]:  
 name = isMultimedia  
 value = Yes

> DeviceField[3]:  
 name = deviceID  
 value = 0000-0000-00000-00000

А вторая таблица, например, выглядит так:

 TABLE DEVICE_SPEAKER

> FIELD NAME   | TYPE
 --------------|---------
 rms           | varchar   
 remoteControl | varchar   
 subwoofer     | varchar
 deviceID       | varchar

У него есть все поля устройства в первой таблице, но эти свойства специфичны для каждого типа устройства ...
Идея состоит в том, чтобы иметь возможность создать новое свойство, создающее новый столбец, когда пользователь нажимает на кнопку ADD в этой таблице с префиксом "DEVICE_ {DEVICE TYPE}" *

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

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

Я согласен с созданием хранимой процедуры.Если вы хотите, чтобы ваши операторы INSERT были динамическими, это можно сделать в sproc.

http://www.codeproject.com/KB/database/Building_Dynamic_SQL.aspx

Лично я ненавижу динамический SQL в хранимых процедурах, и некоторые скажут, что это плохая практика, но иногда это лучший вариант в зависимости от ваших обстоятельств.Я просто выбрасываю это как вариант.

1 голос
/ 01 декабря 2011

Моя рекомендация - создать хранимую процедуру, и имена параметров будут соответствовать имени каждого deviceField. Недостатком является то, что хранимый параметр proc должен соответствовать (без учета регистра) вашим именам полей.

0 голосов
/ 01 декабря 2011

Как улучшение. Я бы построил параметризованный запрос в форме

Insert into {TableName} ({ColumnName1,ColumnName2..ColumnNameN}) 
Values(@ColumnName1,@ColumnName2.. @ColumnNameN)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...