开发中的总结
1、正表达式中()括号中的匹配,可以在其它地方用\1来表示。比如<img[^>]*?src=(['""]?)[^""']+?\1[^>]*?/>,在该正则表达式中(['""]?)中的值和\1中的值是一样的。\2对应的是第二个();
一,js正则标志/g,/i,/m说明
1,/g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个
2,/i 表示匹配的时候不区分大小写
3,/m 表示多行匹配,什么是多行匹配呢?就是匹配换行符两端的潜在匹配。影响正则中的^$符号
2、asp.net 调用 ocx控件 ocx控件web
3、算法与程序设计。
4、oracle 提供了start with connect by 语法结构可以实现递归查询。start with conditon 给出的seed 数据的范围, connect by 后面给出了递归查询的条件,prior 关键字表示父数据,prior 条件表示子数据需要满足父数据的什么条件。
查找一个节点的所有直属子节点(所有后代)。select * from tb_menu m start with m.id=1 connect by m.parent=prior m.id;查找一个节点的所有直属父节点(祖宗)。
select * from tb_menu m start with m.id=38 connect by prior m.parent=m.id;sqlserver中,返回影响行数是:If @@RowCount<1
oracle中,返回影响行数是:If sql%rowcount<1
对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
mssql递归查询
with cte as
(select * from [Class]
where id = 5
union all
select c.* from [Class] c inner join cte d
on d.Id = c.ParentId
)
select * from cte;
SQLserver2008使用表达式递归查询
CREATE PROC sp_getTreeById(@TreeId int)
AS
BEGIN
WITH cteTree
AS (SELECT *
FROM TuziTree
WHERE Id = @TreeId --第一个查询作为递归的基点(锚点)
UNION ALL
SELECT TuziTree.* --第二个查询作为递归成员, 下属成员的结果为空时,此递归结束。
FROM
cteTree INNER JOIN TuziTree ON cteTree.Id = TuziTree.ParentId)
SELECT *
FROM cteTree
END
3 原理(摘自网上)
递归CTE最少包含两个查询(也被称为成员)。第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。第二个查询 被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。
递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。是指递归次数上限的方法是使用MAXRECURION。
--由父项递归下级
with cte(id,parentid,text)
as
(--父项
select id,parentid,text from treeview where parentid = 450
union all
--递归结果集中的下级
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.parentid = c.id
)
select id,parentid,text from cte
---------------------
--由子级递归父项
with cte(id,parentid,text)
as
(--下级父项
select id,parentid,text from treeview where id = 450
union all
--递归结果集中的父项
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.id = c.parentid
)
select id,parentid,text from cte
5.js获取url参数值
var reg =new RegExp("(^|&)"+ name +"=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r !=null) return unescape(r[2]); returnnull;
}
这样调用:
alert(GetQueryString("参数名2"));
alert(GetQueryString("参数名3"));
//加载列表 target.datagrid({ title: '套餐购买记录', fitColumns: true, //自适应列宽 singleSelect: true, loadMsg: '加载中....', rownumbers: true, singleSelect: true, nowrap: true, //设置为true,当数据长度超出列宽时将会自动截取。 fit: true, url: '?M=List', queryParams: { txtDm: $("#txtDm").val(), txtNo: $("#txtNo").val(), txtName: $("#txtName").val(), txtIS_REFUND: $("#txtIS_REFUND").val() }, toolbar: '#ToolBar', singleSelect: true,//是否单选 pagination: true,//分页控件 pageSize: 15,//每页显示的记录条数,默认为10 pageList: [15, 20, 30],//可以设置每页记录条数的列表 }); var p = target.datagrid('getPager'); $(p).pagination({ beforePageText: '第',//页数文本框前显示的汉字 afterPageText: '页 共 {pages} 页', displayMsg: '当前显示 {from} - {to} 条记录 共 {total} 条记录', onBeforeRefresh: function () { $(this).pagination('loading'); $(this).pagination('loaded'); } }); 后台数据结构: {"rows":[],"page":1,"row":10,"total":10,"isSuccess":true,"Message":"查询成功"}
自定义formatter: PackageManage.formatCZ格式化列 <th data-options="field:'dd',formatter: formatCZ" width="80" align="left">操作</th> field formatCZ: function (val, row, rowIndex) { return " <a href='javascript:;' onClick='PackageManage.Edit(" + JSON.stringify(row) + ");'>编辑</a> | <a href='javascript:;' onClick='PackageManage.EditStatus(" + JSON.stringify(row) + ");'>" + (row.ENABLE == 0 ? '启用' : '锁定') + "</a>"; } 二、列表添加修改弹出层: <div id="PackageEditRegion" class=" easyui-dialog" style="width: 800px;" closed="true" title="增加套餐"><form id="PackageEditForm">内容</form></div> var frm = $("#PackageEditForm");//form对象 var div = $("#PackageEditRegion");//增加编辑对象 var target = $('#PackageListRegion'); Add: function () { //清除表单历史绑定数据 frm.form("clear"); $("#txtNAME").removeAttr("readonly"); $("#spDM").html(""); frm.form("load", { txtENABLE: 0, txtMEASURE: 0, txtPERIOD: 12 }); //显示编辑信息窗口 EasyUISave(div, frm, "添加套餐") div.dialog('open'); }, Edit: function (row) { if (!row) { //判断是否选择一条记录 row = $('#PackageListRegion').datagrid('getSelected'); } if (!row) { $.messager.alert('提示', '请选择一条记录'); return false; } //将选择记录数据填入编辑表单 frm.form("load", { txtDm: row.DM, txtNAME: row.NAME, txtDEPOSIT: row.DEPOSIT, txtUNIT_PRICE: row.UNIT_PRICE, txtMEASURE: row.MEASURE, txtENABLE: row.ENABLE, txtDETAILS: row.DETAILS, txtPERIOD: row.PERIOD }); editor1.html(row.DETAILS); $("#spDM").html(row.DM); $("#txtNAME").attr("readonly", "true"); //显示编辑信息窗口 EasyUISave(div, frm, "修改套餐", "edit"); div.dialog('open'); }
8、c# dataset 和datareader TO Object方法
1 /// <summary> 2 /// DataReader转换为obj list 3 /// </summary> 4 /// <typeparam name="T">泛型</typeparam> 5 /// <param name="rdr">datareader</param> 6 /// <returns>返回泛型类型</returns> 7 public List<T> DataReaderToList<T>(IDataReader rdr) 8 { 9 List<T> list = new List<T>(); 10 List<string> readNames = new List<string>(); 11 for (int i = 0; i < rdr.FieldCount; i++) 12 { 13 readNames.Add(rdr.GetName(i)); 14 } 15 //定义一个临时变量 16 string tempName = string.Empty; 17 int index; 18 while (rdr.Read()) 19 { 20 T t = System.Activator.CreateInstance<T>(); 21 Type obj = t.GetType(); 22 PropertyInfo[] propertys = obj.GetProperties(); 23 //遍历该对象的所有属性 24 foreach (PropertyInfo pi in propertys) 25 { 26 tempName = pi.Name;//将属性名称赋值给临时变量 27 //检查DataTable是否包含此列(列名==对象的属性名) 28 if (readNames.Contains(tempName)) 29 { 30 index = readNames.IndexOf(tempName); 31 // 判断此属性是否有Setter 32 if (!pi.CanWrite) continue;//该属性不可写,直接跳出 33 //取值 34 object value = rdr.GetValue(index); 35 //如果非空,则赋给对象的属性 36 if (value != DBNull.Value) 37 pi.SetValue(t, value, null); 38 } 39 } 40 list.Add(t); 41 } 42 return list; 43 }
1 /// <summary> 2 /// 将DataTable转换成list 3 /// </summary> 4 /// <param name="dt"></param> 5 /// <returns></returns> 6 public static List<T> ConvertToList<T>(DataTable dt) where T : new() 7 { 8 // 定义集合 9 List<T> ts = new List<T>(); 10 // 获得此模型的类型 11 Type type = typeof(T); 12 //定义一个临时变量 13 string tempName = string.Empty; 14 try 15 { 16 //遍历DataTable中所有的数据行 17 foreach (DataRow dr in dt.Rows) 18 { 19 T t = new T(); 20 // 获得此模型的公共属性 21 PropertyInfo[] propertys = t.GetType().GetProperties(); 22 //遍历该对象的所有属性 23 foreach (PropertyInfo pi in propertys) 24 { 25 tempName = pi.Name;//将属性名称赋值给临时变量 26 //检查DataTable是否包含此列(列名==对象的属性名) 27 if (dt.Columns.Contains(tempName)) 28 { 29 // 判断此属性是否有Setter 30 if (!pi.CanWrite) continue;//该属性不可写,直接跳出 31 //取值 32 object value = dr[tempName]; 33 //如果非空,则赋给对象的属性 34 if (value != DBNull.Value) 35 pi.SetValue(t, value, null); 36 } 37 } 38 //对象添加到泛型集合中 39 ts.Add(t); 40 } 41 } 42 catch { } 43 return ts; 44 }
9、iframe设置
<iframe id="ifContent" src="PayDeposit.aspx" width="100%" frameborder="0" style="width: 100%; height: 100%;" scrolling="no"></iframe>
1 $.ajaxSetup({ 2 timeout: 20000, 3 }); 4 /*Member_common表示会员公共js*/ 5 /*验证码改变*/ 6 function refreshAuthCode() { 7 $("#img_click").attr("src", "/CommonHandles/Verification.aspx?" + Math.random()); 8 } 9 10 /*ajax通用类*/ 11 /*url=网址*/ 12 /*parmer=提交参数*/ 13 /*successCallBak=成功后返回函数*/ 14 /*type=提交方式*//*dataType=返回类型*/ 15 var AjaxHelper = function (url, parmer, successCallBak, errCallback, type, dataType) { 16 if (!url) 17 return; 18 if (!type) type = "post"; 19 if (!dataType) dataType = "json"; 20 if (type.toLowerCase() == "get") parmer += "&" + Math.random(); 21 type = type.toUpperCase(); 22 $.ajax({ 23 url: url, 24 type: type, 25 dataType: dataType, 26 data: parmer, 27 success: successCallBak, 28 error: function (XMLHttpRequest, textStatus, errorThrow) { 29 if (errCallback) errCallback(XMLHttpRequest, textStatus, errorThrow); 30 } 31 }); 32 } 33 var UploadHelper = function (option) { 34 var opt = { 35 submitId: "", 36 action: "", 37 data: {}, 38 bgcallback: null, 39 onSubmit: function (file, ext) { 40 if (!/^(jpg|bmp|png|gif)$/.test(ext)) { 41 stopLoading(); //关闭数据加载特效 42 alert("只能上传格式为(bmp、jpg、png、gif)格式的图片!"); 43 return false; 44 } 45 }, 46 onComplete: function (file, response) { 47 48 } 49 }; 50 if (!option) return; 51 if ((typeof (eval(opt.bgcallback)) != "function")) opt.bgcallback = function () { }; 52 option.onSubmit = !option.onSubmit || !(option.onSubmit instanceof Function) ? opt.onSubmit : option.onSubmi 53 opt = $.extend(opt, option); 54 if (!opt.submitId || !opt.action || !opt.onComplete) return; 55 new AjaxUpload(opt.submitId, { 56 action: opt.action, 57 data: opt.data, 58 onSubmit: function (file, ext) { 59 opt.onSubmit(file, ext); 60 opt.bgcallback(); 61 this.disable(); 62 }, 63 onComplete: function (file, response) { 64 response = JSON.parse(response); 65 if (!response) alert("上传失败!"); 66 if (response.Status != "1") { 67 alert(response.ErrMsg); 68 return false; 69 } 70 opt.onComplete(file, response); 71 this.enable(); 72 } 73 }); 74 }; 75 /** 76 * 替换字符串中的字段. 77 * @param {String} str 模版字符串 78 * @param {Object} o json data 79 * @param {RegExp} [regexp] 匹配字符串的正则表达式 80 */ 81 function substitute(str, o, regexp) { 82 if (o.length < 1) return ""; 83 return str.replace(regexp || /\\?\{([^{}]+)\}/g, function (match, name) { 84 return (o[name] === undefined || o[name] == null) ? '' : o[name]; 85 }); 86 } 87 /** 88 * 替换模板的数据. 89 */ 90 function ReplaceTemplet(templet, json) { 91 var html = ""; 92 if (!json || !templet) return html; 93 if (!json.length) { json = [json] } 94 for (var i = 0; i < json.length; i++) { 95 html += substitute(templet, json[i]); 96 } 97 return html; 98 } 99 /** 100 * 判断from表单是否有更改 101 oldFormValue=更改之前的值 102 formId=表单id 103 */ 104 function FormChanged(obj, oldFormValue) { 105 if (obj.length == 0) return false; 106 var newFrmValue = obj.serializeArray(); 107 if (JSON.stringify(oldFormValue) == JSON.stringify(newFrmValue)) return false; 108 return true 109 } 110 /** 111 * 将from表单通过serializeArray获取的值,转换成json 112 json=[{name:"",value=""}] 113 */ 114 function FrmArrToJson(frmarr) { 115 if (!frmarr || frmarr.length == 0) return []; 116 var json = {}; 117 for (var i = 0; i < frmarr.length; i++) { 118 json[frmarr[i].name] = frmarr[i].value; 119 }; 120 return json; 121 } 122 /** 123 * 给form表单赋值 124 */ 125 function returnFrm(frmarr) { 126 if (!frmarr || frmarr.length == 0) return; 127 var json = FrmArrToJson(frmarr); 128 for (var c in json) { 129 $("#" + c).val(json[c]); 130 } 131 } 132 /** 133 * 判断是不是json. 134 */ 135 var isJson = function (obj) { 136 var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; 137 return isjson; 138 } 139 ///<summary>获得字符串实际长度,中文2,英文1</summary> 140 ///<param name="str">要获得长度的字符串</param> 141 GetLength = function (str) { 142 var realLength = 0, len = str.length, charCode = -1; 143 for (var i = 0; i < len; i++) { 144 charCode = str.charCodeAt(i); 145 if (charCode >= 0 && charCode <= 128) realLength += 1; 146 else realLength += 2; 147 } 148 return realLength; 149 }; 150 //登陆成功后回调 151 function LoginCallback() { 152 if (IsLoginState == 'true') { 153 $('#wtbnt').show(); $('#spLogin').remove(); 154 //$(".Unlike_shop").show(); $("#like_shop").hide(); 155 } 156 } 157 IsLoginState = "false"; 158 //登陆后喜欢 159 function LoginLike(obj, e, type) { 160 if (IsLoginState != "true") { 161 $.showModal('/Templates/minilogin.html', { 162 title: '会员登录', onclose: function () { 163 if (IsLoginState == "true") { 164 $('#wtbnt').show(); $('#spLogin').remove(); 165 ShopInfo._initWebControl.like(obj, e, type); 166 } 167 } 168 }); 169 return false; 170 } 171 return IsLoginState == "true"; 172 } 173 174 175 Date.prototype.format = function (format) { 176 var o = 177 { 178 "M+": this.getMonth() + 1, //month 179 "d+": this.getDate(), //day 180 "h+": this.getHours(), //hour 181 "m+": this.getMinutes(), //minute 182 "s+": this.getSeconds(), //second 183 "q+": Math.floor((this.getMonth() + 3) / 3), //quarter 184 "S": this.getMilliseconds() //millisecond 185 } 186 if (/(y+)/.test(format)) 187 format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 188 for (var k in o) 189 if (new RegExp("(" + k + ")").test(format)) 190 format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); 191 return format; 192 }
System.Data.EntityException: The underlying provider failed on Open
客户端以管理员身份运行:netsh winsock reset命令,作用是重置 Winsock 目录。如果一台机器上的Winsock协议配置有问题的话将会导致网络连接等问题,就需要用netsh winsock reset命令来重置Winsock目录借以恢复网络。这个命令可以重新初始化网络环境,以解决由于软件冲突、病毒原因造成的参数错误问题。 netsh是一个能够通过命令行操作几乎所有网络相关设置的接口,比如设置IP,DNS,网卡,无线网络等,Winsock是系统内部目录,Winsock是Windows网络编程接口,winsock工作在应用层,它提供与底层传输协议无关的高层数据传输编程接口,reset是对Winsock的重置操作。当执行完winsock的命令重启计算机后,需要重新配置IP
浙公网安备 33010602011771号