C# DataTable 转换成JSON数据 三种方法

在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>、DataTable转换为Json格式。特别在使用Extjs框架的时候,Ajax异步请求的数据格式就是Json。鉴于此,我今天来分享将DataTable 转换成 Json的3种方法。换句话说如何在ASP.NET将一个DataTable序列化为 Json数组。或者如何从一个DataTable返回一个Json字符串。这篇文章将采用StringBuilder,JavaScriptSerializer和 Json.Net DLL (Newtonsoft) 这3种方法实现这一目标。
Json概述
JavaScript Object Notation (Json)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。这些特性使Json成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。Json采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等等。
这些特性使Json成为一种理想的数据交换语言。因此 基于AJAX应用程序,Json已经成为一种用于数据交换的流行格式。总之,Json是一种存储和交换数据的语法,易于操作,也是除XML之外的不二之选。
步骤:
首先我们从Microsoft SQL Server 获取数据到DataTable,也可以给DataTable动态添加行。代码如下:
private DataTable getData()
{
DataTable dt = new DataTable();
dt.Columns.Add("编号", typeof(Int32));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("性别", typeof(string));
dt.Columns.Add("学历", typeof(string));
dt.Rows.Add(1, "王超", "男", "本科");
dt.Rows.Add(2, "周丽", "女", "专科");
dt.Rows.Add(3, "李娟", "女", "专科");
dt.Rows.Add(4, "杨明", "男", "硕士");
dt.Rows.Add(5, "张德", "男", "本科");
return dt;
}
下面开始通过每一种方法实现DataTable转换成 Json 对象。
方法1:使用StringBuilder
这是Json样本数据的样子: {"姓名 ":"张三", "年龄":"30"}。Json里用花括号保存对象,它可以包含多个名称/值对。所以使用StringBuilder我们可以创建一个类似的Json字符串。
由于要使用StringBuilder类,我们首先需要导入System.Text命名空间,如下:
using System.Text;
下面的代码将生成一个Json字符串,遍历DataTable的行和列,获取数据,添加到一个StringBuilder对象 JsonString,然后返回这个对象。
public string DataTableToJson(DataTable table)
{
var JsonString = new StringBuilder();
if (table.Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < table.Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < table.Columns.Count; j++)
{
if (j < table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
}
else if (j == table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
}
}
if (i == table.Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
}
return JsonString.ToString(); 
}
方法2:使用 JavaScriptSerializer.
首先我们添加System.Web.Script.Serialization命名空间,如下:
using System.Web.Script.Serialization;
JavaScriptSerializer这个类是由异步通信层内部使用来序列化和反序列化数据。如果序列化一个对象,就使用序列化方法。反序列化Json字符串,使用Deserialize或DeserializeObject方法。在这里,我们使用序列化方法得到Json格式的数据。代码以下:
public string DataTableToJsonWithJavaScriptSerializer(DataTable table)
JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); 
List < Dictionary < string, object >> parentRow = new List < Dictionary < string, object >> (); 
Dictionary < string, object > childRow; 
foreach(DataRow row in table.Rows)
childRow = new Dictionary < string, object > (); 
foreach(DataColumn col in table.Columns)
childRow.Add(col.ColumnName, row[col]); 
parentRow.Add(childRow); 
return jsSerializer.Serialize(parentRow); 
}
方法3:使用Json.Net DLL (Newtonsoft)。
这个方法中要添加Json.Net DLL引用,我们可以从Newtonsoft下载Json.Net DLL,再导入命名空间,代码如下:
using Newtonsoft.Json;
public string DataTableToJsonWithJsonNet(DataTable table)
string JsonString=string.Empty; 
JsonString = JsonConvert.SerializeObject(table); 
return JsonString; 
}
StringBuilder方法的全部代码:
using System;
using Susing System.Data;
public partial class Default2 : System.Web.UI.Page
private string sasss;
protected void Page_Load(object sender, EventArgs e)
{
DataTable table = getData();
sasss = DataTableToJson(table);
Response.Write(sasss + "<br/>");
}
public string DataTableToJson(DataTable table)
{
var JsonString = new StringBuilder();
if (table.Rows.Count > 0)
{
JsonString.Append("[");
for (int i = 0; i < table.Rows.Count; i++)
{
JsonString.Append("{");
for (int j = 0; j < table.Columns.Count; j++)
{
if (j < table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\",");
}
else if (j == table.Columns.Count - 1)
{
JsonString.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":" + "\"" + table.Rows[i][j].ToString() + "\"");
}
}
if (i == table.Rows.Count - 1)
{
JsonString.Append("}");
}
else
{
JsonString.Append("},");
}
}
JsonString.Append("]");
}
return JsonString.ToString(); 
}
private DataTable getData()
{
DataTable dt = new DataTable();
dt.Columns.Add("编号", typeof(Int32));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("性别", typeof(string));
dt.Columns.Add("学历", typeof(string));
dt.Rows.Add(1, "王超", "男", "本科");
dt.Rows.Add(2, "周丽", "女", "专科");
dt.Rows.Add(3, "李娟", "女", "专科");
dt.Rows.Add(4, "杨明", "男", "硕士");
dt.Rows.Add(5, "张德", "男", "本科");
return dt;
}
}

