【数据库MSSQL2008】使用表值参数快速插入数据

    项目中需要将解析原始文件获得的10W左右的数据插入数据库,如果使用原始的sql语句“insert into”,无论是循环插入还是批量插入,不是效率慢就是系统内存消耗殆尽,无法满足需求。

    

    经网上查阅,发现mssql从2008起开始,数据库支持以表值参数的方式批量插入数据,使用该方式,一次性插入10W条数据也不过是3-5秒钟的事情,一切开始变得美好起来~


    使用表值参数批量插入数据的步骤和要点:

    1、数据源需要是DataTable形式,且字段顺序必须和相应的数据库的数据表的字段属性、顺序一致


    2、代码样例

    

    idbConn.Open();
    idbCmd.CommandText = "insert into " + tableName + " select * from @" + tableName;
    SqlParameter param = ((SqlCommand)(idbCmd)).Parameters.AddWithValue("@" + tableName, dt);
    param.SqlDbType = SqlDbType.Structured;    
    param.TypeName = paramTypeName;
    if (dt != null && dt.Rows.Count > 0)
    {
         idbCmd.ExecuteScalar();
    }
    ((SqlCommand)(idbCmd)).Parameters.RemoveAt("@" + tableName);
    idbConn.Close();

    3、样例中的@tableName是表值变量名,如果多个表示用表值参数方式插入的话,需要独立标识,否则会提示该表值变量已存在。

    4、因为项目中的数据库连接只有一个,而idbcmd是其成员变量。如果不在最后调用Parameters.Remove将表值参数移除,那么在下次调用的时候,会提示“结构化类型中的字段不足。Structured 类型必须至少包含一个字段”。猜测是因为下次调用的时候,仅有对应表值参数的DataTable,而之前已添加的表值数据却没有赋予相应的DataTable,那么在后续执行语句的时候,command轮询parameters发现参数不足,就会提示上述错误。

你可能感兴趣的:(mysql,快速插入数据)