我目前需要在数据库中插入一行,但我有很多列,总共11行(没有ID)。我正在使用以下命令:
INSERT INTO table1 (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11) VALUES (@par1, @par2, @par3, @par4, @par5, @par6, @par7, @par8, @par9, @par10, @par11)
但是你可以看到它太长了,我无法避免使用列名,因为我仍然有ID。是否有更有效的插入方式?或者也许是一种让它更短的方法?因为我正在做的方式,我还必须逐个添加参数:
myCommand.Parameters.Add(value1, "@par1");
答案 0 :(得分:0)
与填充任何其他语言的任何数据结构的成员实际上并没有多大区别。如果您没有填充数据结构的每个成员,则必须指定要填充的每个成员,您可以使用基于集合的方式(如SQL)或set object.attribute = value
中的单独属性值对指定它。
但是,与任何其他语言一样,您可以编写一个函数或过程来隐藏其中一些细节,这样您只需要传入适当的变量。然后,您只需要为任何给定的场景写出所有详细的代码。
答案 1 :(得分:0)
将所有值放入List中,并使用For循环,并在
中逐个插入List值答案 2 :(得分:0)
编辑:再次感谢@Sentinel提醒我留意潜在的安全风险。这种方法是语言独立的,但我同意他的建议,即您仍然可以使用myCommand.Parameters.Add(values[N], "@parN");
而不是为值构建字符串。
扩展@Javies Insuasti回答。
此答案假定您使用字符串构建SQL查询。
这是一种常见且易于处理的方案。处理此问题(imho)的最简单方法是在字符串中使用标记,创建列和值的数组/列表,并用这些数组/列表的内容替换标记。
using System;
class Program
{
//defining a blacklist of unwanted terms that should not appear in your column names or value strings
//This is just for the sake of the example, and there are definitely some statements missing in this array
static string[] QUERY_BLACKLIST = { "SELECT", "DROP", "INSERT", "DELETE", "UPDATE" };
static void Main(string[] args)
{
//Use markers in your query string
string query = "INSERT INTO table (:columns:) VALUES (:values:);";
//define an array of column names to insert for the :columns: marker
string[] columns = { "ID", "Name", "Age", "Something"};
//some dummy values. Real code would use a model or something to that effect
int id = 9;
string name = "John";
int age = 12;
bool something = true;
//all values should be passed as strings, they will replace the :values: marker
string[] values = { id.ToString(), name, age.ToString(), something.ToString()};
query = Program.FillColumnsIntoQuery(query, columns, values);
Console.WriteLine(query);
//Output:
//"INSERT INTO table (ID,Name,Age,Something) VALUES ('9','John','12','true');"
//example for the blacklist check
query = "INSERT INTO table (:columns:) VALUES (:values:);";
//strings with malicious intent behind them
string[] columns2 = { "DROP table" };
string[] values2 = { "DELETE * FROM table" };
try
{
query = Program.FillColumnsIntoQuery(query, columns2, values2);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
//Output:
//"Someone is trying to do evil stuff!"
}
Console.ReadLine();
}
public static string FillColumnsAndValuesIntoInsertQuery(string query, string[] colums, string[] values)
{
//joining the string arrays with a comma character
string columnnames = string.Join(",", colums);
//adding values with single quotation marks around them to handle errors related to string values
string valuenames = "'" + string.Join("','", values) + "'"; ;
//we need to check every entry of the blacklist against the provided strings
foreach(string blacklist in QUERY_BLACKLIST)
{
if(columnnames.ToLower().IndexOf(blacklist.ToLower()) >= 0
|| valuenames.ToLower().IndexOf(blacklist.ToLower()) >=0)
{
throw new Exception("Someone is trying to do evil stuff!");
}
}
//replacing the markers with the desired column names and values
return query.Replace(":columns:",columnnames).Replace(":values:", valuenames);
}
}
如果你想要花哨,可以为字符串类编写扩展方法。你也可以传递标记。您可以编写为您构建查询模板的函数。您可以为该功能选择较短的名称。
可能性无穷无尽: - )。