posted @ 2020-05-15 10:49 青蛙學堂 阅读(18) | 评论 (0)编辑 收藏

C# DataTable 转换成JSON数据

引用名称空知间using System.Web.Script.Serialization;(如果无法引用,请道添加程序集)
JavaScriptSerializer js = new JavaScriptSerializer();
        //序列化成回json字符串
         string json= js.Serialize("数据库查询出答来的数据");
/// <summary>
        /// 将datatable转换为json  
        /// </summary>
        /// <param name="dtb">Dt</param>
        /// <returns>JSON字符串</returns>
        public static string Dtb2Json(DataTable dtb)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            System.Collections.ArrayList dic = new System.Collections.ArrayList();
            foreach (DataRow dr in dtb.Rows)
            {
                System.Collections.Generic.Dictionary<string, object> drow = new System.Collections.Generic.Dictionary<string, object>();
                foreach (DataColumn dc in dtb.Columns)
                {
                    drow.Add(dc.ColumnName, dr[dc.ColumnName]);
                }
                dic.Add(drow);
            }
            //序列化  
            return jss.Serialize(dic);
        }

posted @ 2020-05-15 10:34 青蛙學堂 阅读(8) | 评论 (0)编辑 收藏

StringBuilder和string 线程安全

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
StringBuffer
  StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
 
StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
1、线程安全:
指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行程序时出现e799bee5baa6e997aee7ad94e78988e69d8331333431353936意外结果。
2、线程不安全:
是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
举例说明:假设售票系统有1000张票,A和B同时来买票,如果是线程不安全,那么可能售票系统可能出现1000-1去同时执行的情况,最终结果是A和B都买完后剩下999张票,而不是998张。

posted @ 2020-05-15 10:27 青蛙學堂 阅读(7) | 评论 (0)编辑 收藏

JSON的简介


一、什么是JSON?

JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。

JSON就是一串字符串 只不过元素会使用特定的符号标注。

{} 双括号表示对象

[] 中括号表示数组

"" 双引号内是属性或值

: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象

而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组

当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象

二、JSON解析之传统的JSON解析

1、生成json字符串

public static String createJsonString(String key, Object value) {         JSONObject jsonObject = new JSONObject();         jsonObject.put(key, value);         return jsonObject.toString(); }


一、JSONObject和JSONArray的数据表示形式

  JSONObject的数据是用 {  } 来表示的,

        例如:   { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : null  }  

  而JSONArray,顾名思义是由JSONObject构成的数组,用  [ { } , { } , ......  , { } ]  来表示

       例如:   [ {  "id" : "123", "courseID" : "huangt-test", "title" : "提交作业" }  ,  {  "content" : null, "beginTime" : 1398873600000  "endTime" } ] ; 

        表示了包含2个JSONObject的JSONArray。

  可以看到一个很明显的区别,一个用的是 {  }  ,一个最外面用的是 [  ]  ;

 

