• 读取文本文件插入数据库


    做了一个读取加密文件经过解密后插入数据库的功能,如果在数据库中没有该ID号(唯一)的记录则执行插入操作,如果该数据库中存在该ID的记录好么执行更新操作。本次选择文件采用的是 FileUpload控件,但这个控件在浏览器中如果设置不好通过FileUpload1.FileName或FileUpload1.PostedFile.FileName得到的只是文件名而不是全路径,而StreamReader sr = new StreamReader(url, Encoding.GetEncoding("GBK"))这个的url需要读取的是全路径,当时为了解决FileUpload1.PostedFile.FileName得到路径的方法找了一段时间,后面找到了需要对浏览器进行设置,但我觉得这样的方法并不实在,因为你总不能让浏览你这网站的人都去这么设置一下浏览品,因此我使用了把选取的文件放复制到指定的文件夹去,然后能过StreamReader sr = new StreamReader(url, Encoding.GetEncoding("GBK"))取的时候url只要取固定的路径就可以,这样就不会报找不到相关路径的错了。下面代码是功能实现的代码。

    public partial class _Default : System.Web.UI.Page
        {
            string constr = "Data Source=198.98.98.101,20000;Initial Catalog=RparkingDB;Persist SecurityInfo=True;UserID=adminSHPD;Password=SHPDcadre;Min Pool Size=50;Max Pool Size=512;Load Balance Timeout=30";
            protected void Page_Load(object sender, EventArgs e)
            {

            }

            protected void bntInput_Click(object sender, EventArgs e)
            {
                deleteFile();//删指定文件夹的所有文件
                if (!FileUpload1.HasFile)//判断是否选择了文件
                {
                    Response.Write("<script>alert('请选择文件!');</script>");
                    return;
                }
                //限制选择的文件不得超过4M
                int length = FileUpload1.PostedFile.ContentLength;//字节长度4194304=4M
                if (length > 4194304)
                {
                    Response.Write("<script>alert('文件过大,不支持超过4M的文件!');</script>");
                    return;
                }
                //判断所选择的是不是bat或txt类型的
                FileInfo file = new FileInfo(FileUpload1.PostedFile.FileName);
                if (file.Extension != ".bat")
                {
                    Response.Write("<script>alert('文件类型不对!');</script>");
                    return;
                }
                //将选择的文件保存到指定文件夹中(防止使用 FileUpload1.FileName只能取到文件名而没法到到路径而报错
                string filePath = Server.MapPath(ResolveUrl("~/TxtFileStorage/"));
                string fileName = FileUpload1.FileName;
                HttpPostedFile File = FileUpload1.PostedFile;
                File.SaveAs(filePath + fileName);
                //获取文件的路径
                string url = filePath + fileName;
                //连接数据库
                SqlConnection conn = new SqlConnection(constr);
                StreamReader sr = new StreamReader(url, Encoding.GetEncoding("GBK"));
                try
                {
                    conn.Open();
                     string str = sr.ReadToEnd();
                    string value = DecryptDES(str, "Cadre159");
                    string[] array = value.Split(';');
                    for (int i = 0; i < array.Length; i++)
                    {
                        string[] array1 = array[i].Split(',');
                        string id = array1[0];
                        if (checkRepeat(id) == 0)
                        {
                            string addTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                            string sql = string.Format("insert into rp_sys_TradeRecordPDA select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}'",
                                                        array1[0], array1[1], array1[2], array1[3], "0", array1[4], array1[5], array1[6], array1[7], array1[8], array1[9], array1[10], array1[11], array1[12], array1[14], array1[13], addTime, "", array1[15]);//执行插入 
                            SqlCommand cmd = new SqlCommand(sql, conn);
                            cmd.ExecuteNonQuery();
                        }
                        else
                        {
                            string addTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                            string sql = string.Format("update rp_sys_TradeRecordPDA set Meter_Id= '{0}', Pay_Type = '{1}', Parking_Type = '{2}', Start_Time = '{3}', End_Time= '{4}', Parking_Time = '{5}', Fee='{6}',Card_Id='{7}',MomeyB='{8}', MomeyF='{9}',Car_No='{10}',Park_No='{11}',Pic='{12}',Insert_Time='{13}',IsGPRS_Upload='{14}', Add_Time='{15}' where TradeRecord_Id ='{16}'",
                                         array1[1], array1[2], array1[3], array1[4], array1[5], array1[6], array1[7], array1[8], array1[9], array1[10], array1[11], array1[12], array1[13], array1[14], array1[15], addTime, array1[0]);
                            SqlCommand cmd = new SqlCommand(sql, conn);
                            cmd.ExecuteNonQuery();
                        }
                    }

                    Response.Write("<script>alert('导入成功!');</script>");
                }
                catch
                {
                    Response.Write("<script>alert('文件内容格式不正确!');</script>");
                }
                finally
                {
                    if (conn != null)
                    {
                        conn.Close();
                        conn = null;
                    }
                    if(sr != null)
                    {
                        sr.Close();
                        sr = null;
                    }
                }
            }
            /// <summary>
            /// 判断数据库中是否存在该ID的记录,如果存在则返回1,否则返回0
            /// </summary>
            /// <param name="testId"></param>
            /// <returns></returns>
            private int checkRepeat(string id)
            {
                int count;
                string sql = "select 1 from rp_sys_TradeRecordPDA where TradeRecord_Id ='" + id + "'";
                using(SqlConnection conn = new SqlConnection(constr))
                {
                    conn.Open();
                    DataSet ds = new DataSet();
                    SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                    da.Fill(ds);
                    if (ds.Tables[0].Rows.Count > 0)
                        count = 1;
                    else
                        count = 0;
                }
                return count;
            }
            /// <summary>
            /// 删除指定文件夹中的所有文件
            /// </summary>
            private void deleteFile()
            {
                DirectoryInfo dir = new DirectoryInfo("WebTestInput/TxtFileStorage");
                foreach (FileInfo fi in dir.GetFiles())
                {
                    //if (fi.CreationTime > DateTime.Today)
                    //if (fi.CreationTime < Convert.ToDateTime("2014-07-28 15:53:00"))
                    fi.Delete();
                }
            }
            private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            /// <summary>
            /// DES解密字符串
            /// </summary>
            /// <param name="decryptString">待解密的字符串</param>
            /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同(Cadre159)</param>
            /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
            public static string DecryptDES(string decryptString, string decryptKey)
            {
                try
                {
                    byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
                    byte[] rgbIV = Keys;
                    byte[] inputByteArray = Convert.FromBase64String(decryptString);
                    DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                    MemoryStream mStream = new MemoryStream();
                    CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                    cStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cStream.FlushFinalBlock();
                    return Encoding.UTF8.GetString(mStream.ToArray());
                }
                catch
                {
                    return decryptString;
                }
            }

    需要注意的是这样的是:

      //将选择的文件保存到指定文件夹中(防止使用 FileUpload1.FileName只能取到文件名而没法到到路径而报错
                string filePath = Server.MapPath(ResolveUrl("~/TxtFileStorage/"));
                string fileName = FileUpload1.FileName;
                HttpPostedFile File = FileUpload1.PostedFile;
                File.SaveAs(filePath + fileName);
                //获取文件的路径
                string url = filePath + fileName;

    这里的路径如果服务器经过IIS发布其他客户端浏览也是会报错的,以下是我解决这个错误的另一种实现写法:

     public void FolderCreate(string Path)
        {
            // 判断目标目录是否存在如果不存在则新建之  
            if (!Directory.Exists(Path))
                Directory.CreateDirectory(Path);
        } 
        protected void bntInput_Click(object sender, EventArgs e)
        {
            if (!FileUpload1.HasFile)//判断是否选择了文件
            {
                Response.Write("<script>alert('请选择文件!');</script>");
                return;
            }
            //限制选择的文件不得超过4M
            int length = FileUpload1.PostedFile.ContentLength;//字节长度4194304=4M
            if (length > 4194304)
            {
                Response.Write("<script>alert('文件过大,不支持超过4M的文件!');</script>");
                return;
            }
            //判断所选择的是不是bat或txt类型的
            FileInfo file = new FileInfo(FileUpload1.PostedFile.FileName);
            if (file.Extension != ".bat")
            {
                Response.Write("<script>alert('文件类型不对!');</script>");
                return;
            }
            //将选择的文件保存到指定文件夹中(防止使用 FileUpload1.FileName只能取到文件名而没法到到路径而报错
            string filePath = "C:/TxtFileStorage/";
            FolderCreate(filePath);
            deleteFile();//删指定文件夹的所有文件
            //string filePath = Server.MapPath(ResolveUrl("~/TxtFileStorage/"));
            string fileName = FileUpload1.FileName;
            HttpPostedFile File = FileUpload1.PostedFile;
            File.SaveAs(filePath + fileName);
            //获取文件的路径
            string url = filePath + fileName;
            //连接数据库
            StreamReader sr = new StreamReader(url, Encoding.GetEncoding("GBK"));
            try
            {
                string str = sr.ReadToEnd();
                string value = DecryptDES(str, "Cadre159");
                string[] array = value.Split(';');
                for (int i = 0; i < array.Length; i++)
                {
                    string[] array1 = array[i].Split(',');
                    string id = array1[0];
                    if (checkRepeat(id) == 0)
                    {
                        string addTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                        string sql = string.Format("insert into rp_sys_TradeRecordPDA select '{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}'",
                                                    array1[0], array1[1], array1[2], array1[3], "0", array1[4], array1[5], array1[6], array1[7], array1[8], array1[9], array1[10], array1[11], array1[12], array1[14], array1[13], addTime, "", array1[15]);//执行插入 
                        RpSysTradeRecordManager.ExecuteCommand(sql);
                    }
                    else
                    {
                        string addTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        string sql = string.Format("update rp_sys_TradeRecordPDA set Meter_Id= '{0}', Pay_Type = '{1}', Parking_Type = '{2}', Start_Time = '{3}', End_Time= '{4}', Parking_Time = '{5}', Fee='{6}',Card_Id='{7}',MomeyB='{8}', MomeyF='{9}',Car_No='{10}',Park_No='{11}',Pic='{12}',Insert_Time='{13}',IsGPRS_Upload='{14}', Add_Time='{15}' where TradeRecord_Id ='{16}'",
                                     array1[1], array1[2], array1[3], array1[4], array1[5], array1[6], array1[7], array1[8], array1[9], array1[10], array1[11], array1[12], array1[13], array1[14], array1[15], addTime, array1[0]);
                        RpSysTradeRecordManager.ExecuteCommand(sql);
                    }
                }

                Response.Write("<script>alert('导入成功!');</script>");
            }
            catch
            {
                Response.Write("<script>alert('文件内容格式不正确!');</script>");
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                    sr = null;
                }
            }
        }
        /// <summary>
        /// 判断数据库中是否存在该ID的记录,如果存在则返回1,否则返回0
        /// </summary>
        /// <param name="testId"></param>
        /// <returns></returns>
        private int checkRepeat(string id)
        {
            int count;
            try
            {
                string sql = "select 1 from rp_sys_TradeRecordPDA where TradeRecord_Id ='" + id + "'";
                DataSet ds = RpSysTradeRecordManager.GetDataSet(sql);
                if (ds.Tables[0].Rows.Count > 0)
                    count = 1;
                else
                    count = 0;
                return count;
            }
            catch
            {
                return 0;
            }
        }
        /// <summary>
        /// 删除指定文件夹中的所有文件
        /// </summary>
        private void deleteFile()
        {
            DirectoryInfo dir = new DirectoryInfo("C:/TxtFileStorage");
            foreach (FileInfo fi in dir.GetFiles())
            {
                fi.Delete();
            }
        }
        private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
        /// <summary>
        /// DES解密字符串
        /// </summary>
        /// <param name="decryptString">待解密的字符串</param>
        /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同(Cadre159)</param>
        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
        public static string DecryptDES(string decryptString, string decryptKey)
        {
            try
            {
                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Convert.FromBase64String(decryptString);
                DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(mStream.ToArray());
            }
            catch
            {
                return decryptString;
            }
        }

    这样的话会在IIS发布的服务器C盘生成一个目录用于存放导入的文件,每次导入都存一个文件到该文件夹,那么多次导入后生成太多的文件垃圾文件,因些我在每次导入的时候就对该目录进行一个文件的清空

  • 相关阅读:
    ensp上防火墙上配置nat
    简单介绍oracle误删除表和表数据的恢复方法
    linux基本命令介绍(二)
    linux基本命令介绍(一)
    Vsan分布式文件系统逻辑架构损坏恢复过程
    iPhone手机硬件拆解介绍
    硬盘分区损坏导致SqlServer数据丢失怎么恢复
    安卓手机密码工作原理及破解方式
    EMC UNITY 400存储卷删除数据恢复案例
    服务器2块硬盘掉线的数据恢复过程分享
  • 原文地址:https://www.cnblogs.com/lichengcai/p/3875958.html
Copyright © 2020-2023  润新知