下面是我正在编辑项目中的一段代码,一字未改。
运行时正常,逻辑应该没有问题。
我想请问:效率和事务方面要不要改进?虽然下面此种情况添加的记录不会太多,但如果添加记录达成千上万条,这种事务处理方法有没有问题?效率会不会太低?期待牛人的分析!#region 方法:public int ImportFromTxt(string _filename)。清空正则表达式语法表 W_REGEXSTD 记录,从文本文件解析数据并重新导入表中。
/// <summary>
/// 清空正则表达式语法表 W_REGEXSTD 记录,从文本文件解析数据并重新导入表中。
/// </summary>
/// <param name="_filename">文本文件名</param>
/// <returns>有效语法类别数 * 10000 + 有效记录数</returns>
public int ImportFromTxt(string _filename)
{
    //文本文件的格式已经其他类检测正确才可以实例运行本方法,文本基本格式如下:
    //###正则表达式语法说明###
    //语法类别:>=元字符
    //\b语法说明:>=单词
    //\n语法说明:>=换行    string str;//读取的行数据
    string linegroup = "";//类别
    int group = 0;//类别数
    int records = 0;//记录数
    StreamReader sr = new StreamReader(_filename, Encoding.Default); //using System.IO 、using System.Text;    W_DATA wd = new W_DATA();
    SqlConnection conn = wd.GetConn();
    using (conn)
    {
        SqlCommand cmd = new SqlCommand("Truncate table W_REGEXSTD", conn);
        cmd.CommandType = CommandType.Text;        conn.Open();
        SqlTransaction myTrans = conn.BeginTransaction();
        cmd.Transaction = myTrans;
        try
        {
            cmd.ExecuteNonQuery();
            cmd.CommandText = "pro_insert_REGEXSTD";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@admin_name", SqlDbType.NVarChar, 50);
            cmd.Parameters.Add("@admin_expression", SqlDbType.NVarChar, 50);
            cmd.Parameters.Add("@admin_directions", SqlDbType.NVarChar);            while ((str = sr.ReadLine()) != null)
            {
                if (str.Length < 7) continue;//无效行,重新读取
                if (str.Substring(0, 7) == "语法类别:>=")
                {
                    linegroup = str.Substring(7);
                    group++;
                }
                else if (str.IndexOf("语法说明:>=") >= 0)
                {
                    cmd.Parameters["@admin_name"].Value = linegroup;
                    cmd.Parameters["@admin_expression"].Value = str.Remove(str.IndexOf("语法说明:>="));
                    cmd.Parameters["@admin_directions"].Value = str.Substring(str.IndexOf("语法说明:>=") + 7);
                    cmd.ExecuteNonQuery();
                    records++;
                }
            }
            myTrans.Commit();
        }
        catch
        {
            myTrans.Rollback();
            throw new ApplicationException("文本文件导入正则表达式语法表失败!");
        }
        finally
        {
            sr.Close();
        }
    }
    return (group * 10000 + records);
}
#endregion

解决方案 »

  1.   

    上述代码简化一下:/// <summary>
    /// 清空正则表达式语法表 W_REGEXSTD 记录,从文本文件解析数据并重新导入表中。
    /// </summary>
    /// <param name="_filename">文本文件名</param>
    /// <returns>无</returns>
    public void ImportFromTxt(string _filename)
    {
        StreamReader sr = new StreamReader(_filename, Encoding.Default);
        W_DATA wd = new W_DATA();
        SqlConnection conn = wd.GetConn();
        using (conn)
        {
            SqlCommand cmd = new SqlCommand("Truncate table W_REGEXSTD", conn);
            cmd.CommandType = CommandType.Text;        conn.Open();
            SqlTransaction myTrans = conn.BeginTransaction();
            cmd.Transaction = myTrans;
            try
            {
                cmd.ExecuteNonQuery();
                cmd.CommandText = "pro_insert_REGEXSTD";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@admin_name", SqlDbType.NVarChar, 50);            while ((str = sr.ReadLine()) != null)
                {
                    cmd.Parameters["@admin_name"].Value = str;
                    cmd.ExecuteNonQuery();
                }
                myTrans.Commit();
            }
            catch
            {
                myTrans.Rollback();
                throw new ApplicationException("文本文件导入失败!");
            }
            finally
            {
                sr.Close();
            }
        }
        return;
    }
      

  2.   

    有一个思路,拷个结构一模一样的临时表,先导入临时表,然后把从临时表导入正式表的过程放入事务,这样得理行不行?不过,不知道 ASP.net 的 SqlTransaction 事务处理机制,如果也是采用类似临时表的操作,则主贴代码就没有什么好担心的了,无论多少记录都一样。
      

  3.   

    用最笨的方法也可以取100数据嘛  int i=0;  在while 里循环i++; 如果等于100了 就提交一个事物 顺便把i从新复制为0  或者不复制为0 用 i%100 这种做if条件 也行啊。  方法很多 的  慢慢学会思考
      

  4.   

    如果把100条数据都写在stringbuilder中,然后一起提交,之后再删除stringbuilder内容,是不是也很慢呢?
      

  5.   

    首先将事务放入using(SqlTransaction myTrans = conn.BeginTransaction()){}如果,你想批量插入的话,最好写入记事本,再分批插入,速度非常快。
      

  6.   

    很好的几种方式,可以参考:
    http://www.cnblogs.com/nankezhishi/archive/2009/08/15/bulkinsert.html