二、如何从字符串String获得JSONObject对象和JSONArray对象

        JSONObject  jsonObject  = new JSONObject (String  str);

        JSONArray jsonArray = new JSONArray(String str  ) ;

 

三、如何从JSONArray中获得JSONObject对象

       大家可以把JSONArray当成一般的数组来对待,只是获取的数据内数据的方法不一样

       JSONObject   jsonObject = (JSONObject)jsonArray.get(i);

        JSONObject   jsonObject  =  jsonArray.getJSONObject(i) ;  

     两者都可。第一种注意转换 

 

四、获取JSON内的数据

       int   jid= jsonObject.getInt ( "id" ) ;    //  这里的jid得到的数据就是123.

       String  jcourse=jsonObject.getString( " courseID") ;   // 这里的jcourse得到的数据就是huangt-test.

      Strirng jcourse = jsonObject.get("courseID").toString();

 

 五、一般地为键值对

       eg:{  name:"xm", value:"张三"}

       String jname = null;

       if(jsonObject.get("name").equals("xm")){

         jname=jsonObject.get("value").toString();

       }

 

 六:  JSON.parse( str )    --> 把字符串转为JSON对象

         JSON.stringify( obj ) -->把对象解析为字符串

 


JSONObject、JSONArray区别

 json,就是一个键对应一个值,超级简单的一对一关系。现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个数据还那么麻烦。其实,就跟if else语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找,一层层剥开,就清楚了。 举个例子说明,如下:

[{name1:{name2:{name3:'value1',name4:'value2'}}},{}]

  从外到里看,例子中就是一个数组,数组里面是两个json格式的字符串。这样分析思路就清晰多了。

     工作中需要取出name4的值,你们会怎么取呢?。最初我都想过字符串截取,那时还不了解JSONArray,现在知道了,取出来也就相当容易了。

     取出name4值过程步骤:1,将以上字符串转换为JSONArray对象;2,取出对象的第一项,JSONObject对象;3,取出name1的值JSONObject对象;4,取出name2的值JSONObject对象;5,取出name4的值value2。

    示例中json数组格式的字符串可以通过方法直接转换为JSONArray的格式:

  JSONArray.fromObject(String)

  1. JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//将结果转换成JSONArray对象的形式  
  2. JSONObject getJsonObj = getJsonArray.getJSONObject(0);//获取json数组中的第一项  
  3. String result=getJsonObj.getJSONObject("name1").getJSONObject("name2").getJSONObject("name4"); 

好了我们说说这两个对象。

1,JSONObject

  json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}

2,JSONArray

  json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的

  Json对象中添加的是键值对,JSONArray中添加的是Json对象

  1. JSONObject Json = new JSONObject();  
  2. JSONArray JsonArray = new JSONArray();  
  3.   
  4. Json.put("key", "value");//JSONObject对象中添加键值对  
  5. JsonArray.add(Json);//将JSONObject对象添加到Json数组中  

3,JSONObject与Map

    Map map和json都是键值对,不同的是map中键值对中间用等号分开,json中键值对中间用冒号分开。其实json就是一种特殊形式的map。

  1. Map<String,String> strmap=new JSONObject();  

    这里的需求是:request对象获取的map,想要返回json格式也不用白费力了。

posted @ 2020-05-14 16:20 青蛙學堂 阅读(38) | 评论 (0)编辑 收藏

用友U8 归纳采购退货结算三种情况

用友U8 归纳采购退货结算三种情况

对应版本: 8.52

问题现象: 客户经常处理退货结算的问题

问题原因: 应系统掌握各种情况

解决方案: 

结算前全额退货
即已录入采购入库单,但未进行采购结算,并且全额退货。
填制一张全额数量的红字采购入库单。
把这张红字采购入库单与原入库单进行结算,冲抵原入库单数据。

