小弟现有一个从别的部门导出的文本文件(CSV),有1.2GB ,需要把它导入到SQLSERVER中(别人从ORACLE中导出),直接使用SQL的导入工具将直接死机(2GB)内存。
听别人说需要编一个程序,采用读入数据块的方法才能导入数据块。具体怎么实现呢?请各位大哥帮忙。

解决方案 »

  1.   

    如果是用VS2005的话,可以考虑用SqlBulkCopy类来实现,比直接操作数据库要快
      

  2.   

    CSV就是逗号分割的文本文件,直接读即可
      

  3.   

    这是一个大文件存入数据库的问题,不能一次性的加入文件流并存入数据库,这样作的话,会占用大量的内存,可以参照控制BLOB的作法,这种方法,无论是1.1还是2.0都是可行的,上面说的SQLBulkCopy类在这里是不合适的,那个类只是用于数据库之间的转移,对于一个大文件存入数据库的最张解决方案就是“利用文件流进行分段控制”,具体作法就是:第一次先文件的一小部份,并将其插入数据库,然后再读一小部份,对刚才插入的那个字段进行更新(其实就是把新读的这个部份插入到第一次插入的那一小部份的后面),然后重复第二部。可以给你一个简单的代码:
                OpenFileDialog of = new OpenFileDialog();
                of.ShowDialog();
                string file = of.FileName;
                using (SqlConnection con = new SqlConnection("server=.;database=test2;uid=sa;pwd=sa"))
                {
                    con.Open();
                    byte[] ptr;
                    using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
                    {
                        byte[] buffer = new byte[1024];
                        int count = fs.Read(buffer, 0, 1024);
                        //insert some data ,in that the image field will not be null
                        using (SqlCommand cmd=con.CreateCommand ())
                        {
                            cmd.CommandText = "insert into blob (id,file2) values ('1',@file2)";
                            SqlParameter sfile= cmd.Parameters.Add("@file2",SqlDbType.Image );
                            sfile.Value = buffer;
                            cmd.ExecuteNonQuery();
                        }
                        using (SqlCommand cmd = con.CreateCommand())
                        {
                            cmd.CommandText = "select TEXTPTR(file2) from blob where id='1'";
                            ptr = (byte[])cmd.ExecuteScalar();
                        }
                        using (SqlCommand cmd = con.CreateCommand())
                        {
                            cmd.CommandText = "updatetext blob.file2 @ptr @offset null @data";
                            SqlParameter sptr = cmd.Parameters.Add("@ptr", SqlDbType.Binary, 16);
                            SqlParameter soffset = cmd.Parameters.Add("@offset", SqlDbType.Int);
                            SqlParameter sdata = cmd.Parameters.Add("@data", SqlDbType.Image );                        sptr.Value = ptr;
                            soffset.Value = 0;                        
                            int index = 0;
                            while (true)
                            {
                                count = fs.Read(buffer, 0, 1024 );
                                if (count==0)
                                {
                                    break;
                                }
                                if (count<1024)
                                {
                                    int i = 0;
                                }
                                sdata.Value = buffer;
                                sdata.Size = count;
                                cmd.ExecuteNonQuery();
                                index += count;
                                soffset.Value = index;
                                
                            }
                        }
                    }
                }
      

  4.   

    直接用SQLServer的DTS导入不就可以了
      

  5.   

    A Fast CSV Reader
    By Sébastien Lorion 
    http://www.codeproject.com/cs/database/CsvReader.asp