string[] TemLine = File.ReadAllLines(TxtDirectoryPath + "\\" + name, Encoding.GetEncoding("GB2312"));//读出数据有1万4千多条左右
                    
                    foreach (string item in TemLine)
                    {
                        
                        try
                        {
                            string[] Item = item.Split('\t');
    //Item示例:邵小小 24,河南,未婚.
                            string[,] Values ={ 
                                                { "vName", Item[0] },
                                                {"vInfo",Item[1]}
                                              };
                            Add("UserInfo", Values);//执行数据插入操作
                        }
                        catch
                        {
                            ;
                        }
                    }
//----------------------------------------------------------------------
//向数据库插入内容
        /// <summary>
        /// 向数据库添加内容
        /// </summary>
        /// <param name="TableName">表名</param>
        /// <param name="ColumnsAndValues">由列名和值组成的二维数组</param>
        public void Add(string TableName, string[,] ColumnsAndValues)
        {
            string Columns = null;
            string Values = null;
            for (int i = 0; i < ColumnsAndValues.GetLength(0); i++)
            {
                Columns = Columns + ColumnsAndValues[i, 0] + ",";
                Values = "\"" + Values + ColumnsAndValues[i, 1] + "\",";
            }
            Columns = Columns.Substring(0, Columns.Length - 1);
            Values = Values.Substring(0, Values.Length - 1);
            string insertStr = "insert into " + TableName + "(" + Columns + ") values(" + Values + ")";
    //创建Connection对象
            OleDbConnection conn = CreateConnection();
            conn.Open();
            OleDbCommand cmd = new OleDbCommand(insertStr, conn);
            cmd.ExecuteNonQuery();
            cmd.Dispose();
            conn.Close();
            conn.Dispose();
        }关键代码如上,我在插入数据库时,用时3分多,请帮忙看一下代码出现了什么问题。

解决方案 »

  1.   

    Add里不断的打开/关闭 Connection,是影响性能的主要地方。你现在是for 循环
    {
       Open
       Insert
       Close
    }改造一下程序,把Open和Close拿到外面来。Open
    for 循环
    {
       Insert
    }
    Close
      

  2.   

    谢谢fangxinggood兄,现在快多了,用时2分8秒。不过感觉还是太慢了。除了数据查询时它有优势,我以为它甚至不如直接存文本。不知道有没有直接一次性将多条数据写进数据库的方法,而不是一次次的循环。
      

  3.   

    你现在有两次循环,可以减少一次。一次是读全部的行组成ColumnsAndValues,一次是循环这个二维数组插入。可以改为读一行查入一行。
      

  4.   

    string sql="";
    for 循环
    {
      sql += "插入的sql语句 "; 
    }Open
    Insert( sql);
    Close
      

  5.   

    查找出原因了:
    Values = "\"" + Values + ColumnsAndValues[i, 1] + "\",";
    应该改为
     Values =  Values + "'" + ColumnsAndValues[i, 1] + "',";
    在数据插入时,它一直异常中
    郁闷啊。这个try也另人挺郁闷的
    耗时13秒,写完了,虽然还是不是很能接受。
      

  6.   

    嗯  应该可以提高不少效率
    就用 readline(循环)->处理此行 得到 Columns  Values ->插入数据库中
    可以减少一次循环
      

  7.   


     string fileName = TxtDirectoryPath + "\\" + name;
     string insertStr = "insert into UserInfo (vName, vInfo) values ('{0}','{1}')";
     using (FileStream fs = new FileStream("", FileMode.Open))
     {
         using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding("GB2312")))
         {
             OleDbConnection conn = CreateConnection();
             OleDbCommand cmd = new OleDbCommand(conn);
             conn.Open();
             string line = null;
             while ((line = sr.ReadLine()) != null)
             {
                 string item = line.Split('\t');
                 cmd.CommandText = string.Format(insertStr, item[0], item[1]);
                 cmd.ExecuteNonQuery();
             }
             conn.Close();
             conn.Dispose();
         }
     }
      

  8.   

    using (FileStream fs = new FileStream("", FileMode.Open))写错了,应该是:using (FileStream fs = new FileStream(fileName, FileMode.Open))
      

  9.   

    改用了数据库事务,现在用时10S左右,不知道下面的代码有问题没有,麻烦对数据库事务精通的哥们看看        private void Add(string FileName)
            {
                DateTime d = DateTime.Now;
                csData cs = new csData();
                string insertStr = "insert into userInfo (vName,vInfo) values('{0}','{1}')";
                string[] Lines = File.ReadAllLines(FileName, Encoding.GetEncoding("GB2312"));
                OleDbConnection conn = cs.CreateConnection(csData.GetDataPath);
                conn.Open();
                OleDbTransaction transaction = null;
                
                OleDbCommand cmd = new OleDbCommand();
                transaction = conn.BeginTransaction();
                cmd.Transaction = transaction;
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                foreach (string line in Lines)
                {
                    string[] item = line.Split('\t');
                    cmd.CommandText = string.Format(insertStr, item[0], item[1]);
                    cmd.ExecuteNonQuery();
                }
                transaction.Commit();
                conn.Close();
                conn.Dispose();
                MessageBox.Show("己经导入所有的搜索结果,共用时" + (DateTime.Now - d));
            }
      

  10.   

    没看到 Rollback 加上Try,Catch吧。
      

  11.   

    问题相当大,
    连接时没有try, 
    执行时没有try, 
    插入出错时,事务就会一直挂在哪里。
    建议把db封装一下,这样要写多少 new dbcommand, connecton哪,又容易出错,又不好定位错误。