结算前部分退货
即已录入采购入库单但未进行采购结算,并且部分退货。
填制一张部分数量的红字采购入库单。
填制一张相对应的采购发票,其中发票上的数量=原入库单数量-红字入库单数量。
把这张红字入库单与原入库单、采购发票进行结算,冲抵原入库单数据。 

结算后退货
即已录入采购入库单、采购发票,并且已进行了采购结算。
填制一张红字采购入库单,再填制一张红字发票。
把这张退货单与红字发票进行结算,冲抵原入库单数据。
当收到供货单位开具的红字(负数)发票,可分以下情况进行结算:
货物未入库的红字发票结算:没有对应的入库单,采用【手工结算】,不选入库单,直接选择原兰字发票和红字发票进行结算。
货物已退货的红字发票结算:在取得供货单位的退货发票后,进行结算。如果退货单与退货发票一致,可以〖自动结算〗,否则采用〖手工结算〗。

posted @ 2020-05-13 13:35 青蛙學堂 阅读(15) | 评论 (0)编辑 收藏

Bootstraptable入门-合并存储格

@{
    ViewBag.Title = "Index2";
}
json文件:

{  
"total":25,  
    "rows":[
        {
        "id":1,
        "Name":"xiaoming1",
        "Mobile":"222",
"Note":"diyihang"
        },
        {
        "id":2,
        "Name":"xiaoming2",
        "Mobile":"3333",
"Note":"dier"
        },
{
        "id":3,
        "Name":"xiaoming2",
        "Mobile":"34444",
"Note":"didssssss"
        }
,
{
        "id":4,
        "Name":"xiaoming4",
        "Mobile":"6555544",
"Note":"did5555ss"
        }
    ]
}
<script src="~/Content/bootstrap/jquery-3.4.1.min.js"></script>
 <link rel="stylesheet" href="~/Content/bootstrap/css/bootstrap.min.css">
<script src="~/Content/bootstrap/js/bootstrap.min.js"></script>
 <link rel="stylesheet" href="~/Content/bootstraptable/bootstrap-table.css">
 
<script src="~/Content/bootstraptable/bootstrap-table.js"></script>
 
<script src="~/Content/bootstraptable/extensions/editable/bootstrap-table-editable.js"></script>
 <--汉化文件 -->
 <script src="~/Content/bootstraptable/locale/bootstrap-table-zh-CN.js"></script>
 
 <--table-->
<table id="table2"></table>
 <--grid-->
<table id="grid"></table>
 <--list-->
