因为我不知道您是如何存储变量的,所以我将使用您的示例数据向您展示一个完整的、可能的实现List<Dictionary<String, Object>>()
:
添加您的示例数据:
var tableName = "Users";
var records = new List<Dictionary<String, Object>>();
var recordFields = new Dictionary<String, Object>();
recordFields.Add("id", 1);
recordFields.Add("name", "Alice");
recordFields.Add("country", "France");
records.Add(recordFields);
recordFields = new Dictionary<String, Object>();
recordFields.Add("id", 2);
recordFields.Add("name", "Bob");
recordFields.Add("country", "Austria");
records.Add(recordFields);
recordFields = new Dictionary<String, Object>();
recordFields.Add("id", 3);
recordFields.Add("name", "Carol");
recordFields.Add("country", "Germany");
records.Add(recordFields);
生成参数化的插入语句:
using (var con = new SqlConnection(Settings.Default.ConnectionString))
{
con.Open();
foreach (var record in records)
{
String insertSql = String.Format("INSERT INTO {0} ({1}) VALUES ({2});"
, tableName
, String.Join(",", record.Select(r => r.Key))
, String.Join(",", record.Select(r => "@" + r.Key)));
using (var insertCommand = new SqlCommand(insertSql, con))
{
foreach (var field in record)
{
var param = new SqlParameter("@" + field.Key, field.Value);
insertCommand.Parameters.Add(param);
}
insertCommand.ExecuteNonQuery();
}
}
}
请注意,这并没有真正经过测试(它可以编译并且看起来不错),但无论如何它应该对您有所帮助。
编辑:
@Oded:我认为问题在于丹尼尔不想运行插入,而是显示/输出/保存它们。所以使用SqlCommand参数是不行的,因为你看不到生成的SQL。
@Cylindric 没错
这是不可能的,而且是矛盾的,你不能使用String
with SqlParameters
。因此,如果您稍后运行这些插入,恐怕您对 Sql-Injection 持开放态度。我建议您在实际运行语句时使用上面的代码。