关于行业代码对应表的数据库设计及导入(4位行业代码)

2023-05-16

       最近使用asp.net+sqlserver+layui前端框架完成了一个小页面,其中有一个功能是需要将行业代码表导入倒数据库。看到这个行业代码表,刚开始还真是无从下手,经过查询找到一个页面是关于行业代码处理的(word导入mysql表格_从word得到表格数据插入数据库(6位行业代码)),但是感觉这样处理不是太好,不应该让用户去填充excel表格(增加用户的工作量)。

我的解决方案如下:

一、数据库设计

二、文件上传功能(3层架构)

1、web层

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>行业代码对应页面</title>

    <link rel="stylesheet" href="../layui/css/layui.css" />
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/2.2.0/jquery.js"></script>
    <script type="text/javascript" src="../layui/layui.js"></script>

</head>
<body>
    <div style="margin: 10px 10px 10px 10px">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" style="background: #108ee9; padding: 0 20px;" type="button" id="upload">导入行业代码 </button>
        </div>
    </div>
    <script type="text/javascript">

        //1.文件上传
        layui.use('upload', function () {

            var $ = layui.jquery
            , upload = layui.upload;//指定允许上传的文件类型
            var loadingIndex;; //添加loading,0-2三种方式

            upload.render({
                elem: '#upload'
                , url: '../handler/UploadCode.ashx' //改成您自己的上传接口,我采用的是一般处理程序
                , accept: 'file' //普通文件
              , before: function () {
                    loadingIndex = layer.load(1);
                }
                , done: function (res) {
                    console.log(res);
                    layer.close(loadingIndex);    //返回数据关闭loading	
                    //如果上传失败
                    if (res.code > 0) {
                        if (res.code == 1) {
                            return layer.alert('上传文件为空,请选择需要上传的excel文件.', {
                                skin: 'layui-layer-molv' //样式类名  自定义样式
                                , anim: 2 //动画类型
                                 , icon: 1   // icon
                            });
                        } else if (res.code == 2) {
                            return layer.alert('仅 .xlsx 或 .xls文件类型可以被导入.', {
                                skin: 'layui-layer-molv' //样式类名  自定义样式
                               , anim: 2 //动画类型
                                , icon: 1   // icon
                            }); 
                        } else if (res.code == 3) {
                            return layer.alert('数据源缺少必要的字段,请检查Excel数据源!', {
                                skin: 'layui-layer-molv' //样式类名  自定义样式
                              , anim: 2 //动画类型
                               , icon: 1   // icon
                            });
                        } else if (res.code == 4) {
                            return layer.alert('Excel文件中没有任何数据,请填充数据!', {
                                skin: 'layui-layer-molv' //样式类名  自定义样式
                              , anim: 2 //动画类型
                               , icon: 1   // icon
                            });
                        } else {
                            return layer.alert('导入失败,请检查网络是否正常.', {
                                skin: 'layui-layer-molv' //样式类名  自定义样式
                              , anim: 2 //动画类型
                               , icon: 1   // icon
                            });
                        }

                    } else if (res.code == 0) { 
                        layer.open({
                            type: 1
                             , title: "是否成功" //不显示标题栏   title : false/标题
                             , closeBtn: true
                             , area: '300px;'
                            , shade: 0.8
                            , id: 'LAY_layuipro' //设定一个id,防止重复弹出
                             , resize: false
                             , btn: ['确定']
                                , btnAlign: 'c'
                             , moveType: 1 //拖拽模式,0或者1
                             , content: "<div style='padding: 50px; line-height: 32px; background-color: #108ee9; color: #fff; font-weight: 300;'>导入总条数:" + res.data.total + "<br>插入条数:" + res.data.flaginsert + "<br>失败条数:" + res.data.flagfail + "</div>"
                          , success: function (layero) {
                              var btn = layero.find('.layui-layer-btn');     
                          }
                        });
                    }
                }
            });   
        });
    </script>
</body>
</html>

2、一般处理程序代码

<%@ WebHandler Language="C#" Class="UploadHYCode" %>

using System;
using System.Web;
using System.Data;
using System.Data.OleDb;
using BLL;
using System.Text;
using System.Collections.Generic;
using System.Reflection;
using System.IO;
using System.Text.RegularExpressions;