<table id="_list"></table>
<script type="text/javascript" >
     
    
    $('#table2').bootstrapTable({
        url: '/data1.json',
        columns: [{
            field: 'id',
            title: '序号'
        }, {
            field: 'name',
            title: '名称'
        }, {
            field: 'price',
            title: '价格'
        }, ]
    });
    
    //
   
    var $table;
    //初始化bootstrap-table的内容
   // function InitMainTable() {
        //记录页面bootstrap-table全局变量$table,方便应用
       // var queryUrl = '/TestUser/FindWithPager?rnd=' + Math.random()
        var queryUrl = '/data3.json';
              
      //  $table =
            $('#grid').bootstrapTable({
            url: queryUrl,                      //请求后台的URL(*)
            method: 'GET',                      //请求方式(*)
            //toolbar: '#toolbar',              //工具按钮用哪个容器
            striped: true,                      //是否显示行间隔色
            cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
            pagination: false,                   //是否显示分页(*)
            sortable: true,                     //是否启用排序
            sortOrder: "asc",                   //排序方式
            sidePagination: "server",           //分页方式:client客户端分页,server服务端分页(*)
            pageNumber: 1,                      //初始化加载第一页,默认第一页,并记录
            //rows
            pageSize: 2,                     //每页的记录行数(*)
            pageList: [10, 25, 50, 100],        //可供选择的每页的行数(*)
            search: false,                      //是否显示表格搜索
            strictSearch: true,
            showColumns: true,                  //是否显示所有的列(选择显示的列)
            showRefresh: true,                  //是否显示刷新按钮
            minimumCountColumns: 2,             //最少允许的列数
            clickToSelect: true,                //是否启用点击选中行
            //height: 500,                      //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
            uniqueId: "ID",                     //每一行的唯一标识,一般为主键列
            showToggle: true,                   //是否显示详细视图和列表视图的切换按钮
            cardView: false,                    //是否显示详细视图
            detailView: false,                  //是否显示父子表
            //得到查询的参数
            queryParams: function (params) {
                //这里的键的名字和控制器的变量名必须一致,这边改动,控制器也需要改成一样的
                var temp = {
                    rows: params.limit,                         //页面大小
                    page: (params.offset / params.limit) + 1,   //页码
                    sort: params.sort,      //排序列名  
                    sortOrder: params.order //排位命令(desc,asc) 
                };
                return temp;
            },
            columns: [
                {
                checkbox: true,
                visible: true                  //是否显示复选框  
                },
            {
                field: 'Name',
                title: '姓名',
                sortable: true
            }, {
                field: 'Mobile',
                title: '手机',
                sortable: true
            }, 
            {
                field: 'Note',
                title: '备注'
            },
            {
                field: 'id',
                title: '操作',
                width: 120,
                align: 'center',
                valign: 'middle',
                formatter: actionFormatter
            }, ],
            onLoadSuccess: function () {
            },
            onLoadError: function () {
                showTips("数据加载失败!");
            },
            onDblClickRow: function (row, $element) {
                var id = row.ID;
                EditViewById(id, 'view');
            },
        });
  //  };
    //
    function actionFormatter(value, row, index) {
        var id = value;
        var result = "";
        result += "<a href='javascript:;' class='btn btn-xs green' onclick=\"EditViewById('" + id + "', view='view')\" title='查看'><span class='glyphicon glyphicon-search'></span></a>";
        result += "<a href='javascript:;' class='btn btn-xs blue' onclick=\"EditViewById('" + id + "')\" title='编辑'><span class='glyphicon glyphicon-pencil'></span></a>";
        result += "<a href='javascript:;' class='btn btn-xs red' onclick=\"DeleteByIds('" + id + "')\" title='删除'><span class='glyphicon glyphicon-remove'></span></a>";
        return result;
    }
    /*
     
     queryParams : function (params) {
                    //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
                    var temp = $("#ffSearch").serializeJsonObject();
                    temp["rows"] = params.limit;                        //页面大小
                    temp["page"] = (params.offset / params.limit) + 1;  //页码
                    temp["sort"] = params.sort;                         //排序列名
                    temp["sortOrder"] = params.order;                   //排位命令(desc,asc) 
                    //特殊格式的条件处理
                    temp["WHC_Age"] = $("#WHC_Age").val() + "~" + $("#WHC_Age2").val();
                    temp["WHC_BirthDate"] = $("#WHC_BirthDate").val() + "~" + $("#WHC_BirthDate2").val();
                    return temp;
                },
    //连接字段格式化
            function linkFormatter(value, row, index) {                
                return "<a href='" + value + "' title='单击打开连接' target='_blank'>" + value + "</a>";
            }
            //Email字段格式化
            function emailFormatter(value, row, index) {
                return "<a href='mailto:" + value + "' title='单击打开连接'>" + value + "</a>";
            }
            //性别字段格式化
            function sexFormatter(value) {
                if (value == "女") { color = 'Red'; }
                else if (value == "男") { color = 'Green'; }
                else { color = 'Yellow'; }
    
                return '<div  style="color: ' + color + '">' + value + '</div>';
            }
     */
     window.onload = dosearch();
    ///加载抽检列表
    function dosearch() {
        //先销毁表格  
        $("#_list").bootstrapTable('destroy');
        //初始化表格,动态从服务器加载数据  
        $("#_list").bootstrapTable({
            method: "get",  //使用get请求到服务器获取数据  
            contentType: "application/x-www-form-urlencoded",//一种编码。好像在post请求的时候需要用到。这里用的get请求,注释掉这句话也能拿到数据
         //   url: "ReportControl.ashx", //获取数据的Servlet地址  
            url: "/data3.json",
            dataType: "json",
            dataField: "rows",//这是返回的json数组的key.默认好像是"rows".这里只有前后端约定好就行
            //height: tableHeight(),//高度调整
            //striped: true,  //表格显示条纹  
            pagination: false, //启动分页  
            pageNumber: 1, //当前第几页  
            pageSize: 300, //每页显示的记录数 
            pageList: [5, 10, 20, 30],//分页步进值
            clickToSelect: true,//是否启用点击选中行
            locale: 'zh-CN',//中文支持,
            paginationPreText: '<',//指定分页条中上一页按钮的图标或文字,这里是<  
            paginationNextText: '>',//指定分页条中下一页按钮的图标或文字,这里是> 
            search: false,  //是否启用查询  
            showColumns: false,  //显示下拉框勾选要显示的列  
            showRefresh: false,  //显示刷新按钮  
            sidePagination: "server", //表示服务端请求  
            //设置为undefined可以获取pageNumber,pageSize,searchText,sortName,sortOrder  
            //设置为limit可以获取limit, offset, search, sort, order  
            queryParamsType: '',//查询参数组织方式
            idField: "ID",//指定主键列  
            queryParams: function (params) {//自定义参数,这里的参数是传给后台的,我这是是分页用的  
                return {//这里的params是table提供的  
                    pagesize: params.pageSize,             //每页多少条数据
                    pageindex: params.pageNumber,       //请求第几页
            /*
                    budgetyear: escape($("#inBudgetYear").val()),
                    budgetmonth1: escape($("#inBudgetMonth1").val()),
                    budgetmonth2: escape($("#inBudgetMonth2").val()),
                    budgetcompany: escape($("#inBudgetCompany").val()),
                    departid: escape($("#h_newDepart").val()),
                    execdepart: $('#inResult1').is(':checked'),
                    companyin: $('#inResult2').is(':checked')
                    */
                };
            },
            //请求服务器时所传的参数
            onLoadSuccess: function () {  //加载成功时执行  
              //  layer.msg("加载成功");
                mergeTable("Name");
            },
            onLoadError: function () {  //加载失败时执行  
              //  layer.msg("加载数据失败", { time: 1500, icon: 2 });
            },
            columns: [
                {
                    checkbox: true
                }, {
                    title: '序号',//标题  可不加  
                    formatter: function (value, row, index) {
                        return index + 1;
                    }
                }, {
                    field: "id",
                    title: "ID",
                    visible: false, //是否显示
                },  {
                    field: "Name",
                    title: "名称",
                },  {
                    field: "Mobile",
                    title: "手机"
                }, {
                    field: "Note",
                    title: "备注"
                }
            ]
        });
    }
    
    /*
    //可以加多个
     $('#table').bootstrapTable('mergeCells', {
                index : 0,
                field : "pairs_all",
                rowspan : data.length
           });
 
    */
    function mergeTable(field) {
        $table = $("#_list");
        var obj = getObjFromTable($table, field);
        for (var item in obj) {
            
            $('#_list').bootstrapTable('mergeCells', {
                index: obj[item].index,
                field: field,
                colspan: 1,
                rowspan: obj[item].row
            });
        }
    }
    function getObjFromTable($table, field) {
        var obj = [];
        var maxV = $table.find("th").length;
        var columnIndex = 0;
        var filedVar;
        for (columnIndex = 0; columnIndex < maxV; columnIndex++) {
            filedVar = $table.find("th").eq(columnIndex).attr("data-field");
            if (filedVar == field) break;
        }
        var $trs = $table.find("tbody > tr");
        var $tr;
        var index = 0;
        var content = "";
        var row = 1;
        for (var i = 0; i < $trs.length; i++) {
            $tr = $trs.eq(i);
            var contentItem = $tr.find("td").eq(columnIndex).html();
            //exist
            if (contentItem.length > 0 && content == contentItem) {
                row++;
            } else {
                //save
                if (row > 1) {
                    obj.push({ "index": index, "row": row });
                }
                index = i;
                content = contentItem;
                row = 1;
            }
        }
        if (row > 1) obj.push({ "index": index, "row": row });
        return obj;
    }
    
