在没有字段名称的SQL中动态插入

时间:2011-11-30 20:33:09

标签: c# sql sql-server sql-injection

我正在寻找一种解决方案,使用3个参数在表中插入一些数据,第一个是表名,第二个是具有name和value属性的类的List。 我有一个部分解决方案(下面),但我不认为这是推荐的,所以,我正在寻找最好的做法。

如果可能的话,我想建议使用参数来创建它,以避免注射。

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按钮时,在此表中使用前缀&#34; DEVICE_ {DEVICE TYPE}&#34;

我可以在准备列表时列出所有字段,我的问题是要知道是否有最好的选项来创建这些东西,以及什么可以安全和快速。

3 个答案:

答案 0 :(得分:1)

我的建议是创建一个存储过程,参数名称将匹配每个deviceField的名称。缺点是存储的proc参数必须匹配(不区分大小写)您的字段名称。

答案 1 :(得分:1)

我同意创建存储过程。如果您需要INSERT语句是动态的,可以在sproc中完成。

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

就个人而言,我讨厌存储过程中的动态SQL,有些人会说这是不好的做法,但有时它是最好的选择,具体取决于你的情况。我只是把它扔出去作为一种选择。

答案 2 :(得分:0)

作为改进。我将以

的形式构建参数化查询
Insert into {TableName} ({ColumnName1,ColumnName2..ColumnNameN}) 
Values(@ColumnName1,@ColumnName2.. @ColumnNameN)

如果您可以对每个表执行上述操作,那么不知道您的数据是同源的,然后将参数添加到命令对象,然后遍历列表并将参数设置为值。

不是很精彩,但更好。我已经使用了上述技术,即使在一些传统的东西中没有列名,其中表基本上是一个属性包。