public class UploadHYCode : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        string Json;//声明一个json变量

        //HttpContext.Current.Request.Files.Count 文件个数
        if (HttpContext.Current.Request.Files.Count > 0)
        {
            string fileExtension = System.IO.Path.GetExtension(HttpContext.Current.Request.Files[0].FileName).ToLower();//文件类型
            if (fileExtension != ".xlsx" && fileExtension != ".xls")
            {
                //不是excel文件做出提示
                Json = "{\"code\": 2,\"msg\": \"\",\"data\": {\"src\": \"http://cdn.layui.com/123.jpg\"}}";
                context.Response.Write(Json);
            }
            else {

                //BLL层,添加工商资源信息
                BllBussiness bllResource = new BllBussiness();
                //得到客户端上传的文件
                HttpPostedFile file = HttpContext.Current.Request.Files[0];
                //服务器端要保存的路径
                string filePath = HttpContext.Current.Server.MapPath("~/excel/") + file.FileName;
                file.SaveAs(filePath);
                //1.读取Excel文件并填写到一个DataTable中
                DataTable dt = GetExcelData(filePath, fileExtension);
                //2.判断excel数据是否符合要求,并构建 传向数据库的数据表
                #region 判断excel数据是否符合要求,并构建 传向数据库的数据表
                //定义要求的字段数据
                string[] headfields = { "门类", "大类", "中类", "小类", "类别名称"};
                //判断dtAllMember中是否包含全部要求的字段
                for (int j = 0; j < headfields.Length; j++)
                {
                    //只要有一个字段不被包含,则提示"数据源缺少必要的字段",并退出循环和整个方法
                    if (!dt.Columns.Contains(headfields[j]))
                    {
                        Json = "{\"code\": 3,\"msg\": \"\",\"data\": {\"src\": \"http://cdn.layui.com/123.jpg\"}}";
                        context.Response.Write(Json);
                    }
                }
                //判断数据源中是否有数据
                if (dt.Rows.Count == 0)
                {
                    Json = "{\"code\": 4,\"msg\": \"\",\"data\": {\"src\": \"http://cdn.layui.com/123.jpg\"}}";
                    context.Response.Write(Json);
                }
                //手动创建的新数据表工商资源数据表
                DataTable dtAddResource = new DataTable("dt_AddResource"); //创建一个名为dt_AddResource的DataTalbe
                                                                           //为dt表内建立Column(表头),
                dtAddResource.Columns.Add(new DataColumn("id", typeof(System.Data.SqlTypes.SqlGuid)));
                dtAddResource.Columns.Add(new DataColumn("parent_id", typeof(System.Data.SqlTypes.SqlGuid)));
                dtAddResource.Columns.Add(new DataColumn("codename", typeof(string)));
                dtAddResource.Columns.Add(new DataColumn("categoryname", typeof(string)));
                dtAddResource.Columns.Add(new DataColumn("stime", typeof(DateTime)));
                dtAddResource.Columns.Add(new DataColumn("isuse", typeof(int)));

                int total = dt.Rows.Count;//总数据条数
                int flaginsert = 0;//插入的数据条数
                int flagfail = 0; //失败的数据条数
                System.Data.SqlTypes.SqlGuid menid=System.Guid.NewGuid();
                System.Data.SqlTypes.SqlGuid daid=System.Guid.NewGuid();
                System.Data.SqlTypes.SqlGuid zhongid=System.Guid.NewGuid();
                string menlei = "";
                //从上传的Excel转换为的datatable表中取出数据,取出需要的数据放入工商资源表
                for (int intRow = 0; intRow < dt.Rows.Count; intRow++)
                {
                    DataRow drAddResource = dtAddResource.NewRow();

                    if (!string.IsNullOrEmpty(dt.Rows[intRow]["门类"].ToString().Trim()))
                    {

                        drAddResource["id"] = menid = System.Guid.NewGuid();
                        //drAddResource["parent_id"]= "00000000-0000-0000-0000-000000000000";
                        drAddResource["codename"] = menlei = dt.Rows[intRow]["门类"].ToString();
                        //类别名称
                        drAddResource["categoryname"] = dt.Rows[intRow]["类别名称"].ToString();
                        //添加日期
                        drAddResource["stime"] = DateTime.Now;
                        //是否可用
                        drAddResource["isuse"] = 1;
                        dtAddResource.Rows.Add(drAddResource);  //将一整条数据写入表中
                    }
                    else if (!string.IsNullOrEmpty(dt.Rows[intRow]["大类"].ToString().Trim()))
                    {
                        //DataRow drAddResource = dtAddResource.NewRow();
                        drAddResource["id"] = daid = System.Guid.NewGuid();
                        drAddResource["parent_id"] = menid;
                        drAddResource["codename"] = dt.Rows[intRow]["大类"].ToString();
                        //类别名称
                        drAddResource["categoryname"] = dt.Rows[intRow]["类别名称"].ToString();
                        //添加日期
                        drAddResource["stime"] = DateTime.Now;
                        //是否可用
                        drAddResource["isuse"] = 1;
                        dtAddResource.Rows.Add(drAddResource);  //将一整条数据写入表中
                    }
                    else if (!string.IsNullOrEmpty(dt.Rows[intRow]["中类"].ToString().Trim()) && !string.IsNullOrEmpty(dt.Rows[intRow]["小类"].ToString().Trim()))
                    {
                        drAddResource["id"] = zhongid = System.Guid.NewGuid();
                        drAddResource["parent_id"] = daid;
                        drAddResource["codename"] = menlei + dt.Rows[intRow]["小类"].ToString();
                        //类别名称
                        drAddResource["categoryname"] = dt.Rows[intRow]["类别名称"].ToString();
                        //添加日期
                        drAddResource["stime"] = DateTime.Now;
                        //是否可用
                        drAddResource["isuse"] = 1;
                        dtAddResource.Rows.Add(drAddResource);  //将一整条数据写入表中
                    } else if (!string.IsNullOrEmpty(dt.Rows[intRow]["中类"].ToString().Trim()) && string.IsNullOrEmpty(dt.Rows[intRow]["小类"].ToString().Trim())) {
                             drAddResource["id"] = zhongid = System.Guid.NewGuid();
                        drAddResource["parent_id"] = daid;
                        drAddResource["codename"] = dt.Rows[intRow]["中类"].ToString();
                        //类别名称
                        drAddResource["categoryname"] = dt.Rows[intRow]["类别名称"].ToString();
                        //添加日期
                        drAddResource["stime"] = DateTime.Now;
                        //是否可用
                        drAddResource["isuse"] = 1;
                        dtAddResource.Rows.Add(drAddResource);  //将一整条数据写入表中
                    }
                    else {
                        drAddResource["id"] = System.Guid.NewGuid();
                        drAddResource["parent_id"] = zhongid;
                        drAddResource["codename"] = menlei + dt.Rows[intRow]["小类"].ToString();
                        //类别名称
                        drAddResource["categoryname"] = dt.Rows[intRow]["类别名称"].ToString();
                        //添加日期
                        drAddResource["stime"] = DateTime.Now;
                        //是否可用
                        drAddResource["isuse"] = 1;
                        dtAddResource.Rows.Add(drAddResource);  //将一整条数据写入表中
                    }
                }
                #endregion
                DataColumnCollection dcc = dtAddResource.Columns; //列数
                                                                  // flaginsert = dtAddResource.Rows.Count;
                bool i = bllResource.ImportHycode(dtAddResource,dcc);

                //3.将筛选过的数据表导入数据库
                if (i==true)
                {
                    flaginsert = dtAddResource.Rows.Count;
                    flagfail =dt.Rows.Count-flaginsert;
                    //返回结果
                    // Json = "{\"code\": 0,\"msg\": \"\",\"data\": {\"src\": \"http://cdn.layui.com/123.jpg\"}}";
                    Json = "{\"code\": 0,\"msg\": \"\",\"data\": {\"flaginsert\": "+flaginsert+",\"flagfail\": "+flagfail+",\"total\": "+total+"}}";
                    context.Response.Write(Json);
                }
                else {

                    //返回结果
                    Json = "{\"code\": 5,\"msg\": \"\",\"data\": {\"src\": \"http://cdn.layui.com/123.jpg\"}}";
                    context.Response.Write(Json);
                }

            }

        }
        else {
            //没有文件,请选择文件
            Json = "{\"code\": 1,\"msg\": \"\",\"data\": {\"src\": \"http://cdn.layui.com/123.jpg\"}}";
            context.Response.Write(Json);
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
    private DataTable GetExcelData(string filePath, string fileExtension)
    {
        //DataSet ds = new DataSet();
        //定义一个DataTable数据表
        DataTable dt = null;
        string connStr03 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0;"; ;
        string connStr07 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES'";
        string queryStr = "SELECT * FROM [Sheet1$]";
        OleDbConnection conn03 = new OleDbConnection(connStr03);
        OleDbConnection conn07 = new OleDbConnection(connStr07);
        if (fileExtension == ".xls")
        {
            OleDbDataAdapter myAdapter = new OleDbDataAdapter(queryStr, conn03);
            try
            {
                //把Excel数据填充给DataTable
                dt = new DataTable();
                myAdapter.Fill(dt);
                //返回数据表
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                myAdapter.Dispose();
                conn03.Close();
                conn03.Dispose();
                //删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }
        else if (fileExtension == ".xlsx")
        {
            OleDbDataAdapter myAdapter = new OleDbDataAdapter(queryStr, conn07);
            try
            {
                //把Excel数据填充给DataTable
                dt = new DataTable();
                myAdapter.Fill(dt);
                //返回数据表
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                myAdapter.Dispose();
                conn07.Close();
                conn07.Dispose();
                //删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }
        return dt;
    }

}

3、BLL业务逻辑层的方法

 #region 批量导入行业代码
 public bool ImportHycode(DataTable dt, DataColumnCollection dtColum)
 {
    return daoBussiness.ImportHycode(dt, dtColum);
  }
#endregion

4、DAL数据访问层代码

  #region 批量导入行业代码
        public bool ImportHycode(DataTable dt, DataColumnCollection dtColum)
        {
            //定义一个整型标记变量
            bool result;
            //调用sqlHelper的"批量导入datatable表"的方法
            result = sqlHelper.InsertTable(dt, "chiye_hangyecode", dtColum);
            //返回结果
            return result;
        }
#endregion

5、sqlhelper方法

 #region 批量导入DataTable
        /// <summary>批量导入DataTable
        /// 批量导入DataTable
        /// </summary>
        /// <param name="dt">DataTable数据表</param>
        /// <param name="tableName">表名</param>
        /// <param name="dtColum">数据列集合</param>
        /// <return>Boolean值:true成功,false失败</return>
        public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum)
        {
            using (TransactionScope scope1 = new TransactionScope(TransactionScopeOption.Required))
            {
                using (SqlBulkCopy sqlBC = new SqlBulkCopy(strConn1, SqlBulkCopyOptions.KeepIdentity))
                {
                    //一次批量的插入的数据量:sqlBC.BatchSize = 1000;
                    sqlBC.BatchSize = 1000;
                    //设置要批量写入的表
                    sqlBC.DestinationTableName = tableName;

                    for (int i = 0; i < dtColum.Count; i++)
                    {
                        sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
                    }
                    try
                    {
                        //批量写入
                        sqlBC.WriteToServer(dt);
                        scope1.Complete();
                        return true;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
        }
#endregion

至此整个行业代码数据库设计及导入就完成了,数据库数据如下:

欢迎各位高手一起探讨更好滴方法。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于行业代码对应表的数据库设计及导入(4位行业代码) 的相关文章

随机推荐

  • eclipse代码补全与快速导包失效处理

    eclipse其实是非常强大的 xff0c eclipse的自动补全没有VS那么好是因为eclipse的补全功能用的是默认设置 你只需要稍微修改一下就行了 最简单的修改方式是 xff1a Windows gt Preferences gt
  • 百度2014校园招聘研发工程师笔试题+答案

    一 xff0c 简答题 30分 1 xff0c 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f 10分 xff08
  • Android下打印调试堆栈方法

    http blog csdn net freshui article details 9456889 打印堆栈是调试的常用方法 xff0c 一般出现异常时 xff0c 我们可以在跑出异常时也将堆栈情况打印出来 xff0c 这样十分方便错误查
  • android抓取各种log的方法

    1 logcat xff08 四类log buffer是main xff0c radio xff0c system xff0c events xff09 adb wait for device logcat adb logcat v tim
  • archlinux下安装搜狗输入法

    一 安装 fcitx sudo pacman S fcitx fcitx qt5 fcitx configtool 二 安装 qt4 xff08 可以不用安装 xff09 AUR qt4 提供了 qt4 安装脚本 mkdir p Softw
  • 解决Unable to add window -- token android.os.BinderProxy is not valid; is your activity running?

    运行项目有时候在dialog这里一直报错 xff0c 按照日志在网上找解决方案 很多都跑到了底层去解决这问题 然而我不懂底层 xff0c 没办法 继续找咯 苍天明鉴 xff01 找到问题了 原因一般是展示dialog的时候用的是异步 xff
  • centos系统中php Curl 无法访问https ,更换ssl_version NSS为openssl

    在centos 6上面 curl模块的ssl 支持默认为NSS xff0c 涉及到的程序里有https xff0c 是需要双向认证的 xff0c 这时使用NSS会报错 所以需要更换为openssl 一 查看系统自带的curl的版本 root
  • python-求三角形的面积

    计算三角形的面积 法一 xff1a 计算三角形的面积 a 61 float input 39 输入三角形第一边长 xff1a 39 b 61 float input 39 输入三角形第二边长 39 c 61 float input 39 输
  • 如何把达梦8数据库安装在root用户下管理

    达梦数据库一般安装在dmdba用户下 xff0c 官方文档也是这么推荐的 那么有没有办法不创建dmdba用户 xff0c 直接安装在root下呢 xff1f 希望我不要把大家带偏 xff0c 只是本着研究学习的心态 xff0c 做个实验 结
  • The word 'localhost' is not correctly spelled 这个问题怎么解决

    有时工程中有下划线并提示 The word is not correctly spelled 此问题是MyEclipse校验单词拼写造成 xff0c 如果出在配置文件中 xff0c 一般会影响到程序的正常执行 解决方法 xff1a 在MyE
  • Seaship数据集+yolov5

    在SeaShip数据集上验证YoloV5 操作系统 xff1a ArchLinux 需要代理 1 conda安装配置 已经完成的小伙伴可以直接跳过 安装Anaconda yay安装 yay S anaconda 激活Anaconda环境 s
  • 对抗样本生成方法学习总结

    title 对抗样本生成方法 date 2023 03 21 15 08 46 tags pytorch 对抗样本 cover https s2 loli net 2023 03 20 TkeiAjqp3Jdg9tI png categor
  • 划词翻译简单实现

    环境 xff1a archlinux xff0c 其余linux系统类似 安装依赖 span class token function sudo span pacman S xsel span class token function su
  • 平凡的人生or开挂的人生——对知乎相关问题的回答

    知乎原题 xff1a 为什么有些人的人生和开了挂一样 xff1f https www zhihu com question 37106162 楼上说的都特别好 xff0c 我很想补充一点 我先抛出一个背景概念 我认为开挂人生 xff0c 本
  • ARM64启动过程分析

    文章目录 arm64启动过程分析arm64启动过程分析 xff08 一 xff09 boot protocolarm64启动过程分析 xff08 二 xff09 内核启动第一步arm64启动过程分析 xff08 三 xff09 创建启动阶段
  • Android Studio: Kotlin使用DataBinding异常

    异常 Error 7 30 Unresolved reference databinding E test Android Jetpack app src main java com mazaiting jetpack architectu
  • H5C3__元素垂直居中的方法

    在 CSS 中对元素进行水平居中是非常简单的 xff1a 如果它是一个行内元素 xff0c 就对它的父元素应用 text align center 如果它是一个块级元素 xff0c 就对它自身应用 margin auto 还有没有其他的方法
  • 2013年期中总结 2013年9月10日20:17:49

    题目中的时间 xff0c 我改了几次 xff0c 一直在想这半年来的经历 xff0c 我想我是成长着的吧 xff01 继上次总结 2012年年度总结 2013年2月25日21 49 44 xff0c 眨眼过去了半年 xff0c 细细想来这半
  • VMware安装Ubuntu20.04.5常见问题及解决方案

    文章目录 使用Xftp连接ubuntu系统ubuntu上安装指定版本nodejsubuntu设置连网ubuntu安装Java8ubuntu安装 deb格式软件ubuntu卸载 deb格式软件ubuntu中electron框架安装的缓存在如下
  • 关于行业代码对应表的数据库设计及导入(4位行业代码)

    最近使用asp net 43 sqlserver 43 layui前端框架完成了一个小页面 xff0c 其中有一个功能是需要将行业代码表导入倒数据库 看到这个行业代码表 xff0c 刚开始还真是无从下手 xff0c 经过查询找到一个页面是关