</script>

posted @ 2020-05-08 15:56 青蛙學堂 阅读(26) | 评论 (0)编辑 收藏

Bootstraptable入门

     摘要: 一、什么是Bootstrap-table?  在业务系统开发中,对表格记录的查询、分页、排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用。Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询、分页、排序、复选框、设置显示列、Car...  阅读全文

posted @ 2020-05-08 11:21 青蛙學堂 阅读(11) | 评论 (0)编辑 收藏

交叉连接CROSS JOIN

如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;  举例,下列A、B、C 执行结果相同,但是效率不一样:  A:SELECT * FROM table1 CROSS JOIN table2  B:SELECT * FROM table1,table2   C:select * from table1 a inner join table2 b  A:select a.*,b.* from table1 a,table2 b where a.id=b.id  B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)  C:select * from table1 a inner join table2 b on a.id=b.id  一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。   因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。

posted @ 2020-04-28 17:08 青蛙學堂 阅读(11) | 评论 (0)编辑 收藏

PIVOT行转列

在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表:

WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL)
我们先插入一些模拟数据:

INSERT INTO WEEK_INCOME 
SELECT '星期一',1000
UNION ALL
SELECT '星期二',2000
UNION ALL
SELECT '星期三',3000
UNION ALL
SELECT '星期四',4000
UNION ALL
SELECT '星期五',5000
UNION ALL
SELECT '星期六',6000
UNION ALL
SELECT '星期日',7000
********************************************
 SELECT WEEK,INCOME FROM WEEK_INCOME
 SELECT  
