我想在sql server表中插入一个对象列表。但是,目前,每次插入记录行时都必须打开和关闭sql连接。
我只是想知道是否有一种方法可以一次插入记录列表中的所有对象?这是代码段。
public void InsertDataToDb()
{
string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
var records = GetRecords();
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd =
new SqlCommand(
"INSERT INTO TableName (param1, param2, param3) VALUES (@param1, @param2, @param3)");
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
foreach (var item in records)
{
cmd.Parameters.AddWithValue("@param1", item.param1);
cmd.Parameters.AddWithValue("@param2", item.param2);
cmd.Parameters.AddWithValue("@param3", item.param3);
conn.Open();
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
conn.Close();
}
}
}
答案 0 :(得分:12)
我对您的数据类型做出假设(根据实际DbType的含义,根据需要更改它们),但是这样的事情应该这样做:
public void InsertDataToDb()
{
string connectionString = ConfigurationManager.ConnectionStrings["connection"].
ConnectionString;
var records = GetRecords();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd =
new SqlCommand(
"INSERT INTO TableName (param1, param2, param3) " +
" VALUES (@param1, @param2, @param3)");
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.Parameters.Add("@param1", DbType.String);
cmd.Parameters.Add("@param2", DbType.String);
cmd.Parameters.Add("@param3", DbType.String);
foreach (var item in records)
{
cmd.Parameters[0].Value = item.param1;
cmd.Parameters[1].Value = item.param2;
cmd.Parameters[2].Value = item.param3;
cmd.ExecuteNonQuery();
}
conn.Close();
}
}
我还建议调用一个事务,以便所有100个插入都可以作为单个事务完成。
- 编辑 -
关于交易,这里是关于如何添加它:
conn.Open(); // already there -- to show you where to start the transaction
SqlTransaction trans = conn.BeginTransaction();
string sql = "INSERT INTO TableName (param1, param2, param3) " +
"VALUES (@param1, @param2, @param3)";
SqlCommand cmd = new SqlCommand(sql, conn, trans);
然后,在关闭连接之前(或在事务中的最后一个语句之后,可以包括选择,更新等):
trans.Commit();
答案 1 :(得分:6)
您可以使用Dapper
之类的ORM使用这个库你可以写这样的东西
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
conn.Execute(@"INSERT INTO TableName (param1, param2, param3)
VALUES (@param1, @param2, @param3)", records);
}
答案 2 :(得分:-1)
但如果你想更新你的,那么就这样做
public void InsertDataToDb()
{
string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
var records = GetRecords();
using (SqlConnection conn = new SqlConnection(connectionString))
{
StringBuilder nonQuery = new StringBuilder();
foreach(var item in records)
{
nonQuery.AppendFormat("INSERT INTO TableName (param1, param2, param3) VALUES ({0}, {1}, {2});",
item.param1,
item.param2,
item.param3);
}
SqlCommand cmd = new SqlCommand(nonQuery.ToString());
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
conn.Close();
}
}