将对象列表插入SQL Server表

cat*_*ple 8 c# sql sql-server

我想在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ham*_*one 12

我正在假设您的数据类型(根据实际的DbTypes,根据需要更改它们),但是这样的事情应该这样做:

    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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我还建议调用一个事务,以便所有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);
Run Code Online (Sandbox Code Playgroud)

然后,在关闭连接之前(或在事务中的最后一个语句之后,可以包括选择,更新等):

trans.Commit();
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 6

你可以使用像Dapper这样的ORM

有了这个库,你可以写这样的东西

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    conn.Execute(@"INSERT INTO TableName (param1, param2, param3) 
                   VALUES (@param1, @param2, @param3)", records);
}
Run Code Online (Sandbox Code Playgroud)