大数据文件导入MySql处理方式

来源:互联网 发布:儿童英语配音软件 编辑:程序博客网 时间:2024/05/16 17:42

采用ADO.NET将数据文件导入到MySQL数据库中,如果数据文件大于200M,在进行导入过程中,很容易出现内存不足的问题,因此对数据文件需要考虑分批加载到二进制字段中,在MySQL中有个CONCAT函数,可以用于实现将字段中追加内容,代码如下:


  StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into observerdatatable(");
            strSql.Append("SID,SName,YDOY,ObFile,QuaAnaStatues");
            strSql.Append(") values (");
        
            strSql.Append("@SID,@SName,@YDOY,@ObFile,@QuaAnaStatues");
            strSql.Append(") ");


            MySqlParameter[] parameters = {
        new MySqlParameter("@SID", MySqlDbType.VarChar,50) ,            
                        new MySqlParameter("@SName", MySqlDbType.VarChar,20) ,            
                        new MySqlParameter("@YDOY", MySqlDbType.VarChar,5) ,            
                        new MySqlParameter("@ObFile", MySqlDbType.LongBlob) ,            
                      
                        new MySqlParameter("@QuaAnaStatues", MySqlDbType.Int32)             
              
            };




            parameters[0].Value = model.SID;
            parameters[1].Value = model.SName;
            parameters[2].Value = model.YDOY;
         
 
            System.IO.FileInfo Ofi = new System.IO.FileInfo(OFile);
            var Ostream = Ofi.OpenRead();


            long maxreadlenth = 20000000;
            long readlength = maxreadlenth < Ofi.Length ? maxreadlenth : Ofi.Length;
            byte[] Obuffer = new byte[readlength];
            Ostream.Read(Obuffer, 0, (int)readlength);
            parameters[3].Value = Obuffer; //开始先读取部分数据插入到字段中
            parameters[4].Value = model.QuaAnaStatues;
            DbHelperMySQL.ExecuteSqlNonQuery(strSql.ToString(), parameters);




            long rlenth = Ofi.Length - readlength; //剩余字节
            while (rlenth > 0) //依次从数据文件读取指定长度字节追加到字段中
            {
                if (rlenth > maxreadlenth)
                {
                    Ostream.Read(Obuffer, 0, (int)maxreadlenth);
                    model.ObFile = Obuffer;
                    AppendOFile(model);
                }
                else
                {
                    readlength = rlenth;
                    Obuffer = new byte[readlength];
                    Ostream.Read(Obuffer, 0, (int)readlength);
                    model.ObFile = Obuffer;
                    AppendOFile(model);


                    break;
                }
                rlenth = rlenth - maxreadlenth; //剩余字节
            }


            Ostream.Close();


 AppendOFile函数如下:

  public static void AppendOFile(SDCORS.DataBase.Model.observerdatatable model)

        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update observerdatatable set ");
              strSql.Append(" ObFile = CONCAT(ObFile, @ObFile)"); //采用CONCAT函数连接字段值和添加部分字段
            strSql.Append(" where SName=@SName and YDOY=@YDOY");
            MySqlParameter[] parameters = {
                                                new MySqlParameter("@ObFile", MySqlDbType.LongBlob) ,       
                        new MySqlParameter("@SName", MySqlDbType.VarChar,20) ,            
                        new MySqlParameter("@YDOY", MySqlDbType.VarChar,5)            
            };
            parameters[0].Value = model.ObFile;
            parameters[1].Value = model.SName;
            parameters[2].Value = model.YDOY;
            DbHelperMySQL.ExecuteSqlNonQuery(strSql.ToString(), parameters);
        }

0 0