SUM(CASE WEEK WHEN '星期一' THEN INCOME END) AS [星期一],
SUM(CASE WEEK WHEN '星期二' THEN INCOME END) AS [星期二],
SUM(CASE WEEK WHEN '星期三' THEN INCOME END) AS [星期三],
SUM(CASE WEEK WHEN '星期四' THEN INCOME END) AS [星期四],
SUM(CASE WEEK WHEN '星期五' THEN INCOME END) AS [星期五],
SUM(CASE WEEK WHEN '星期六' THEN INCOME END) AS [星期六],
SUM(CASE WEEK WHEN '星期日' THEN INCOME END) AS [星期日]
FROM WEEK_INCOME
 
 
SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]
FROM WEEK_INCOME
PIVOT
(
    SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])
)TBL33
 


posted @ 2020-04-24 17:07 青蛙學堂 阅读(13) | 评论 (0)编辑 收藏

存储过程中的临时表为什么以#开头?#是不是有特殊的含义

你要理解为什么要用临时表,其实临时表又称为过渡表。

临时表有两种类型:本地和全局。它们在名称zhidao、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

存储过程sql语句拼接:

注意引号数量
 SELECT @sql = @sql + ' and  发生日期 >='+''''+ @bgdate+ ''''+' and  发生日期 <='+''''+ @eddate +''''
  SELECT @sql = @sql + '  and 名称 like  '+'''%abc%'''+' '


 SELECT @sql = @sql + '     and  id= '+@id+   ''

posted @ 2020-04-18 14:31 青蛙學堂 阅读(19) | 评论 (0)编辑 收藏

仅列出标题
共37页: 1 2 3 4 5 6 7 8 9 Last 
<2020年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

收藏夹

青蛙学堂

最新评论

阅读排行榜

评论排行榜

60天内阅读排行