
高级网络安全技术员
博客3年未更新,今天终于想起密码了.. 我回来了.. i'll be back.
课程大概被分为三个章节 客户端安全培训 安全工具培训 服务端安全培训 部分PPT 详细课程表 FireBug代码调试工具使用:工具介绍 FireBug代码调试工具使用:DOM选项卡 FireBug代码调试工具使用:Js代码监控使用 FireBug代码调试工具使用:Js代码断点调试 FireBug代码调试工具使用:NetWork选项卡(抓包) FireFox渗透插件介绍及安装 Fiddler专业抓包工具介绍 Fiddler专业抓包工具Script使用 Fiddler专业抓包工具发送HTTP数据包 Fiddler专业抓包工具插件安装 深入了解HTTP协议系列第一章(HTTP与TCP/IP关系) 深入了解HTTP协议系列第二章(状态码与响应短语) 深入了解HTTP协议系列第三章(HTTP报头讲解1) 深入了解HTTP协议系列第四章(HTTP报头讲解2) 深入了解HTTP协议系列第五章(HTTP报头讲解3) 深入了解HTTP协议系列第六章(HTTP提交方法探讨GET,POST,HEAD,PUT,DELECT,OPTIONS) 深入了解HTTP协议系列第七章(HTTP代理1) 深入了解HTTP协议系列第八章(HTTP代理2) 深入了解HTTP协议系列第九章(Cookie1) 深入了解HTTP协议系列第十章(Cookie2) 深入了解HTTP协议系列第十一章(SSL隧道) 深入了解HTTP协议系列第十二章(IP转发与CDN) 深入了解HTTP协议系列第十三章(总结) Windwos安全设置:系统用户权限讲解 Windwos安全设置:组策略使用 Windwos安全设置:IIS与Mysql权限设置 Windwos安全设置:注册表权限分配 Linux安全设置:认识权限设置(775/777/665) Linux安全设置:帐号权限分配 Linux安全设置:FTP安全设置 Linux安全设置:SSH安全设置 Linux安全设置:关闭不必要的端口 Linux安全设置:端口扫描 Linux安全设置:防火墙ipdables Linux安全设置:安装配置IDS Linux安全设置:内核升级 PHP安全代码审计:什么是审计 PHP安全代码审计:代码跟踪工具介绍 PHP安全代码审计:全局变量讲解 PHP安全代码审计:本地包含与远程包含 PHP安全代码审计:上传漏洞 PHP安全代码审计:SQL注入1 PHP安全代码审计:SQL注入2 PHP安全代码审计:使用预编译预防SQL注入 PHP安全代码审计:XSS跨脚本攻击(反射/存储) PHP安全代码审计:外部变量覆盖 PHP安全代码审计:盘点DEDECMS出现的漏洞 初识Javascript与Xss 存储型XSSAnd反射性XSS 初体验XSS的魅力 深入代码了解XSS:UBB系列1(介绍) 深入代码了解XSS:UBB系列2(了解原理) 深入代码了解XSS:UBB系列3(事件驱动学习) 深入代码了解XSS:UBB系列4(标签构造1) 深入代码了解XSS:UBB系列5(标签构造2) 深入代码了解XSS:UBB系列6(漏洞修护) DOM-XSS挖掘 XSS半自动挖掘工具讲解 反射型XSS利用探讨 存储型XSS利用探讨 XSS平台开发第一章(为什么要使用平台?) XSS平台开发第二章(会员模块,帐号权限设计) XSS平台开发第三章(项目模块设计) XSS平台开发第四章(信息接口设计) XSS平台开发第五章(XSS利用模块设计) XSS平台开发第六章(其他模块设计) XSS平台利用第一章(动手编写模块实现CMS GetShell) XSS平台利用第二章(讨论怎么实现Session持久化) XSS平台利用第三章(针对SSO系统开发利用模块) XSS平台利用第四章(利用Ajax回传当前页面源代码) XSS平台利用第五章(利用Ajax回传当前页面基于Canvas截图) CSRF认识 CSRF对网站到底有多大危害 基于SNS爆发CSRF(微博收听) 基于SNS爆发CSRF(微博发送) 路由器的软肋(CSRF劫持DNS) 到底什么引发了CSRF 应对CSRF我们应该做什么
缩略图: 引文: 所谓UBB代码,是指论坛中的替代HTML代码的安全代码。ubb发帖编辑器 这种代码使用正则表达式来进行匹配,不同的论坛所使用的UBB代码很可能不同,不能一概而论。UBB代码的出现,使得论坛可以使用类似HTML的标签来增加文字的属性,同时又不用害怕HTML代码中所夹带的不良信息! UBB并没有明确的标准,网络上的UBB种类繁多,语法不一。 课程章节: UBB简单介绍 UBB之XSS挖掘[url] UBB之XSS挖掘[email] UBB之修复篇 UBB之XSS挖掘[img] 公开链接:http://pan.baidu.com/s/1hqxL9g4
更新至服务器后运行出错: System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800AC472 解决方法 注册excel 组件,运行命令:excel.exe /regserver
信息安全·WEB安全培训 - 做最靠谱的WEB安全培训网站 http://edu.itsec.pw/ ITSEC TEAM 2013公开课视频 包含XSS、CCNA 视频截图: 视频连接:http://pan.baidu.com/s/1dDuyxtn
http://www.webshu.net/jiaocheng/programme/ASPNET/200804/6499.html <% if request("infoid")<>"" then set rs=conn.execute("select * from nproduct where id="&request("infoid")) if not (rs.eof and rs.bof) then proname=rs("proname") content=rs("proinfo") end if rs.close set rs=nothing end if %> 最近由于工作需要,做了一些关于c#操作word文档方面的工作.主要是对word中表格的操作,以下是部分代码,关于操作不规则表格的. using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Configuration; using System.IO; using System.Reflection; using System.Runtime.InteropServices ; using System.Threading; public void MakeMyTable(DataTable DT,string strFilePath) { string strEnd = this.txtEnd.Text.Trim().ToString(); string strStart = this.txtStart.Text.Trim().ToString(); //生成文档分页中的起始和终止页 string strSign = "("+strStart + "-" + strEnd + ")"; //杀掉所有word进程以保证速度 //KillWordProcess(); object Nothing = System.Reflection.Missing.Value; object missing = System.Reflection.Missing.Value; object filename= strFilePath; Word.Application wordApp=new Word.ApplicationClass(); Word.Document wordDoc=wordApp.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref Nothing); try { //生成过程中屏蔽返回按扭,不允许中途停止 Button2.Enabled = false; #region 生成文档 //设置文档宽度 wordApp.Selection.PageSetup.LeftMargin = wordApp.CentimetersToPoints(float.Parse("2")); wordApp.ActiveWindow.ActivePane.HorizontalPercentScrolled = 11 ; wordApp.Selection.PageSetup.RightMargin = wordApp.CentimetersToPoints(float.Parse("2")); Object start = Type.Missing; Object end = Type.Missing; Object unit = Type.Missing; Object count = Type.Missing; wordDoc.Range(ref start, ref end).Delete(ref unit, ref count); object rng = Type.Missing; string strInfo = this.txtNameCh.Text.ToString()+"明细表"+strSign+"\r\n"; start = 0; end = 0; wordDoc.Range(ref start, ref end).InsertBefore(strInfo); wordDoc.Range(ref start, ref end).Font.Name = "Verdana"; wordDoc.Range(ref start, ref end).Font.Size = 20; wordDoc.Range(ref start, ref end).ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; start = 8; end = strInfo.Length; wordDoc.Range(ref start, ref end).InsertParagraphAfter();//插入回车 if(DT.Rows.Count>0) { //存在数据项 //添加一个表格 object missingValue = Type.Missing; object location = strInfo.Length; //注:若location超过已有字符的长度将会出错。一定要比"明细表"串多一个字符 Word.Range rng2 = wordDoc.Range(ref location, ref location); wordDoc.Tables.Add(rng2, 13, 6, ref missingValue, ref missingValue); wordDoc.Tables.Item(1).Rows.HeightRule = Word.WdRowHeightRule.wdRowHeightAtLeast; wordDoc.Tables.Item(1).Rows.Height = wordApp.CentimetersToPoints(float.Parse("0.8")); wordDoc.Tables.Item(1).Range.Font.Size = 10; wordDoc.Tables.Item(1).Range.Font.Name = "宋体"; wordDoc.Tables.Item(1).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; wordDoc.Tables.Item(1).Range.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; //设置表格样式 wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderLeft).LineStyle = Word.WdLineStyle.wdLineStyleSingle; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderLeft).LineWidth = Word.WdLineWidth.wdLineWidth050pt; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderLeft).Color = Word.WdColor.wdColorAutomatic; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderTop).LineStyle = Word.WdLineStyle.wdLineStyleSingle; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderTop).LineWidth = Word.WdLineWidth.wdLineWidth050pt; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderTop).Color = Word.WdColor.wdColorAutomatic; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderBottom).LineStyle = Word.WdLineStyle.wdLineStyleSingle; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderBottom).LineWidth = Word.WdLineWidth.wdLineWidth050pt; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderBottom).Color = Word.WdColor.wdColorAutomatic; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderHorizontal).LineStyle = Word.WdLineStyle.wdLineStyleSingle; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderHorizontal).LineWidth = Word.WdLineWidth.wdLineWidth050pt; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderHorizontal).Color = Word.WdColor.wdColorAutomatic; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderVertical).LineStyle = Word.WdLineStyle.wdLineStyleSingle; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderVertical).LineWidth = Word.WdLineWidth.wdLineWidth050pt; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderVertical).Color = Word.WdColor.wdColorAutomatic; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderRight).LineStyle = Word.WdLineStyle.wdLineStyleSingle; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderRight).LineWidth = Word.WdLineWidth.wdLineWidth050pt; wordDoc.Tables.Item(1).Borders.Item(Word.WdBorderType.wdBorderRight).Color = Word.WdColor.wdColorAutomatic; // wordDoc.Tables.Item(k).Borders.Item(Word.WdBorderType.wdBorderDiagonalDown).LineStyle = Word.WdLineStyle.wdLineStyleSingle; // wordDoc.Tables.Item(k).Borders.Item(Word.WdBorderType.wdBorderDiagonalDown).LineWidth = Word.WdLineWidth.wdLineWidth050pt; // wordDoc.Tables.Item(k).Borders.Item(Word.WdBorderType.wdBorderDiagonalDown).Color = Word.WdColor.wdColorAutomatic; //第一行显示 wordDoc.Tables.Item(1).Cell(1,2).Merge(wordDoc.Tables.Item(1).Cell(1,3)); wordDoc.Tables.Item(1).Cell(1,4).Merge(wordDoc.Tables.Item(1).Cell(1,5)); //第二行显示 wordDoc.Tables.Item(1).Cell(2,5).Merge(wordDoc.Tables.Item(1).Cell(2,6)); wordDoc.Tables.Item(1).Cell(1,4).Merge(wordDoc.Tables.Item(1).Cell(2,5)); #region 插入数据行 wordDoc.Tables.Item(1).Cell(1, 1).Range.Text = "cell11"; //wordDoc.Tables.Item(k).Cell(1, 2).Range.Text = DT.Rows[i]["cell11"].ToString(); ////****************** wordDoc.Tables.Item(1).Cell(1, 3).Range.Text = "cell13"; //wordDoc.Tables.Item(k).Cell(1, 4).Range.Text = DT.Rows[i]["cell13"].ToString(); ////****************** wordDoc.Tables.Item(1).Cell(2, 1).Range.Text = "cell21"; //wordDoc.Tables.Item(k).Cell(2, 2).Range.Text = DT.Rows[i]["cell21"].ToString(); ////****************** wordDoc.Tables.Item(1).Cell(2, 3).Range.Text = "cell23"; //wordDoc.Tables.Item(k).Cell(2, 4).Range.Text = DT.Rows[i]["cell23"].ToString(); #endregion #region 第三行显示 wordDoc.Tables.Item(1).Cell(3,2).Merge(wordDoc.Tables.Item(1).Cell(3,3)); wordDoc.Tables.Item(1).Cell(3,2).Merge(wordDoc.Tables.Item(1).Cell(3,3)); ////****************** wordDoc.Tables.Item(1).Cell(3, 1).Range.Text = "cell31"; ////****************** wordDoc.Tables.Item(1).Cell(3, 3).Range.Text = "cell33"; #endregion #region 第五行显示 wordDoc.Tables.Item(1).Cell(5,2).Merge(wordDoc.Tables.Item(1).Cell(5,3)); wordDoc.Tables.Item(1).Cell(5,2).Merge(wordDoc.Tables.Item(1).Cell(5,3)); wordDoc.Tables.Item(1).Cell(5,2).Merge(wordDoc.Tables.Item(1).Cell(5,3)); wordDoc.Tables.Item(1).Cell(5,2).Merge(wordDoc.Tables.Item(1).Cell(5,3)); #endregion #region 第四行显示 ////****************** wordDoc.Tables.Item(1).Cell(4, 1).Range.Text = "cell41"; ////****************** wordDoc.Tables.Item(1).Cell(4, 3).Range.Text = "cell43"; ////****************** wordDoc.Tables.Item(1).Cell(4, 5).Range.Text = "cell45"; #endregion #region 第六行显示 wordDoc.Tables.Item(1).Cell(6,2).Merge(wordDoc.Tables.Item(1).Cell(6,3)); wordDoc.Tables.Item(1).Cell(6,2).Merge(wordDoc.Tables.Item(1).Cell(6,3)); wordDoc.Tables.Item(1).Cell(6,2).Merge(wordDoc.Tables.Item(1).Cell(6,3)); wordDoc.Tables.Item(1).Cell(6,2).Merge(wordDoc.Tables.Item(1).Cell(6,3)); ////****************** wordDoc.Tables.Item(1).Cell(5, 1).Range.Text = "cell51"; wordDoc.Tables.Item(1).Cell(5, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; ////****************** wordDoc.Tables.Item(1).Cell(6, 1).Range.Text = "cdll61"; wordDoc.Tables.Item(1).Cell(6, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; #endregion #region 第七行显示 wordDoc.Tables.Item(1).Cell(7,2).Merge(wordDoc.Tables.Item(1).Cell(7,3)); wordDoc.Tables.Item(1).Cell(7,2).Merge(wordDoc.Tables.Item(1).Cell(7,3)); wordDoc.Tables.Item(1).Cell(7,2).Merge(wordDoc.Tables.Item(1).Cell(7,3)); wordDoc.Tables.Item(1).Cell(7,2).Merge(wordDoc.Tables.Item(1).Cell(7,3)); ////****************** wordDoc.Tables.Item(1).Cell(7, 1).Range.Text = "cell71"; wordDoc.Tables.Item(1).Cell(7, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; #endregion #region 第八行显示 wordDoc.Tables.Item(1).Cell(8,1).Merge(wordDoc.Tables.Item(1).Cell(8,2)); wordDoc.Tables.Item(1).Cell(8,2).Merge(wordDoc.Tables.Item(1).Cell(8,3)); wordDoc.Tables.Item(1).Cell(8,2).Merge(wordDoc.Tables.Item(1).Cell(8,3)); wordDoc.Tables.Item(1).Cell(8,2).Merge(wordDoc.Tables.Item(1).Cell(8,3)); #endregion #region 第九行显示 wordDoc.Tables.Item(1).Cell(9,1).Merge(wordDoc.Tables.Item(1).Cell(9,2)); wordDoc.Tables.Item(1).Cell(9,3).Merge(wordDoc.Tables.Item(1).Cell(9,4)); ////****************** wordDoc.Tables.Item(1).Cell(9, 1).Range.Text = "cell91"; //wordDoc.Tables.Item(k).Cell(9, 2).Range.Text = (DT.Rows[i]["cell91"].ToString()=="1"?"有":"无"); ////****************** wordDoc.Tables.Item(1).Cell(9, 3).Range.Text = "cell93"; #endregion #region 第十行显示 wordDoc.Tables.Item(1).Cell(10,1).Merge(wordDoc.Tables.Item(1).Cell(10,2)); wordDoc.Tables.Item(1).Cell(10,3).Merge(wordDoc.Tables.Item(1).Cell(10,4)); ////****************** wordDoc.Tables.Item(1).Cell(10, 1).Range.Text = "cell101"; ////****************** wordDoc.Tables.Item(1).Cell(10, 3).Range.Text = "cdll103"; //wordDoc.Tables.Item(k).Cell(10, 4).Range.Text = (DT.Rows[i]["Label"].ToString()=="1"?"有":"无"); #endregion #region 第十一行显示 wordDoc.Tables.Item(1).Cell(11,1).Merge(wordDoc.Tables.Item(1).Cell(11,2)); wordDoc.Tables.Item(1).Cell(11,3).Merge(wordDoc.Tables.Item(1).Cell(11,4)); ////****************** wordDoc.Tables.Item(1).Cell(11, 1).Range.Text = "cell111"; ////****************** wordDoc.Tables.Item(1).Cell(11, 3).Range.Text = "cell113"; #endregion #region 第十二行显示 wordDoc.Tables.Item(1).Cell(12,1).Merge(wordDoc.Tables.Item(1).Cell(12,2)); wordDoc.Tables.Item(1).Cell(12,3).Merge(wordDoc.Tables.Item(1).Cell(12,4)); ////****************** wordDoc.Tables.Item(1).Cell(12, 1).Range.Text = "cell121"; ////****************** wordDoc.Tables.Item(1).Cell(12, 3).Range.Text = "cell123"; #endregion #region 第十三行显示 wordDoc.Tables.Item(1).Cell(13,1).Merge(wordDoc.Tables.Item(1).Cell(13,2)); wordDoc.Tables.Item(1).Cell(13,3).Merge(wordDoc.Tables.Item(1).Cell(13,4)); ////****************** wordDoc.Tables.Item(1).Cell(13, 1).Range.Text = "cell131"; ////****************** wordDoc.Tables.Item(1).Cell(13, 3).Range.Text = "cell133"; #endregion wordDoc.Tables.Item(1).Select(); wordApp.Application.Selection.Cut(); //重新成声所有表 for(int i = 0; i<=DT.Rows.Count-1;i++) { wordApp.Application.Selection.Paste(); int k = i+1; #region 更新数据 #region 插入数据行 wordDoc.Tables.Item(k).Cell(1, 2).Range.Text = DT.Rows[i]["1"].ToString(); ////****************** wordDoc.Tables.Item(k).Cell(1, 4).Range.Text = DT.Rows[i]["2"].ToString(); ////****************** wordDoc.Tables.Item(k).Cell(2, 2).Range.Text = DT.Rows[i]["3"].ToString(); ////****************** wordDoc.Tables.Item(k).Cell(2, 4).Range.Text = DT.Rows[i]["4"].ToString(); #endregion #region 第三行显示 ////****************** wordDoc.Tables.Item(k).Cell(3, 2).Range.Text = DT.Rows[i]["5"].ToString(); ////****************** wordDoc.Tables.Item(k).Cell(3, 4).Range.Text = DT.Rows[i]["6"].ToString(); #endregion #region 第五行显示 ////****************** wordDoc.Tables.Item(k).Cell(5, 2).Range.Text = DT.Rows[i]["7"].ToString(); wordDoc.Tables.Item(k).Cell(5, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; #endregion #region 第四行显示 ////****************** wordDoc.Tables.Item(k).Cell(4, 2).Range.Text = DT.Rows[i]["8"].ToString(); ////****************** wordDoc.Tables.Item(k).Cell(4, 4).Range.Text = DT.Rows[i]["9"].ToString(); ////****************** wordDoc.Tables.Item(k).Cell(4, 6).Range.Text = DT.Rows[i]["0"].ToString(); #endregion #region 第六行显示 ////****************** wordDoc.Tables.Item(k).Cell(6, 2).Range.Text = DT.Rows[i]["11"].ToString(); wordDoc.Tables.Item(k).Cell(6, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; #endregion #region 第七行显示 ////****************** wordDoc.Tables.Item(k).Cell(7, 2).Range.Text = DT.Rows[i]["12"].ToString(); wordDoc.Tables.Item(k).Cell(7, 2).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; #endregion #region 第八行显示 ////****************** string strTechlevel = DT.Rows[i]["Level"].ToString(); string returnTechlevel = ""; switch(strTechlevel) { case "1": returnTechlevel = "Level1"; break; case "2": returnTechlevel = "Level2"; break; case "3": returnTechlevel = "Level3"; break; case "0": returnTechlevel = "Level4"; break; default: returnTechlevel = "Level5"; break; } wordDoc.Tables.Item(k).Cell(8, 2).Range.Text = returnTechlevel; #endregion #region 第九行显示 ////****************** wordDoc.Tables.Item(k).Cell(9, 2).Range.Text = (DT.Rows[i]["14"].ToString()=="1"?"有":"无"); ////****************** wordDoc.Tables.Item(k).Cell(9, 4).Range.Text = (DT.Rows[i]["15"].ToString()=="1"?"是":"否"); #endregion #region 第十行显示 ////****************** wordDoc.Tables.Item(k).Cell(10, 2).Range.Text = (DT.Rows[i]["16"].ToString()=="1"?"有":"无"); ////****************** wordDoc.Tables.Item(k).Cell(10, 4).Range.Text = (DT.Rows[i]["17"].ToString()=="1"?"有":"无"); #endregion #region 第十一行显示 ////****************** wordDoc.Tables.Item(k).Cell(11, 2).Range.Text = (DT.Rows[i]["18"].ToString()=="1"?"是":"否"); ////****************** wordDoc.Tables.Item(k).Cell(11, 4).Range.Text = (DT.Rows[i]["19"].ToString()=="1"?"是":"否"); #endregion #region 第十二行显示 ////****************** wordDoc.Tables.Item(k).Cell(12, 2).Range.Text = (DT.Rows[i]["20"].ToString()=="1"?"是":"否"); ////****************** wordDoc.Tables.Item(k).Cell(12, 4).Range.Text = (DT.Rows[i]["21"].ToString()=="1"?"是":"否"); #endregion #region 第十三行显示 wordDoc.Tables.Item(k).Cell(13, 2).Range.Text = (DT.Rows[i]["22"].ToString()=="1"?"是":"否"); ////****************** wordDoc.Tables.Item(k).Cell(13, 4).Range.Text = (DT.Rows[i]["23"].ToString()=="1"?"是":"否"); #endregion #endregion //插入分页 if(i!=DT.Rows.Count-1) { object mymissing = System.Reflection.Missing.Value; object myunit = Word.WdUnits.wdStory; wordApp.Selection.EndKey(ref myunit,ref mymissing); object pBreak= (int)Word.WdBreakType.wdPageBreak; wordApp.Selection.InsertBreak( ref pBreak ); } } wordDoc.SaveAs(ref filename, ref missing,ref missing, ref missing,ref missing,ref missing,ref missing,ref missing,ref missing,ref missing, ref missing); wordDoc.Close(ref Nothing, ref Nothing, ref Nothing); wordApp.Quit(ref Nothing, ref Nothing, ref Nothing); if ( wordDoc != null ) { System.Runtime.InteropServices.Marshal.ReleaseComObject(wordDoc); wordDoc = null; } if ( wordApp != null ) { System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp); wordApp = null; } GC.Collect(); //KillWordProcess(); string strUrl = "MakeWordFile.aspx?username="+Request.QueryString["username"].ToString(); utility.ShowPopMessage("文档生成完毕!",strUrl); } else { utility.ShowPopMessage("无任何数据!"); } #endregion } catch { wordDoc.Close(ref Nothing, ref Nothing, ref Nothing); wordApp.Quit(ref Nothing, ref Nothing, ref Nothing); if ( wordDoc != null ) { System.Runtime.InteropServices.Marshal.ReleaseComObject(wordDoc); wordDoc = null; } if ( wordApp != null ) { System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp); wordApp = null; } GC.Collect(); utility.ShowPopMessage("文档生成失败!"); } }
for (var j = adelete.Count-1; j >= 0; --j) { aAttachment.RemoveAt(Common.ccint(adelete[j])); }
(1) 先说jquery, 使用 jQuery 库的话,只需要同时绑定 oninput 和 onpropertychange 两个事件就可以了,示例代码: $('#username').bind('input propertychange', function() { $('#content').html($(this).val().length + ' characters'); }); (2) 对于JS原生写法而言, oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有用,在内容修改后立即被触发,不像 onchange 事件需要失去焦点才触发。oninput 事件在主流浏览器的兼容情况如下: 从上面表格可以看出,oninput 事件在 IE9 以下版本不支持,需要使用 IE 特有的 onpropertychange 事件替代,这个事件在用户界面改变或者使用脚本直接修改内容两种情况下都会触发,有以下几种情况: 修改了 input:checkbox 或者 input:radio 元素的选择中状态, checked 属性发生变化。 修改了 input:text 或者 textarea 元素的值,value 属性发生变化。 修改了 select 元素的选中项,selectedIndex 属性发生变化。 在监听到 onpropertychange 事件后,可以使用 event 的 propertyName 属性来获取发生变化的属性名称。 集合 oninput & onpropertychange 监听输入框内容变化的示例代码如下: <head> <script type="text/javascript"> // Firefox, Google Chrome, Opera, Safari, Internet Explorer from version 9 function OnInput (event) { alert ("The new content: " + event.target.value); } // Internet Explorer function OnPropChanged (event) { if (event.propertyName.toLowerCase () == "value") { alert ("The new content: " + event.srcElement.value); } } </script> </head> <body> Please modify the contents of the text field. <input type="text" oninput="OnInput (event)" onpropertychange="OnPropChanged (event)" value="Text field" /> </body> http://blog.163.com/lgh_2002/blog/static/44017526201341511112874/
Microsoft Office Excel 不能访问文件“a.xls”。 可能的原因有: ? 文件名称或路径不存在。 ? 文件正被其他程序使用。 ? 您正要保存的工作簿与当前打开的工作簿同名 This solution is ... ?Windows 2008 Server x64 Please make this folder. C:\Windows\SysWOW64\config\systemprofile\Desktop ?Windows 2008 Server x86 Please make this folder. C:\Windows\System32\config\systemprofile\Desktop ...instead of dcomcnfg.exe. This operation took away office automation problems in my system. A Desktop folder seems to be necessary in the systemprofile folder to open file by Excel. It disappears from Windows2008, Windows2003 had the folder, and I think it cause this error. 即在C:\Windows\System32\config\systemprofile和C:\Windows\SysWOW64\config\systemprofile目录下创建名为Desktop目录即可解决问题。 http://kxl361.blog.163.com/blog/static/342955320127502258419/
注:要添加COM组件 Microsoft Excel 11.0 Object Library 引用。 具体代码如下: using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; using Excel; using System.Reflection; using System.Data; using System.Data.OleDb; namespace RecruitmentReport { classdoExcel { enumColumnName {A1=1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1} /// <summary> /// 导出到Execl /// </summary> /// <param name="dt">数据集</param> /// <param name="strSheetName">工作部名称</param> /// <param name="pathloading">保存路径</param> /// <param name="title">标题名</param> publicvoid doExport(DataSet dt, string strSheetName, string pathloading, string title) { int columnIndex = dt.Tables[0].Columns.Count; string cName =((ColumnName)columnIndex).ToString(); Excel.Application excel = new Excel.Application(); //Execl的操作类 Excel.Workbook bookDest =(Excel.Workbook)excel.Workbooks.Add(Missing.Value); Excel.Worksheet sheetDest = bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value) as Excel.Worksheet;//给工作薄添加一个Sheet sheetDest.Name = strSheetName; for (int i = bookDest.Worksheets.Count; i >1; i--) { Worksheet wt = (Worksheet)bookDest.Worksheets[i]; if (wt.Name != strSheetName) { wt.Delete(); } } int rowIndex = 2; int colIndex = 0; Range rngRow = (Excel.Range)sheetDest.Columns[1, Type.Missing]; rngRow.UseStandardWidth = 70; Range rngA = (Range)sheetDest.Columns["A", Type.Missing];//设置单元格格式 rngA.NumberFormatLocal = "@";//字符型格式 Range rngJ = (Range)sheetDest.Columns["J", Type.Missing]; rngJ.NumberFormatLocal = "@"; Range rngQ = (Range)sheetDest.Columns["Q", Type.Missing]; rngQ.NumberFormatLocal = "@"; Range rngE = (Range)sheetDest.Columns["E", Type.Missing]; rngE.NumberFormatLocal = @"yyyy-mm-dd";//日期型格式 sheetDest.get_Range("A1", cName).Merge(sheetDest.get_Range("A1", cName).MergeCells);//合并单元格 excel.Application.Workbooks.Add(true); try { Range rngfirst = (Excel.Range)sheetDest.Cells[1, 1]; sheetDest.Cells[1, 1] = title + System.DateTime.Now.Month.ToString().PadLeft(2, '0') + System.DateTime.Now.Day.ToString().PadLeft(2, '0') + System.DateTime.Now.Year.ToString(); rngfirst.Font.Size = 14; rngfirst.Font.Name = "Calibri";//设置单元格字体 rngfirst.RowHeight = 18; rngfirst.HorizontalAlignment = XlHAlign.xlHAlignCenter; rngfirst.Font.Bold = true; rngfirst.Borders.LineStyle = XlLineStyle.xlContinuous;//设置单元格边框 foreach (DataColumn col in dt.Tables[0].Columns) { colIndex++; Range rng = (Excel.Range)sheetDest.Cells[2, colIndex]; sheetDest.Cells[2, colIndex] = col.ColumnName;//Execl中的第一列把DataTable的列名先导进去 rng.Font.Name = "Calibri"; rng.Font.Size = 11; rng.Font.Bold = true; rng.Font.Color = ConsoleColor.Blue; rng.HorizontalAlignment = XlHAlign.xlHAlignCenter; rng.RowHeight = 15; rng.Borders.LineStyle = XlLineStyle.xlContinuous; rng.ColumnWidth = 15.5; // sheetDest.Range[1, colIndex].Font.Bold = false; } //导入数据行 foreach (DataRow row in dt.Tables[0].Rows) { rowIndex++; colIndex = 0; foreach (DataColumn col in dt.Tables[0].Columns) { colIndex++; sheetDest.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString(); Range rng01 = (Excel.Range)sheetDest.Cells[rowIndex, colIndex]; rng01.HorizontalAlignment = XlHAlign.xlHAlignCenter; rng01.Borders.LineStyle = XlLineStyle.xlContinuous; rng01.RowHeight = 15; rng01.Font.Name = "Calibri"; rng01.Font.Size = 11; } } } catch { thrownewException(); } bookDest.Saved = true; bookDest.SaveCopyAs(pathloading);//保存 excel.Quit(); excel = null; GC.Collect();//垃圾回收 } } } http://hi.baidu.com/jimpanf/item/6773171847b46e14e2f98637
类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整。最近比较空闲,便自己动手尝试实现,在此分享下小小的成果。 首先需要如图所示的鼠标图标文件,在自己的硬盘中搜索*.cur,肯定能找到。 为了能在所有需要该效果的页面使用,并且不需要更改页面任何HTML,我把所有的代码整合在 $(document).ready(function() {}); 中,并写入一个独立的JS文件。 用一个1像素宽的DIV来模拟一条竖线,在页面载入后添加到body元素中 1 2 3 $(document).ready(function() { $("body").append("<div id=\"line\" style=\"width:1px;height:200px;border-left:1px solid #00000000; position:absolute;display:none\" ></div> "); }); 接下来是鼠标移动到表格纵向边框上鼠标变型的问题,起初我考虑在表头中添加一个很小的块级元素触发mousemove 和mouseout事件,但为了简单起见,我还是选择为整个表头添加该事件。 在TH的mousemove事件中处理鼠标变型: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $("th").bind("mousemove", function(event) { var th = $(this); //不给第一列和最后一列添加效果 if (th.prevAll().length <= 1 || th.nextAll().length < 1) { return; } var left = th.offset().left; //距离表头边框线左右4像素才触发效果 if (event.clientX - left < 4 || (th.width() - (event.clientX - left)) < 4) { th.css({ 'cursor': '/web/Page/frameset/images/splith.cur' }); //修改为你的鼠标图标路径 } else { th.css({ 'cursor': 'default' }); } }); 当鼠标按下时,显示竖线,并设置它的高度,位置CSS属性,同时记录当前要改变列宽的TH对象,因为一条边框线由两个TH共享,这里总是取前一个TH对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $("th").bind("mousedown", function(event) { var th = $(this); //与mousemove函数中同样的判断 if (th.prevAll().length < 1 | th.nextAll().length < 1) { return; } var pos = th.offset(); if (event.clientX - pos.left < 4 || (th.width() - (event.clientX - pos.left)) < 4) { var height = th.parent().parent().height(); var top = pos.top; $("#line").css({ "height": height, "top": top,"left":event .clientX,"display":"" }); //全局变量,代表当前是否处于调整列宽状态 lineMove = true; //总是取前一个TH对象 if (event.clientX - pos.left < th.width() / 2) { currTh = th.prev(); } else { currTh = th; } } }); 接下来是鼠标移动时,竖线随之移动的效果,因为需要当鼠标离开TH元素也要能有该效果,该效果写在BODY元素的mousemove函数中 1 2 3 4 5 $("body").bind("mousemove", function(event) { if (lineMove == true) { $("#line").css({ "left": event.clientX }).show(); } }); 最后是鼠标弹起时,最后的调整列宽效果。这里我给BODY 和TH两个元素添加了同样的mouseup代码。我原先以为我只需要给BODY添加mouseup函数,但不明白为什么鼠标在TH中时,事件没有触发,我只好给TH元素也添加了代码。水平有限,下面完全重复的代码不知道怎么抽出来。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 $("body").bind("mouseup", function(event) { if (lineMove == true) { $("#line").hide(); lineMove = false; var pos = currTh.offset(); var index = currTh.prevAll().length; currTh.width(event.clientX - pos.left); currTh.parent().parent().find("tr").each(function() { $(this).children().eq(index).width(event.clientX - pos.left); }); } }); $("th").bind("mouseup", function(event) { if (lineMove == true) { $("#line").hide(); lineMove = false; var pos = currTh.offset(); var index = currTh.prevAll().length; currTh.width(event.clientX - pos.left); currTh.parent().parent().find("tr").each(function() { $(this).children().eq(index).width(event.clientX - pos.left); }); } }); 好了,只要在需要这个效果的页面中引入包含以上代码的JS文件,就可以为页面中表格添加该效果。 另外以上代码在火狐中自定义鼠标图标的代码没出效果,所用的jquery为1.2.6 效果文件下载:http://files.cnblogs.com/xxfss2/changeTh.js ————————————————————————2012-8-16更新—————————————— 关于拖动时会选中内容的BUG,将以下一行代码添加到$(document).ready函数里就行了 $("body").bind("selectstart", function() { return !lineMove; }); 标签: JavaScript, Asp.Net http://www.cnblogs.com/xxfss2/archive/2011/01/21/1941567.html
本demo使用jQuery包,实现表格列宽可拖拽功能,并实现页面reset时的重新布局。使用jQuery,方便函数的调用,给要处理的表格添加id 后,直接调用$("#id").movedTh()即可方便实现,修改了firfox的兼容性。 代码如下: [javascript] view plaincopy <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <mce:script type="text/javascript" src="jquery-1.3.2.min.js" mce_src="jquery-1.3.2.min.js"></mce:script> <mce:style><!-- .resizeDivClass { position:absolute; background-color:gray; width:2px; height:15px; z-index:1px; display: block; cursor:e-resize } .td1 { font-size: 12px; white-space:nowrap; color:#0000ff; } --></mce:style><style mce_bogus="1">.resizeDivClass { position:absolute; background-color:gray; width:2px; height:15px; z-index:1px; display: block; cursor:e-resize } .td1 { font-size: 12px; white-space:nowrap; color:#0000ff; }</style> <mce:script language=javascript><!-- /* 标题:扩拖拽列表格demo 1.2 设计:卢松强 博客:http://hi.csdn.net/andensy 日期:2010年4月26日 说明:修改了firfox兼容性问题,可以很好的兼容火狐浏览器 */ /* 依赖于jQuery */ (function($){ //用正则表达式判断jQuery的版本 if (/1/.(0|1|2)/.(0|1|2|3|4|5)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) { alert('movedTh 需要 jQuery v1.2.6 以后版本支持! 你正使用的是 v' + $.fn.jquery); return; } me=null; var ps=3; $.fn.movedTh=function(){ me=this; var target = null; var tempStr = ""; var i=0; $(me).find("tr:first").find("th").each(function(){ tempStr = '<div id="mydiv'+i+'"onmousedown="$().mousedone.movedown(event,this)" ></div>'; var div={}; $(this).html($(this).html()+tempStr); var offset = $(this).offset(); var pos=offset.left +$(this).width()+ me.offset().left-ps; $("#mydiv"+i).addClass("resizeDivClass"); $("#mydiv"+i).css("left",pos); $("#mydiv"+i).css("top",(offset.top+2)); i++; }); //end each } //end moveTh $.fn.mousedone={ movedown:function(e,obj){ var d=document; var e = window.event||e ; var myX = e.clientX||e.pageX; obj.mouseDownX=myX ; obj.pareneTdW=$(obj).parent().width(); //obj.parentElement.offsetWidth; obj.pareneTableW=me.width(); if(obj.setCapture){ obj.setCapture(); }else if(window.captureEvents){ window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); } d.onmousemove=function(e){ var dragData=obj; var event = window.event||e ; if(!dragData.mouseDownX) return false; var newWidth=dragData.pareneTdW*1+(event.clientX||event.pageX)*1-dragData.mouseDownX; if(newWidth>0) { $(obj).parent().width(newWidth); me.width(dragData.pareneTableW*1+(event.clientX||event.pageX)*1-dragData.mouseDownX); var k=0; me.find("tr:first").find("th").each(function(){ var offset = $(this).offset(); var pos=offset.left*1+$(this).width()*1+me.offset().left*1-ps; $("#mydiv"+k).css("left",pos); k++; }) //end each }//end if }; d.onmouseup=function(e){ var dragData=obj; if(dragData.setCapture) { dragData.releaseCapture(); }else if(window.captureEvents){ window.releaseEvents(e.MOUSEMOVE|e.MOUSEUP); } dragData.mouseDownX=0; } } } //end mousedone $(window).resize(function(){ setTimeout(function() { var target = null; var tempStr = ""; var i=0; $(me).find("tr:first").find("th").each(function(){ tempStr = '<div id="mydiv'+i+'"onmousedown="$().mousedone.movedown(event,this)" ></div>'; var div={}; $(this).html($(this).html()+tempStr); var offset = $(this).offset(); var pos=offset.left +$(this).width()+ me.offset().left-ps; $("#mydiv"+i).addClass("resizeDivClass"); $("#mydiv"+i).css("left",pos); i++; }); //end each }, 10); }); })(jQuery) $().ready(function(){ $("#tab").movedTh(); }) // --></mce:script> </head> <body onload=""> <table cellpadding="3" id='' STYLE="table-layout:fixed;" mce_STYLE="table-layout:fixed;" > <tr bgcolor=cccccc > <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr><span style="color:#069" mce_style="color:#069">|</span></th> <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr><span style="color:#069" mce_style="color:#069">|</span></th> </tr></table> <br> <table cellpadding="3" id='tab' STYLE="table-layout:fixed;" mce_STYLE="table-layout:fixed;" > <tr bgcolor=cccccc > <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr></th> <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr></th> <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr></th> <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr></th> <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr></th> <th valign=top class="td1" ><nobr>改变table的列宽度改</nobr></th> </tr> <tr> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> </tr> <tr> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> </tr> <tr> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> </tr> <tr> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> <td class="td1"><nobr>改变table的列宽度</nobr></td> </tr> </table> </body> </html> 更多0 上一篇:一个可拖拽列宽表格demo http://blog.csdn.net/andensy/article/details/5528944
T-Sql操作Xml数据 一、前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型。用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列;此外,还允许带有变量和参数。为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB)。 用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中。 随着SQL Server 对XML字段的支持,相应的,T-SQL语句也提供了大量对XML操作的功能来配合SQL Server中XML字段的使用。本文主要说明如何使用SQL语句对XML进行操作。 二、定义XML字段 在进行数据库的设计中,我们可以在表设计器中,很方便的将一个字段定义为XML类型。需要注意的是,XML字段不能用来作为主键或者索引键。同样,我们也可以使用SQL语句来创建使用XML字段的数据表,下面的语句创建一个名为“docs”的表,该表带有整型主键“pk”和非类型化的 XML 列“xCol”: CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null) XML类型除了在表中使用,还可以在存储过程、事务、函数等中出现。下面我们来完成我们对XML操作的第一步,使用SQL语句定义一个XML类型的数据,并为它赋值: declare @xmlDoc xml; set @xmlDoc='<book id="0001"> <title>C Program</title> <author>David</author> <price>21</price> </book>' 三、查询操作 在定义了一个XML类型的数据之后,我们最常用的就是查询操作,下面我们来介绍如何使用SQL语句来进行查询操作的。 在T-Sql中,提供了两个对XML类型数据进行查询的函数,分别是query(xquery)和value(xquery, dataType),其中,query(xquery)得到的是带有标签的数据,而value(xquery, dataType)得到的则是标签的内容。接下类我们分别使用这两个函数来进行查询。 1、使用query(xquery) 查询 我们需要得到书的标题(title),使用query(xquery)来进行查询,查询语句为: select @xmlDoc.query('/book/title') 运行结果如图: 2、使用value(xquery, dataType) 查询 同样是得到书的标题,使用value函数,需要指明两个参数,一个为xquery, 另一个为得到数据的类型。看下面的查询语句: select @xmlDoc.value('(/book/title)[1]', 'nvarchar(max)') 运行结果如图: 3、查询属性值 无论是使用query还是value,都可以很容易的得到一个节点的某个属性值,例如,我们很希望得到book节点的id,我们这里使用value方法进行查询,语句为: select @xmlDoc.value('(/book/@id)[1]', 'nvarchar(max)') 运行结果如图: 4、使用xpath进行查询 xpath是.net平台下支持的,统一的Xml查询语句。使用XPath可以方便的得到想要的节点,而不用使用where语句。例如,我们在@xmlDoc中添加了另外一个节点,重新定义如下: set @xmlDoc='<root> <book id="0001"> <title>C# Program</title> <author>Jerry</author> <price>50</price> </book> <book id="0002"> <title>Java Program</title> <author>Tom</author> <price>49</price> </book> </root>' --得到id为0002的book节点 select @xmlDoc.query('(/root/book[@id="0002"])') 上面的语句可以独立运行,它得到的是id为0002的节点。运行结果如下图: 四、修改操作 SQL的修改操作包括更新和删除。SQL提供了modify()方法,实现对Xml的修改操作。modify方法的参数为XML修改语言。XML修改语言类似于SQL 的Insert、Delete、UpDate,但并不一样。 1、修改节点值 我们希望将id为0001的书的价钱(price)修改为100, 我们就可以使用modify方法。代码如下: set @xmlDoc.modify('replace value of (/root/book[@id=0001]/price/text())[1] with "100"') --得到id为0001的book节点 select @xmlDoc.query('(/root/book[@id="0001"])') 注意:modify方法必须出现在set的后面。运行结果如图: 2、删除节点 接下来我们来删除id为0002的节点,代码如下: --删除节点id为0002的book节点 set @xmlDoc.modify('delete /root/book[@id=0002]') select @xmlDoc 运行结果如图: 3、添加节点 很多时候,我们还需要向xml里面添加节点,这个时候我们一样需要使用modify方法。下面我们就向id为0001的book节点中添加一个ISBN节点,代码如下: --添加节点 set @xmlDoc.modify('insert <isbn>78-596-134</isbn> before (/root/book[@id=0001]/price)[1]') select @xmlDoc.query('(/root/book[@id="0001"]/isbn)') 运行结果如图: 4、添加和删除属性 当你学会对节点的操作以后,你会发现,很多时候,我们需要对节点进行操作。这个时候我们依然使用modify方法,例如,向id为0001的book节点中添加一个date属性,用来存储出版时间。代码如下: --添加属性 set @xmlDoc.modify('insert attribute date{"2008-11-27"} into (/root/book[@id=0001])[1]') select @xmlDoc.query('(/root/book[@id="0001"])') 运行结果如图: 如果你想同时向一个节点添加多个属性,你可以使用一个属性的集合来实现,属性的集合可以写成:(attribute date{"2008-11-27"}, attribute year{"2008"}),你还可以添加更多。这里就不再举例了。 5、删除属性 删除一个属性,例如删除id为0001 的book节点的id属性,我们可以使用如下代码: --删除属性 set @xmlDoc.modify('delete root/book[@id="0001"]/@id') select @xmlDoc.query('(/root/book)[1]') 运行结果如图: 6、修改属性 修改属性值也是很常用的,例如把id为0001的book节点的id属性修改为0005,我们可以使用如下代码: --修改属性 set @xmlDoc.modify('replace value of (root/book[@id="0001"]/@id)[1] with "0005"') select @xmlDoc.query('(/root/book)[1]') 运行结果如图: OK,经过上面的学习,相信你已经可以很好的在SQL中使用Xml类型了,下面是我们没有提到的,你可以去其它地方查阅:exist()方法,用来判断指定的节点是否存在,返回值为true或false; nodes()方法,用来把一组由一个查询返回的节点转换成一个类似于结果集的表中的一组记录行。 作者:齐飞 日期:2008年11月27日 参考资料:SQL Server联机丛书、MSDN、《数据库与SQL Server 2005教程》(清华大学出版社,钱雪忠编著) 版权归作者所有,转载请注明出处。 2010年9月24日更新,修改了内容的显示方式。 http://www.cnblogs.com/youring2/archive/2008/11/27/1342288.html
本来form method=post本页面 修改为其他页面 action=save.aspx后没问题 其他问题可参考以下: 引自:http://topic.csdn.net/u/20090108/17/f240cd4d-72cf-44bc-851e-cc587dd7e468.html源问题:详细内容: System.Runtinm.InteropServices.COMException 被调用的对象已与其客户端断开连接。 (异常来自 HRESULT:0x80010108 (RPC_E_DISCONNECTED)) ErrorCode:-2147417848 Souce:Interop.Word StackTrace:" 在 Word.ApplicationClass.Quit(Object& SaveChanges, Object& OriginalFormat, Object& RouteDocument)\r\n 在 WordOPTools.OpWord(Object& fileName, Boolean issafe, String newpath)" 当处理的word内容比较大的时候报这个异常. 还请各位多多帮忙解决一下这个问题. 解决方法:object nothing=System.Reflection.Missing.Value; object optional=System.Reflection.Missing.Value; object visible=true; object saveChanges = true; object NOTsaveChanges = false; object docreadonly=true; object originalFormat = System.Reflection.Missing.Value; object routeDocument =System.Reflection.Missing.Value; Word.ApplicationClass app=new Word.ApplicationClass(); object Fi=page.Server.MapPath(strC+"Template_temp/"+FileName); Word.Document Doc=app.Documents.Open(ref Fi,ref optional,ref docreadonly,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional,ref optional, ref visible); Doc.SaveAs(ref strFileName,ref optional, ref optional, ref optional,ref optional, ref optional, ref optional,ref optional, ref optional, ref optional, ref optional); Doc.Close(ref NOTsaveChanges, ref originalFormat, ref routeDocument); app.Quit(ref NOTsaveChanges, ref originalFormat, ref routeDocument); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.Runtime.InteropServices.Marshal.ReleaseComObject(Doc); app=null; Doc=null; GC.Collect(); GC.Collect();--------------------------------------------------------------补充------------摘自:http://blogs.geekdojo.net/richardhsu/archive/2003/11/14/281.aspxWorking with COM Exe in C# Credit goes to Peter A. Bromberg for this one. In his article, he talks about creating dynamic excel workbooks in C# within an ASP.NET page. What I learnt from the article was how we can properly release a COM object. There are two methods that we are gets the deallocation done. They are :- 1) GC.Collect(); // this one forces garbage collection 2) System.Runtime.InteropServices.Marshal.ReleaseComObject (object); // this one releases the passed in COM object wrapper instance The pattern the author (Peter A. Bromberg) uses to create and release COM Wrapped Excel objects is :- 1) call GC.Collect() to force collection of existing COM Objects waiting to be released. 2) instantiate the COM Wrapped Excel objects (Workbook, Worksheet etc.) 3) do the thing... 4) call the Close() or Quit() methods on the objects when done. 5) call System.Runtime.InteropServices.Marshal.ReleaseComObject(object) once for each COM object created. 6) set each object variable to null. 7) call GC.Collect() again 8) be relieved and reminisce the cool VB6 way of doing the above (Set obj = Nothing) Here is a slightly altered & annotated code fragment (in C#) that shows how it is done :- Excel.Application oXL; Excel._Workbook oWB; Excel._Worksheet oSheet; // Step 1 GC.Collect();// clean up any other excel guys hangin' around... // Step 2 oXL = new Excel.Application(); oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value )); oSheet = (Excel._Worksheet)oWB.ActiveSheet; // Step 3 // this part will actually be filling in the values into the sheet fillValues(oSheet); .... // Step 4 // Need all following code to clean up and extingush all references!!! oWB.Close(null,null,null); oXL.Workbooks.Close(); oXL.Quit(); // Step 5 System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL); System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB); // Step 6 oSheet=null; oWB=null; oXL = null; // Step 7 GC.Collect(); // force final cleanup! Although I am yet to fully understand what goes on behind the scenes, I have used the above mention pattern, and it works. Excel exposes its functionality through a COM Exe. Maybe, we don't need to do all this for a COM Dll, but that is for later. Published Friday, November 14, 2003 5:08 PM by richardhsu Filed Under: Office - VBA, C#
右击数据库,有一个任务选项——扩展里面有一个生成脚本 设置脚本选项 高级 最下方“要编写的脚本类型” 选择 框架及数据 完成
http://dotnet.chinaitlab.com/ADONET/757364.html 从 ADO.NET 1.x 开始,DataReader 就可以在单一次的查询动作中,「批次 (batch)」读取 T-SQL 语句以取回多个 table (数据表) 的数据,也就是一次能够回传多个「结果集 (Result Set)」,亦即所谓的「批次查询」。其中 DataReader 的 NextResult 方法,是用来取得批次查询中,下一个 Result Set 的结果。例如若要从两个不同的 table 中捞取 column 值,分别绑定至两个 DropDownList 中,我们不需要浪费系统资源去建立两个 DataSource 对象,而可以直接用下列的 Code-behind 代码,仅透过单一次的数据库连结来达成: using (SqlConnection conn = new SqlConnection(strConnString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; // 利用分号「;」串连多句 SQL 语句,之后再一次丢进数据库去执行,达成「批次」读取或更新 // 数据库的目的。此技巧亦适用于 INSERT、UPDATE、DELETE 的「批次」执行。 cmd.CommandText = "SELECT 字段1,字段2 FROM 数据表1 ; SELECT * FROM 数据表2"; using (SqlDataReader dr = cmd.ExecuteReader()) { while(dr.Read()) { this.DropDownList1.Items.Add(dr.GetSqlString(0).ToString() + dr.GetSqlInt32(1).ToString()); } dr.NextResult(); while(dr.Read()) { this.DropDownList2.Items.Add(dr.GetString(0) + dr.GetInt32(1)); } } } } 读取时若还有其它的 Result Set,则 NextResult 方法会返回 True;因此我们也可透过返回的布尔值,搭配 While 或 Do Until 等循环,依序再往下读取 Result Set。根据默认,DataReader 会由第一个 Result Set 开始读取。此外,若连结的为 SQL Server 数据库,从 ADO.NET 1.x 开始,DataReader 即支持以 GetSql 开头的方法来取得数据,其「性能 (performance)」会比Get 开头的方法要好。
DTS导出向导 不会 我这有个是用C#语言写的 try { Excel.Application xApp = new Excel.ApplicationClass(); xApp.Visible = true; //Excel.Workbook xBook = xApp.Workbooks.Add(Missing.Value);//新建一个 Excel.Workbook xBook = xApp.Workbooks._Open(@"G:\MS2004.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//打开一个事先建好的excel 文件 for (int a = 1; a < 11; a++) { Excel.Worksheet sheet = (Excel.Worksheet)xBook.Worksheets[a]; sheet.Cells[1, 1] = "A"; sheet.Cells[1, 2] = "B"; sheet.Cells[1, 3] = "C"; string consql = "连接字符串"; SqlConnection myConnection = new SqlConnection(consql); myConnection.Open(); string sql = "SELECT A,B,C FROM temp_data where(一串东西) and C='" + a+ "'"; DataSet set = new DataSet(); SqlDataAdapter sda = new SqlDataAdapter(sql, myConnection); sda.Fill(set, "temp_data"); for (int i = 1; i <= set.Tables[0].Rows.Count; i++) { for (int j = 0; j < set.Tables[0].Columns.Count; j++) { int k = i + 1; int n = j + 1; sheet.Cells[k, n] = set.Tables[0].Rows[i - 1][j].ToString(); } } } xBook.SaveAs(@"G:\EXCEL\data.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//另存为 xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出 xApp = null; MessageBox.Show("导出数据成功!", "系统信息"); } catch (Exception ex) { //MessageBox.Show(ex.Message); } } 你自己好好看一下 希望对你有帮助 我以前的问题和你的差不多 把数据导入到excel中并且按照一个字段 划分sheet
‘您正试图运行的函数包含有宏或需要宏语言支持的内容。而在安装此软件时,您(或您的管理员)选择了不安装宏或宏的控件的支持功能。’每次关闭word都要出现这个该死的提示,头痛了半天。谢谢各位!我终于找到方法了,并成功解决问题,现在推荐给大家:1. Word选项(I) / 加载项 / 转到(G).../2.把里面的3项内容都删除/确定/ 3. Word选项(I) / 信任中心 / 信任中心设置 (T)...4. 选择 “启用所有宏”和“信任对 VBA 工程对象模型的访问”/ 确定5.重新启动 WORD 2010 http://zxa2000.blog.163.com/blog/static/72233820100289356938/
iis7.5中设定应用程序池中《进程模型》中《标识》为localSystem 提示:System.Runtime.InteropServices.COMException: 命令失败 在《组件服务》中配置 《Microsoft Word 97 - 2003》的 《标识》选择为《下列用户》(开始为 《交互式》,但这个方式可以理解为需要有登录的账号活动,所以不可行)
Javascript中 有3个事件句柄在对应键盘的输入状态:keydown、keypress和keyup。 分别对应的意思是:按键被按下(按下按键但还没有抬起)、点击按键(按下并抬起按键)、按键抬起(按键抬起之后) 按键的分类: 按键可以分为“实键”和“虚键” 实键可以理解为我们能够看到并打印出来的按键,如字母“A”、数字“1”、字符“?”等等 虚键就是那些无法打印出来起到控制作用的按键,如“Ctrl”、“Alt”、“Shift”、“方向键”等等 IE在处理虚键时有个特例:虚键不会产生keypress事件,必须使用keydown或keyup来捕获 按键码和字符码 按键码是计算机用来识别不同按键的编码,每一个按键都有按键码 字符码是可被打印的实键特有的,对应了键盘上显示的字符 按键码可以使用String.fromCharCode()转换为字符码 按键码和和字符码的对应表可以在本文最后找到。 获取实键 [javascript] view plaincopy $('body').bind('keypress',getKeyCode); function getKeyCode(e) { var evt = e || window.event; var keyCode = evt.keyCode || evt.which || evt.charCode; alert(keyCode); } 稍微解释下 1. e为Firefox等标准浏览器支持的JS隐藏变量,表示一个“事件”;IE系列中没有“e”,而是用window.event来表示“事件”;所以var e = e || window.event;就表示:获取当前正在发生的事件。2. e.keyCode、e.which、e.charCode都代表获取按键码,但不同的浏览器支持不同的写法 获取虚键 [javascript] view plaincopy function getKeyCode(e) { var evt = e || window.event; if (evt.ctrlKey) alert("ctrlKey pressed"); if (evt.altKey) alert("altKey pressed"); if (evt.shiftKey) alert("shiftKey pressed"); } 字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 51 D 68 M 77 V 86 4 52 E 69 N 78 W 87 5 53 F 70 O 79 X 88 6 54 G 71 P 80 Y 89 7 55 H 72 Q 81 Z 90 8 56 I 73 R 82 0 48 9 57 数字键盘上的键的键码值(keyCode) 功能键键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 0 96 8 104 F1 112 F7 118 1 97 9 105 F2 113 F8 119 2 98 * 106 F3 114 F9 120 3 99 + 107 F4 115 F10 121 4 100 Enter 108 F5 116 F11 122 5 101 - 109 F6 117 F12 123 6 102 . 110 7 103 / 111 控制键键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 BackSpace 8 Esc 27 Right Arrow 39 -_ 189 Tab 9 Spacebar 32 Dw Arrow 40 .> 190 Clear 12 Page Up 33 Insert 45 /? 191 Enter 13 Page Down 34 Delete 46 `~ 192 Shift 16 End 35 Num Lock 144 [{ 219 Control 17 Home 36 ;: 186 \| 220 Alt 18 Left Arrow 37 =+ 187 ]} 221 Cape Lock 20 Up Arrow 38 ,< 188 '" 222 多媒体键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 音量加 175 音量减 174 停止 179 静音 173 浏览器 172 邮件 180 搜索 170 收藏 171
<?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } for($i = 1;$i <= 10000;$i++) { $data_1[$i] = 1; } for($i = 1001;$i <= 600000;$i++) { $data_2[$i] = 1; } $time_start = microtime_float(); $num = 0; foreach ($data_1 as $key => $value) { if ($data_2[$key]) { $num++; } } echo $num; $time_end = microtime_float(); $delta_time = $time_end - $time_start; echo '程序总用时:'.round($delta_time, 3).'秒。'; $time_start = microtime_float(); $num = 0; foreach ($data_2 as $key => $value) { if ($data_1[$key]) { $num++; } } echo $num; $time_end = microtime_float(); $delta_time = $time_end - $time_start; echo '程序总用时:'.round($delta_time, 3).'秒。'; ?> 结果:9000程序总用时:0.003秒。9000程序总用时:0.595秒。 foreach放小的数组,速度比较快。
转自:http://josh-persistence.iteye.com/blog/1979552 备忘 Node.js是一个轻松构建快速,可扩展的网络应用平台建立在Chrome的JavaScript运行。Node.js使用事件驱动,非阻塞I/O模型,使得它重量轻,高效,完美的数据密集型实时应用程序运行在分布式设备。 在Windows上安装 Node.js很方便,我们只需要访问node.js官网 http://www.nodejs.org/,点击Download链接,然后选择Windows Installer(我的机器是64bit可选),下载安装包。下载完成后直接双击安装,和其它一般软件安装一样: 选择安装位置: 安装完成: 到此我们已经安装Node.sj完成,以下是Node.js安装目录结构: 启动node 在“开始”-》“程序”找到 直接双击node.js 测试一个简单实例:输出“Hello,World!” 我们进入node之后,可以输入: console.log("Hello,World!"); 然后我们就会看到命令行里输出了:Hello,World! 另外,也可以这样做:在 node.js 的安装目录下,创建一个文件名为:hello.js,代码如下: /** **/ var sys = require("util"); sys.puts("Hello world"); 下面,我们来测试一下node.js是否可以正确运行,打开node.js命令提示符: 执行如下图所示: 以上是使用命令行创建的简单Node.js程序,下面我们来看一个复杂点的应用服务程序。 例如,D:\Program Files\nodejs下建立一个node文件夹,然后在里面创建一个 firstapp.js,打开 firstapp,js 输入以下代码: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World - Node.js Work.\n'); }).listen(5656, '127.0.0.1'); console.log('Server running at http://127.0.0.1:5656/'); 然后打开命令行,进入node目录,然后在命令行里执行:node firstapp.js 命令,再打开浏览器在浏览器里输入地址: http://127.0.0.1:5656/或 http://localhost:5656,即可运行 firstapp文件的代码。 运行效果如下: 如果没有什么语法之类的错误,就是以上的效果了。
$.browser是通过正则表达式来匹配userAgent来判断浏览器版本和种类的.jquery1.3.2版本的文档中已经声明jquery.browser及jquery.browser.version建议弃用,可以使用jquery.support来代替。jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9或者jQuery 1.10.1等。 如果要全面支持 IE,并混合使用 jQuery 1.9 和 2.0, 官方的解决方案是:<!--[if lt IE 9]><script src='http://keleyi.com/keleyi/pmedia/jquery-1.10.1.min.js'></script><![endif]--><!--[if gte IE 9]><script src='http://keleyi.com/keleyi/pmedia/jquery-2.0.2.min.js'></script><![endif]-->从长久来看,这样有利于在复杂情况下根据浏览器特性进行分别处理, 而不是简单的检测浏览器类型和版本。 但目前很多旧程序的移植恐怕无法直接过渡为根据浏览器支持特性, 所以在网上找了一些能够直接替换的解决办法。判断浏览器类型:$.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase());$.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase());$.browser.opera = /opera/.test(navigator.userAgent.toLowerCase());$.browser.msie = /msie/.test(navigator.userAgent.toLowerCase());等号后面的表达式返回的就是 true/false, 可以直接用来替换原来的 $.browser.msie 等。检查是否为 IE6:// Oldif ($.browser.msie && 7 > $.browser.version) {}// Newif ('undefined' == typeof(document.body.style.maxHeight)) {}检查是否为 IE 6-8:if (!$.support.leadingWhitespace) {}作者也不推荐使用浏览器类型和版本来进行判断。 http://www.keleyi.com/a/bjac/wtiuxpsu.htm
项目中用的jquery-1.10.2 需要检测一个checkbox的选中状态,想当然的用 .attr("checked") ,结果发现,无论是否选中,这个值都是 undefined 未定义。 查找资料,特此记录: jq官网说明: As of jQuery 1.6, the .attr() method returns undefined for attributes that have not been set. In addition, .attr() should not be used on plain objects, arrays, the window, or the document. To retrieve and change DOM properties, use the .prop()method. .attr() 不能用于普通对象,数组,窗口,文档等,要重新获取改变dom属性,用.prop()方法。 用.prop方法确实可行。 贴一段代码如下: [html] view plaincopy $('#regSubmit').click(function(){ var val = $("#reg-checkbox").prop("checked"); console.log(val); if(val =="checked" ||val==true){ var useremail = $("#reg-email").val(); var password = $("#reg-password").val(); var psdHash = HASH.md5(password); AUTH.fnReg(useremail,psdHash,function(json){ $("#login-email").attr("value",useremail); }); } else{ alert("亲,请阅读并同意 《中科甲骨云服务条款》!"); } }); 相关链接可见: http://my.oschina.net/cxz001/blog/111730 http://blog.csdn.net/lovemianmian/article/details/12585839
转自http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/08/2203153.html 备忘 rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。 常用命令组合: -ivh:安装显示安装进度--install--verbose--hash -Uvh:升级软件包--Update; -qpl:列出RPM软件包内的文件信息[Query Package list]; -qpi:列出RPM软件包的描述信息[Query Package install package(s)]; -qf:查找指定文件属于哪个RPM软件包[Query File]; -Va:校验所有的RPM软件包,查找丢失的文件[View Lost]; -e:删除包 rpm -q samba //查询程序是否安装 rpm -ivh /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm //按路径安装并显示进度rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm //指定安装目录 rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm //用来检查依赖关系;并不是真正的安装;rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm //新版本降级为旧版本 rpm -qa | grep httpd #[搜索指定rpm包是否安装]--all搜索*httpd* rpm -ql httpd #[搜索rpm包]--list所有文件安装目录 rpm -qpi Linux-1.4-6.i368.rpm #[查看rpm包]--query--package--install package信息 rpm -qpf Linux-1.4-6.i368.rpm #[查看rpm包]--file rpm -qpR file.rpm #[查看包]依赖关系 rpm2cpio file.rpm |cpio -div #[抽出文件] rpm -ivh file.rpm #[安装新的rpm]--install--verbose--hash rpm -ivh rpm -Uvh file.rpm #[升级一个rpm]--upgrade rpm -e file.rpm #[删除一个rpm包]--erase 常用参数: Install/Upgrade/Erase options: -i, --install install package(s) -v, --verbose provide more detailed output -h, --hash print hash marks as package installs (good with -v) -e, --erase erase (uninstall) package -U, --upgrade=<packagefile>+ upgrade package(s) --replacepkge 无论软件包是否已被安装,都强行安装软件包 --test 安装测试,并不实际安装 --nodeps 忽略软件包的依赖关系强行安装 --force 忽略软件包及文件的冲突 Query options (with -q or --query): -a, --all query/verify all packages -p, --package query/verify a package file -l, --list list files in package -d, --docfiles list all documentation files -f, --file query/verify package(s) owning file RPM源代码包装安装 .src.rpm结尾的文件,这些文件是由软件的源代码包装而成的,用户要安装这类RPM软件包,必须使用命令: rpm --recompile vim-4.6-4.src.rpm #这个命令会把源代码解包并编译、安装它,如果用户使用命令: rpm --rebuild vim-4.6-4.src.rpm #在安装完成后,还会把编译生成的可执行文件重新包装成i386.rpm的RPM软件包
删除id,并删除hasDatepicker //+ - function changeRows(sender,desc){var tr = $(sender).closest("tr");var table = tr.parent();if(desc<0){if(table.find("tr").length>1){tr.remove();}else{tr.find("input[type=text]").val("");tr.find("input[type=checkbox]").removeAttr("checked");}}else{var newrow = $(tr).clone(true);$(tr).after(newrow);newrow.find(".date").removeAttr("id").removeClass('hasDatepicker').datepicker({ dateFormat: 'yy-mm-dd' }); newrow.find("input[type=text]").val("");newrow.find("input[type=checkbox]").removeAttr("checked");}} 参考: ar $clone=$(".datepicker").clone(); $clone.datepicker("destroy"); $clone.removeAttr("id"); $clone.datepicker(); $('form').append($clone); http://translate.googleusercontent.com/translate_c?depth=1&hl=zh-CN&prev=/search%3Fq%3Ddatepicker%2Bclone%26newwindow%3D1%26safe%3Dstrict%26es_sm%3D93&rurl=translate.google.com.hk&sl=en&u=http://stackoverflow.com/questions/19150968/how-to-clone-jquery-datepicker-input-field&usg=ALkJrhjn0EN3-_w2Yi4EAf6yB131_oTTbQ
用jquery绑定一个按钮click事件后,第一次点击后,一切正常,第二次点击,竟然执行两次,以后越来越多, 后来查看文档发现 jquery click 不是 替换原有的function 而是接着添加,所以才会执行次数越来越多。 这有就可以在添加之前 先将按钮 click 函数置空,然 后再添加。 解绑定方法 $("").unbind('click'); http://blog.csdn.net/ltfgood/article/details/12952485
两种方法: 一种是用Truncate TRUNCATE TABLE name 可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENT DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 如dbcc checkident ("bc_pos",reseed,1)即可,但如果表内有数据,则重设的值如果小于最大值可能会有问题,这时可以用 dbcc checkident("bc_pos",reseed)即可自动重设值。 3、判段一个表是否具有标识列 可以使用 objectPROPERTY 函数确定一个表是否具有 IDENTITY(标识)列,用法: Select OBJECTPROPERTY(OBJECT_ID('表名'),'TableHASIdentity') 如果有,则返回1,否则返回0 4、判断某列是否是标识列 可使用 COLUMNPROPERTY 函数确定 某列是否具有IDENTITY 属性,用法 SELECT COLUMNPROPERTY( OBJECT_ID('表名'),'列名','IsIdentity') 如果该列为标识列,则返回1,否则返回0 4、查询某表标识列的列名 SQL Server中没有现成的函数实现此功能,实现的SQL语句如下 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='表名' AND COLUMNPROPERTY( OBJECT_ID('表名'),COLUMN_NAME,'IsIdentity')=1 5、标识列的引用 如果在SQL语句中引用标识列,可用关键字IDENTITYCOL代替 例如,若要查询上例中ID等于1的行, 以下两条查询语句是等价的 SELECT * FROM T_test WHERE IDENTITYCOL=1 SELECT * FROM T_test WHERE 6、获取标识列的种子值 可使用函数IDENT_SEED,用法: SELECT IDENT_SEED ('表名') 7、获取标识列的递增量 可使用函数IDENT_INCR ,用法: SELECT IDENT_INCR('表名') 8、获取指定表中最后生成的标识值 可使用函数IDENT_CURRENT,用法: SELECT IDENT_CURRENT('表名') 注意事项:当包含标识列的表刚刚创建,为经过任何插入操作时,使用IDENT_CURRENT函数得到的值为标识列的种子值,这一点在开发数据库应用程序的时候尤其应该注意。 查找表是否有自增列 SELECT 表名=D.NAME, 列名= A.NAME, 是否自增=CASE WHEN COLUMNPROPERTY( A.ID,A.NAME, 'ISIDENTITY ')=1 THEN '√' ELSE '' END, 主键=CASE WHEN EXISTS( SELECT 1 FROM SYSOBJECTS WHERE XTYPE='PK 'AND PARENT_OBJ=A.ID AND NAME IN ( SELECT NAME FROM SYSINDEXES WHERE INDID IN( SELECT INDID FROM SYSINDEXKEYS WHERE ID =A.ID AND COLID=A.COLID) )) THEN '√' ELSE '' END FROM SYSCOLUMNS A LEFT JOIN SYSTYPES B ON A.XUSERTYPE=B.XUSERTYPE INNER JOIN SYSOBJECTS D ON A.ID=D.ID AND D.XTYPE='U' AND D.NAME <>'DTPROPERTIES ' where COLUMNPROPERTY( A.ID,A.NAME, 'ISIDENTITY ') =1
(function($) {//自动关联ItemNo$.fn.extend({productitemlist: function(options) {return this.each(function() {var> var> sender.unautocomplete().autocomplete(url, {max: 0,minChars: 1,width: 420,matchContains: "word",autoFill: false,extraParams: {},formatItem: function(row){return row[1];},formatResult: function(row){return row[1];}}).result(function(event, data, formatted) {var> if(data) tr.find("input[name=itemno]").val(data[0]).change();if(data) tr.find("input[name=product]").val(data[3]);});});}});//自动关联ItemNo})(jQuery); //+ - function changeRows_sample(sender,desc){var> var> if(desc<0){if(table.find("tr").length>1){tr.remove();//table.find("tr").eq(0).find("input[type=button]").button(); //不知为何remove会使第一行button失去样式}else{tr.find("input[type=text]").val("");tr.find("input[type=checkbox]").removeAttr("checked");tr.find(".expend").html("");tr.closest("tr").find(".gps").html("");}}else{var> $(tr).after(newrow);newrow.find("input[type=text]").val("");newrow.find("input[type=checkbox]").removeAttr("checked");newrow.find(".expend").html("");newrow.find(".gps").html("");newrow.find("input[name=itemno]").attr("id",Math.random());newrow.find("input[name=itemno]").productitemlist();newrow.find("input[name=itemno]").bind("change",itemno_change);} } .asp页面中 <table> <tr><td><input> </td><td> <input> </td><td><input> <td> <td> <span> </td><td> <span> </td><td> <input> <input> </td></tr></table>
如果是onchange 会出错,超过3个可能就无效。
domino安装及语言包安装 http://wenku.baidu.com/view/f473600d581b6bd97f19ea9b.html dominoserver 安装后启动配置: http://wenku.baidu.com/view/82dbac1aa300a6c30c229fbf.html
有个分页,跳转页面后执行语句大致如下: SELECT * FROM [v_bidding_group_product] WHERE [id] IN ( SELECT TOP 400 [id] FROM [v_bidding_group_product] WHERE biddingid=50515 ORDER BY id ) AND [id] NOT IN ( SELECT TOP 300 [id] FROM [v_bidding_group_product] WHERE biddingid=50515 ORDER BY id ) ORDER BY id 执行后存在超时问题。 后通过增加索引解决 方法:查看估计的执行计划,查找开销大的节点,找出查找的字段,增加该字段的索引,v_bidding_group_product的biddingid。
http://www.lampweb.org/jquerymobile/
sqlserver迁移后,主机和原机器不符,将系统修改主机名后,数据库代理服务、邮件服务无法启动 执行下面语句,检查sqlserver中windows主机名 -- 检查SQL Server中的“服务器名[/命名实例名]”, 和当前真实的“计算机名[/命名实例名]”。如果修改了计算机名,则这两者即会不一致。 select @@serverName, serverproperty('serverName') -- 将"服务器名", 修改为正确的计算机名 EXEC sp_dropserver '服务器名[/命名实例名]'; -- 即旧的计算机名 GO EXEC sp_addserver '计算机名[/命名实例名]', 'local'; -- 即新的计算机名 go -- 重启SQL Server 如果还不行,用sa账户登录,删除windows账户,重新添加windows账户
<html xmlns="http://www.w3.org/1999/xhtml"> <head > <title></title> <link type="text/css" href="../../Scripts/jquery-ui-1.8.1.custom.css" rel="Stylesheet" /> <script src="../../Scripts/jquery-1.4.4.js" type="text/javascript"></script> <script src="../../Scripts/jquery-ui-1.8.2.custom.min.js" type="text/javascript"></script> <script src="../../Scripts/jquery.ui.core.js" type="text/javascript"></script> <script src="../../Scripts/jquery.datePicker.js" type="text/javascript"></script> <script src="../../Scripts/ui.datepicker-zh-CN.js" type="text/javascript"></script>//中文汉化 <script src="../../Scripts/jquery.ui.datepicker.js" type="text/javascript"></script> <script type="text/javascript"> $(function() { $('#Datepicker').datepicker({ changeMonth: true, changeYear: true, dateFormat: 'yy-MM', showButtonPanel: true, onClose: function(dateText, inst) { var month = $("#ui-datepicker-div .ui-datepicker-month option:selected").val();//得到选中的月份值 var year = $("#ui-datepicker-div .ui-datepicker-year option:selected").val();//得到选中的年份值 $('#Datepicker').val(year+'-'+(parseInt(month)+1));//给input赋值,其中要对月值加1才是实际的月份 } }); }); </script> <style type="text/css"> //隐藏日的显示div .ui-datepicker-calendar { display: none; } </style> </head> <body> <form id="form1" > Date: <input id="Datepicker" type="text"/> </form> </body> </html> http://hi.baidu.com/ly810916/item/4a611870661e613e70442353
文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE8引入了文件兼容性。在IE6中引入一个增设的兼容性模式,文件兼容性使你能够在IE呈现你的网页时选择特定编译模式。 新的IE为了确保网页在未来的版本中都有一支的外观,IE8引入了文件兼容性。当你引入一个增设的兼容性模式, 此文章说明文件兼容性的必要性,列出现有版本IE能使用的文件兼容性模式并示范如何选择特定的兼容性模式。 了解文件兼容性的必要性 每个主要版本IE新增的功能都是为了让浏览器更容易使用、增加安全性及更支持业界标准。以这些作为IE的特色,其中一个风险就是旧版本网站无法正确的显示。 为了将这个风险降到最低,IE6允许网页开发人员选择IE编译和显示他们网页的方式。"Quirks mode"为预设,这会使页面以旧版本浏览器的视点显示,"Standards mode"(也称为"strict mode")特点是支持业界标准最为完善。然而要利用这个增强的支持功能,网页必须包含恰当的<!DOCTYPE>指令。 若一个网页没有包含<!DOCTYPE>指令,IE6会将它以quirks mode显示。若网页包含有效的<!DOCTYPE>指令但浏览器无法辨识,IE6会将它以IE6 standards mode显示。因为少数网站已经包含<!DOCTYPE>指令,兼容性模式的切换相当成功。这使网页开发人员能选择将他们的网页转移为standards mode的最佳时机。 随著时间经过,更多网站开始使用standards mode。它们也开始使用IE6的特性和功能来检测IE。举例来说,IE6不支持universal selector(即css之全局选择器 * {}),一些网站便使用它来针对IE做特定的对应。 当 IE7增加了对全域选择器的支持,那些依赖IE6特点的网站便无法侦测出这个新版本的浏览器。因此那些针对IE的特定对应无法应用于IE7,造成这些网站便无法如他们预期的显示。由于<!DOCTYPE>只支持两种兼容性模式,受到影响的网站拥有者被迫更新他们的网站使其能支持IE7。 IE8 比之前的任何版本浏览器都更支持业界标准,因此针对旧版本浏览器设计的网页可能无法如预期般呈现。为了帮助减轻所有问题,IE8引入文件兼容性的概念,使你能选择你的网页设计要对应的特定IE版本。文件兼容性在IE8增加了一些新的模式,这些模式能告诉浏览器如何解析和编译一个网页。若你的网页无法在 ie8正确的显示,你可以更新你的网站使它支持最新的网页标准(优先选项)或在你的页面上新增一个meta元素用于告诉IE8如何依照旧版本浏览器编译你的页面。 这能让你选择将你的网站更新支持IE8新特点的时机。 认识文件兼容性模式 IE8支持几种文件兼容性模式,它们具有不同的特性并影响内容显示的方式。 •Emulate IE8 mode指示IE使用<!DOCTYPE>指令来决定如何编译内容。Standards mode指令会显示成IE8 Standards mode而quirks mode会显示成IE5 mode。不同于IE8 mode,Emulate IE8 mode重视<!DOCTYPE>指令。 •Emulate IE7 mode指示IE使用<!DOCTYPE>指令来决定如何编译内容。Standards mode指令会显示成IE7 Standards mode而quirks mode会显示成IE5 mode。不同于IE7 mode,Emulate IE7 mode重视<!DOCTYPE>指令。对于许多网页来说这是最推荐的兼容性模式。 •IE5 mode 编译内容如同IE7的quirks mode之显示状况,和IE5中显示的非常类似。 •IE7 mode编译内容如同IE7的standards mode之显示状况,无论网页是否含有<!DOCTYPE>指令。 •IE8 mode提供对业界标准的最高支持,包含 W3C Cascading Style Sheets Level 2.1 Specification和W3C Selectors API,并有限的支持 W3C Cascading Style Sheets Level 3 Specification (Working Draft)。 •Edge mode指示IE以目前可用的最高模式显示内容。当使用IE8时其等同于IE8 mode。若(假定)未来放出支持更高兼容性模式的IE,使用Edge mode的页面会使用该版本能支持的最高模式来显示内容。同样的那些页面在使用IE8浏览时仍会照常显示。 由于edge mode使用该IE版本所能支持的最高模式来显示所浏览的网页内容,建议仅使用于测试页及其他非商用页面。 指定文件兼容性模式 要为你的网页指定文件模式,需要在你的网页中使用meta元素放入X-UA-Compatible http-equiv 标头。以下是指定为Emulate IE7 mode 兼容性之范例。 <html><head><!-- Mimic Internet Explorer 7 --><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /><title>My Web Page</title></head><body><p>Content goes here.</p></body></html> 其内容随著指定的页面模式而更改,当要模拟IE7时,指定IE=EmulateIE7,指定IE=5, IE=7, 或IE=8来选择其中一种兼容性模式。你也可以指定IE=edge来指示IE8使用它支持的最高模式。 X-UA-compatible标头没有大小写之分。然而除了title元素及其他的meta元素之外,它必须出现在网页header节其它元素之前的位置, 设定网站服务器以指定预设兼容性模式 网站管理员可籍着为网站定义一个自订标头来为他们的网站预设一个特定的文件兼容性模式。这个特定的方法取决于你的网站服务器。举例来说,下列的web.config文件使Microsoft Internet Information Services (IIS)能定义一个自订标头以自动使用IE7 mode来编译所有网页。 <?xml version="1.0" encoding="utf-8"?><configuration><system.webServer><httpProtocol><customHeaders><clear /><add name="X-UA-Compatible" value="IE=EmulateIE7" /></customHeaders></httpProtocol></system.webServer></configuration> 若你已于网站服务器指定了一个预设的文件兼容性模式,你可以在个别页面上指定不同的文件兼容性模式来盖过它。在网页中指定的模式优先权高于服务器中所指定的模式。 请查阅你的网站服务器关于指定自订标头的资讯,或看更多资料: Implementing the META Switch on ApacheImplementing the META Switch on IIS 判定文件兼容性模式 要判定网页使用IE8浏览时的文件兼容性模式,使用document object(文档对象)的documentMode功能。例如在IE8的网址列输入下列程式码会显示目前页面的文件模式。 javascript:alert(document.documentMode); documentMode功能会回传一个数值对应目前页面的文件兼容性模式,举例来说,若网页指定为支持IE8模式,documentMode便会回传值"8"。 在IE6引入的compatMode功能不支持在IE8引入的documentMode功能。目前使用compatMode建立的应用程式还能在IE8中作用,但它们必须更新为使用documentMode。 若你希望使用JavaScript判定一个文件的兼容性模式,引入下面范例的这段程式码可支持旧版本的IE。 engine = null;if (window.navigator.appName == "Microsoft Internet Explorer") {// This is an IE browser. What mode is the engine in?if (document.documentMode) // IE8engine = document.documentMode;else // IE 5-7{engine = 5; // Assume quirks mode unless proven otherwiseif (document.compatMode){if (document.compatMode == "CSS1Compat")engine = 7; // standards mode}}// the engine variable now contains the document compatibility mode.} 认识内容属性值 内容属性值在接收到异于先前叙述的数值时是具有弹性的。这能使你对于IE如何显示你的网页更有操控性。举例来说,你可以设定内容属性值为IE=7.5。当你这样做的时候,IE尝试将这个值转换为version vector并选择最接近的结果。在这个例子中,IE会将其设定为IE7 mode。下面的范例显示该模式设定为其他值的状况。 <meta http-equiv="X-UA-Compatible" content="IE=4"> <!-- IE5 mode --><meta http-equiv="X-UA-Compatible" content="IE=7.5"> <!-- IE7 mode --><meta http-equiv="X-UA-Compatible" content="IE=100"> <!-- IE8 mode --><meta http-equiv="X-UA-Compatible" content="IE=a"> <!-- IE5 mode --> <!-- This header mimics Internet Explorer 7 and uses<!DOCTYPE> to determine how to display the Web page --><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"> 注意: 前面的范例显示单独的内容值。实际上IE只会执行网页中第一个X-UA-Compatible标头。 你也可以使用内容属性来指定复数的文件兼容性模式,这能帮助确保你的网页在未来的浏览器版本都能一致的显示。欲设定复数的文件模式,请设定内容属性以判别你想使用的模式。使用分号来分开各个模式。 如果一个特定版本的IE支持所要求的兼容性模式多于一种,将採用列于标头内容属性中最高的可用模式。你可以使用这个特性来排除特定的兼容性模式,虽然并不推荐这样做。举例来说,下列标头即会排除IE7 mode。 <meta http-equiv="X-UA-Compatible" content="IE=5; IE=8" /> 结论 兼容性对于网页设计师来说是非常重要的顾虑。虽然最好是可以建立一个完全不需依赖任何网页浏览器特性或功能的网站,有时候这是不可能实现的。文件兼容性模式便能将网页限制在某个特定版本的IE中。 使用X-UA-Compatible标头来指定你的页面支持的IE版本。使用document.documentMode判定页面的兼容性模式。 选择支持某个特定版本的IE,你可以确保你的页面在未来的浏览器版本中也能有显示的一致性。 http://www.cnblogs.com/nidilzhang/archive/2010/01/09/1642887.html
不同table 中的col 虽然设置了width 相同,但在IE8、9中长度仍不统一。经检查是不同table使用了不同的colspan ,删除colspan全部使用<td></td><td></td>相同数量的td后长度终于统一
jquery formatCurrency是一个对货币格式进行格式化输入控制、显示的一个jquery插件,可以对文本框输入进行货币合法性验证,并且支持对文本输入字符串进行格式化显示。(国内的会计记账法是保留两位小数,整数位每3个千位使用,号隔开) 1.引入jquery和插件(jquery省略) <script src="jquery.formatCurrency-1.4.0.js" type="text/javascript" ></script> 2.使用插件API方法 // 如将页面所有表格的金额单元格格式化显示 $('.label').formatCurrency(); // $('.ageInput').toNumber(); 如图 插件详细代码 // This file is part of the jQuery formatCurrency Plugin. // // The jQuery formatCurrency Plugin is free software: you can redistribute it // and/or modify it under the terms of the GNU General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // The jQuery formatCurrency Plugin is distributed in the hope that it will // be useful, but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with // the jQuery formatCurrency Plugin. If not, see <http://www.gnu.org/licenses/>. // wiki http://code.google.com/p/jquery-formatcurrency/wiki/Usage (function($) { $.formatCurrency = {}; $.formatCurrency.regions = []; // default Region is en $.formatCurrency.regions[''] = { symbol: '', positiveFormat: '%s%n', negativeFormat: '(%s%n)', decimalSymbol: '.', digitGroupSymbol: ',', groupDigits: true }; $.fn.formatCurrency = function(destination, settings) { if (arguments.length == 1 && typeof destination !== "string") { settings = destination; destination = false; } // initialize defaults var defaults = { name: "formatCurrency", colorize: false, region: '', global: true, roundToDecimalPlace: 2, // roundToDecimalPlace: -1; for no rounding; 0 to round to the dollar; 1 for one digit cents; 2 for two digit cents; 3 for three digit cents; ... eventOnDecimalsEntered: false }; // initialize default region defaults = $.extend(defaults, $.formatCurrency.regions['']); // override defaults with settings passed in settings = $.extend(defaults, settings); // check for region setting if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)); } settings.regex = generateRegex(settings); return this.each(function() { $this = $(this); // get number var num = '0'; num = $this[$this.is('input, select, textarea') ? 'val' : 'html'](); //identify '(123)' as a negative number if (num.search('\\(') >= 0) { num = '-' + num; } if (num === '' || (num === '-' && settings.roundToDecimalPlace === -1)) { return; } // if the number is valid use it, otherwise clean it if (isNaN(num)) { // clean number num = num.replace(settings.regex, ''); if (num === '' || (num === '-' && settings.roundToDecimalPlace === -1)) { return; } if (settings.decimalSymbol != '.') { num = num.replace(settings.decimalSymbol, '.'); // reset to US decimal for arithmetic } if (isNaN(num)) { num = '0'; } } // evalutate number input var numParts = String(num).split('.'); var isPositive = (num == Math.abs(num)); var hasDecimals = (numParts.length > 1); var decimals = (hasDecimals ? numParts[1].toString() : '0'); var originalDecimals = decimals; // format number num = Math.abs(numParts[0]); num = isNaN(num) ? 0 : num; if (settings.roundToDecimalPlace >= 0) { decimals = parseFloat('1.' + decimals); // prepend "0."; (IE does NOT round 0.50.toFixed(0) up, but (1+0.50).toFixed(0)-1 decimals = decimals.toFixed(settings.roundToDecimalPlace); // round if (decimals.substring(0, 1) == '2') { num = Number(num) + 1; } decimals = decimals.substring(2); // remove "0." } num = String(num); if (settings.groupDigits) { for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) { num = num.substring(0, num.length - (4 * i + 3)) + settings.digitGroupSymbol + num.substring(num.length - (4 * i + 3)); } } if ((hasDecimals && settings.roundToDecimalPlace == -1) || settings.roundToDecimalPlace > 0) { num += settings.decimalSymbol + decimals; } // format symbol/negative var format = isPositive ? settings.positiveFormat : settings.negativeFormat; var money = format.replace(/%s/g, settings.symbol); money = money.replace(/%n/g, num); // setup destination var $destination = $([]); if (!destination) { $destination = $this; } else { $destination = $(destination); } // set destination $destination[$destination.is('input, select, textarea') ? 'val' : 'html'](money); if ( hasDecimals && settings.eventOnDecimalsEntered && originalDecimals.length > settings.roundToDecimalPlace ) { $destination.trigger('decimalsEntered', originalDecimals); } // colorize if (settings.colorize) { $destination.css('color', isPositive ? 'black' : 'red'); } }); }; // Remove all non numbers from text $.fn.toNumber = function(settings) { var defaults = $.extend({ name: "toNumber", region: '', global: true }, $.formatCurrency.regions['']); settings = jQuery.extend(defaults, settings); if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)); } settings.regex = generateRegex(settings); return this.each(function() { var method = $(this).is('input, select, textarea') ? 'val' : 'html'; $(this)[method]($(this)[method]().replace('(', '(-').replace(settings.regex, '')); }); }; // returns the value from the first element as a number $.fn.asNumber = function(settings) { var defaults = $.extend({ name: "asNumber", region: '', parse: true, parseType: 'Float', global: true }, $.formatCurrency.regions['']); settings = jQuery.extend(defaults, settings); if (settings.region.length > 0) { settings = $.extend(settings, getRegionOrCulture(settings.region)); } settings.regex = generateRegex(settings); settings.parseType = validateParseType(settings.parseType); var method = $(this).is('input, select, textarea') ? 'val' : 'html'; var num = $(this)[method](); num = num ? num : ""; num = num.replace('(', '(-'); num = num.replace(settings.regex, ''); if (!settings.parse) { return num; } if (num.length == 0) { num = '0'; } if (settings.decimalSymbol != '.') { num = num.replace(settings.decimalSymbol, '.'); // reset to US decimal for arthmetic } return window['parse' + settings.parseType](num); }; function getRegionOrCulture(region) { var regionInfo = $.formatCurrency.regions[region]; if (regionInfo) { return regionInfo; } else { if (/(\w+)-(\w+)/g.test(region)) { var culture = region.replace(/(\w+)-(\w+)/g, "$1"); return $.formatCurrency.regions[culture]; } } // fallback to extend(null) (i.e. nothing) return null; } function validateParseType(parseType) { switch (parseType.toLowerCase()) { case 'int': return 'Int'; case 'float': return 'Float'; default: throw 'invalid parseType'; } } function generateRegex(settings) { if (settings.symbol === '') { return new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g"); } else { var symbol = settings.symbol.replace('$', '\\$').replace('.', '\\.'); return new RegExp(symbol + "|[^\\d" + settings.decimalSymbol + "-]", "g"); } } })(jQuery);
用instr 直接取最右端的点的位置:SQL> select substr('/upload/UserFiles/..ea85a945e72bc71fcffca399_140.jpg',instr('/upload/UserFiles/..ea85a945e72bc71fcffca399_140.jpg','.',-1,1)+1) from dual;SUBSTR('/UPLOAD/USERFILES/..EA------------------------------jpg
<script language=vbscript runat=server> Server.ScriptTimeOut = 9999 Function reName(sourceName,destName) dim oFso,oFile set oFso = Server.CreateObject("Scripting.FileSystemObject") set oFile = oFso.getFile(Server.mappath(sourceName)) oFile.Name = destName Set oFso = Nothing Set oFile = Nothing End Function </script> http://wenku.baidu.com/view/ebc8a16e1eb91a37f1115c89.html
首先看看是不是scrrun.dll 设置了拒绝权限(在windows/system32目录,右键文件,添加 IUSR+机器名 账户).... 一、如果您的系统提示“没有找到scrrun.dll”或者“缺少scrrun.dll”等类似错误信息,请把scrrun.dll下载到本机 二、直接拷贝该文件到系统目录里: 1、Windows 95/98/Me系统,则复制到C:Windows\System目录下。 2、Windows NT/2000系统,则复制到C:WINNT\System32目录下。 3、Windows XP系统,则复制到C:Windows\System32目录下。 三、然后打开“开始-运行-输入regsvr32 scrrun.dll”,回车即可解决错误提示! 一、系统没有开启FSO组件 系统没有开启FSO组件. FSO组件的开启和关闭方法 Dll 文件的注册和注销: 在开始菜单运行 注消FSO组件:RegSvr32 /u %windir%\SYSTEM32\scrrun.dll 启用FSO命令:RegSvr32 %windir%\SYSTEM32\scrrun.dll 二、多次注消、启动后还是出现错误,原因是没权限,不知道怎么造成的,下边提供解决方法 权限出现了问题,打开注册表加入权限! 在 开始-运行中敲入regedit,然后找到HKEY_CLASSES_ROOT\Scripting.FileSystemObject 右击权限,加入everyone,internet来宾帐号(IUSR...)用户确定,然后重新启动IIs即可搞定! 如果你们遇到跟我一样,你们可以找对应的字段修改 按以下步骤进行: 1、首先在系统目录中查找scrrun.dll,如果存在这个文件,请跳到第三步,如果没有,请执行第二步。 2、在系统安装盘i386目录中找到scrrun.dl_,用winrar解压缩,得scrrun.dll,然后复制到你的系统目录c:windowssystem32目录中。 3、运行regsvr32 scrrun.dll即可。 4、如果想关闭FSO组件,请运行 regsvr32 /u scrrun.dll即可。 adodb.stream组件: 在开始->运行 中 输入: regsvr32 "C:\rogram Files\Common Files\System\adomsado15.dll" 即可再次支持adodb.stream组件 2.然后在服务里关闭iis admin service服务,可用命令:iisreset/stop 3.启动IIS,命令:iisreset/start 4. 测试脚本: <% dim fs,fname set fs=Server.CreateObject("Scripting.FileSystemObject") set fname=fs.CreateTextFile("D:\test.txt",true) fname.WriteLine("Hello World!") fname.Close set fname=nothing set fs=nothing Response.write(" File has been created.") %> #计算机 http://hi.baidu.com/isonyo/item/fe4de309471b9e314ac4a331
Scripting.FileSystemObject对象的详细技巧指南 FileSystemObject对象提供对计算机文件系统的访问: powered by 25175.net 在代码内操作文本文件、文件夹及驱动器。它是脚本运行期库提供的对象之一,对于服务器ASP页面内的VBScript和JScript都有效。如果页面的扩展名为.hta(表示它们是HTA的一部分),它也可用在客户端的IE 5中。本节仅讨论在服务器上的ASP脚本如何使用FileSystemObject对象。 超级文本应用程序(HTA)由指定的“受信任的”页面组成,在页面的<HEAD>段里包含<HTA: APPLICATION>元素。例如: <HTA:APPLICATION ID=”objMyApp” APPLICATIONNAME=”myApp”> 这些页面可以使用客户端脚本引擎中的一些不常用特性,这些特性中有FileSystemObject对象和TextStream对象。关于超级文本应用程序的更多信息,请访问Microsoft Workshop网站。 可以使用下面的程序创建一个FileSystemObject对象实例: ‘ In VBScript: Dim objMyFSO Set objMyFSO = Server.CreateObject(“Scripting.FileSystemObject”) // In JScript: var objMyFSO = Server.CreateObject(‘Scripting.FileSystemObject’); <!-- Server-side with an OBJECT element --> <OBJECT RUNAT=”SERVER” SCOPE=”PAGE” ID=”objFSO” PROGID=”Scripting.FileSystemObject”> </OBJECT> 在ASP页面里,增加一个对于FileSystemObject类型库的引用是非常有用的。这允许使用它直接定义的内置常数,不用像过去那样用数字等效表达式代替。整个脚本运行期库的类型库可以增加到任何ASP页面中,代码如下: <!-- METADATA TYPE=”typelib” FILE=”C:WinNTSystem32scrrun.dll” -->如果你是在另一个目录下安装Windows,必须编辑FILE的属性值。 5.4.1 FileSystemObject对象成员概要 FileSystemObject对象提供一个属性和一系列方法,可用它们来操纵FileSystemObject对象实现的一些从属对象。这里提供了全部的内容概要,然后介绍每一个从属对象。 1. FileSystemObject的属性 FileSystemObject对象只有一个属性,它用于得到当前机器上的所有有效驱动器的列表,如表5-4所示: 表5-4 FileSystemObject对象的属性及说明 属 性 说 明 Drivers 返回本地计算机可用的驱动器列表。 2. FileSystemObject的方法 FileSystemObject对象提供了使用从属对象的一系列方法,从属对象包括Drive、Folder和File等对象。它也实现了用于TextStream对象的两个方法:CreateTextFile和OpenTextFile。根据所使用的对象的类型,将方法划分为三类。 (1) 与驱动器有关的方法 与驱动器有关的方法如表5-5所示: 表5-5 与驱动器有关的方法及说明 方 法 说 明 DriveExists(drivespec) 如果在drivespec中指定的驱动器存在,则返回True,否则返回False。drivespec参数可以是一个驱动器字母,或者是文件、文件夹的完整绝对路径 GetDrive(drivespec) 返回drivespec指定的驱动器所对应的Drive对象。drivespec可以包含冒号、路径分隔符或者是网络共享名,即:“C”、“C:”、“C:”及“\machinesharename” GetDriveName(drivespec) 用字符串返回drivespec指定的驱动器的名称。drivespec参数必须是文件或文件夹的绝对路径,或者仅仅是驱动器字母,例如:“c:”或“c” (2) 与文件夹有关的方法 与文件夹有关的方法如表5-6所示: 表5-6 与文件夹有关的方法及说明 方 法 说 明 BuildPath(path,name) 在已有的路径path上增添名字为name的文件或文件夹,如果需要,则增添路径分隔符’’ CopyFolder(source,destination,overwrite) 从指定的源文件夹source(可以包含通配符)中复制一个或多个文件夹到指定的目标文件夹destination,包含了源文件夹中的所有文件。如果source包含通配符或destination末尾是路径分隔符(‘’),那么认为destination是要放置源文件夹的拷贝的文件夹。否则的话,认为destination是要创建的新文件夹的路径名。如果destination文件夹已经存在且overwrite参数设置为False,将产生错误,缺省的overwrite参数是True CreateFolder(foldername) 创建一个路径名为foldername的文件夹。如果foldername已经存在将产生错误 DeleteFolder(folderspec,force) 删除由folderspec指定的一个或多个文件夹(可以在路径的最后部分包含通过配符)及文件夹中的所有内容。如果可选的force参数设置为true,那么即使文件夹包含的文件具有只读属性,也将删除该文件夹。缺省的force参数是False FolderExist(folderspec) 如果folderspec指定的文件夹存在则返回True,否则返回False。folderspec参数可以包含文件夹的绝对或相对路径,或者仅仅是当前文件夹中看到的文件夹名 GetAbsolutePathName(pathspec) 返回明确指定文件夹的路径,其中要考虑到当前文件夹的路径。例如,如果当前文件夹是“c:docssales”,而pathspec是“jan”,返回的字符是“c:docssalesjan”。通配符、”..”和”\”路径操作符都是可以接受的 GetFolder(folderspec) 返回folderspec指定的文件夹对应的Folder对象。folderspec可以是文件夹的相对的或绝对的路径 GetParentFolderName(pathspec) 返回pathspec文件或文件夹的上一级文件夹。不检验该文件夹是否存在 GetSpecialfolder(folderspec) 返回一个特定的Windows文件夹相对应的Folder对象。参数folderspec的允许值是WindowsFolder(0)、SystemFolder(1)和TemporaryFolder(2) MoveFolder(source,destination) 将source指定的一个或多个文件夹移动到destination指定的文件夹。在source里可以包含通配符,但在destination中不行。如果source包含通配符或destination末尾是路径分隔符(‘’),则认为destination是要放置源文件夹的文件夹,否则认为它是一个新文件夹的完整路径和名字。如果目的文件夹destination已经存在则产生错误 (3) 与文件有关的方法 与文件有关的方法如表5-7所示: 方 法 说 明 CopyFile(source,destination, overwrite) 将source(可包含通配符)指定的一个或多个文件复制到指定的目标文件夹destination。如果source包含通配符或destination末尾是路径分隔符(‘’),那么认为destination是文件夹。否则认为destination为一新文件的完全路径和名称。如果目标文件夹已经存在且overwrite参数设置为False,将产生错误。缺省的overwrite参数是True CreateTextFile(filename,overwrite, unicode) 用指定的文件名filename在磁盘上创建一个新的文本文件,并返回与其对应的TextStream对象,如果可选的overwrite参数设置为True,则覆盖同一路径下已有的同名文件。缺省的overwrite参数是False。如果可选的unicode参数设置为True,则该文件的内容将存储为Unicode文本,缺省的unicode参数是False DeleFile(filespec,force) 删除由filespec指定的一个或多个文件(可以在路径的最后部分包含通配符)。如果可选的force参数设置为true,那么也删除具有只读属性的文件。缺省的force参数是False FileExists(filespec) 如果filespec指定的文件存在则返回True,否则返回False。filespec参数可以包含文件的绝对路径或相对路径,或者是当前文件夹中的文件名 GetBaseName(filespec) 返回filespec指定的文件的名称,即包含文件路径但去掉了文件的扩展名 GetExtensionName(filespec) 返回filespec指定的文件的扩展名 GetFile(filespec) 返回filespec指定的文件所对应的File对象。可以指定文件的相对或绝对路径 GetFileName(pathspec) 返回pathspec指定的文件的路径或文件名,如果没有文件名就返回最后的文件夹名。不检查该文件或文件夹是否存在 GetTempName() 返回一个随机产生的文件名,用于完成运算所需的临时文件或文件夹 MoveFile(source,destination) 将source指定的一个或多个源文件移动到destination指定的目的文件夹。在source里可以包含通配符,但destination不行。如果source包含通过配符或destination末尾是路径分隔符(‘’),那么认为destination是一文件夹。否则,认为destination是一新文件夹的完整路径和名称。如果目的文件夹已经存在则产生错误 OpenTextFile(filename,iomode,create, format) 创建一个名叫做filename的文件,或打开一个现有的名为filename的文件,并且返回一个与其相关的TextStream对象。filename参数可以包含绝对或相对路径。iomode参数指定了所要求的访问类型。允许的数值是ForReading(1)(缺省)、ForWriting(2)、ForAppending(8)。当写入或追加到一个不存在的文件时,如果create参数设置为true,就将创建一个新文件。缺省的create参数是False。format参数说明对文件读或写的数据格式。允许数值是:TristatetFalse(0)(缺省),按照ASCII格式打开;TristatetTrue(-1),按照Unicode格式打开;TristateDefault(-2),用系统缺省格式打开 Unicode文件使用两个字节标识每个字符,取消了ASCII字符最多256个的限制。 5.4.2 使用驱动器 下面是使用FileSystemObject对象的简单例子,它使用DriveExists方法得到现有的驱动器字母的列表: ‘ In VBScript Set objFSO = Server.CreateObject(“Scripting.FileSystemObject”) For intCode = 65 To 90 ‘ANSI codes for ‘A’ to ‘Z’ strLetter = Chr(intCode) If objFSO.DriveExists(strLetter) Then Response.Write “Found drive “ & strLetter & “:<BR>” End If Next 1. Folder对象 Driver对象的RootFolder属性返回一个Folder对象,通过该对象可访问这个驱动器内的所有的内容。可以使用这个Folder对象的属性和方法遍历驱动器上的目录,并得到该文件夹和其他文件夹的属性。 (1) Folder对象的属性 Folder对象提供一组属性,可用这些属性得到关于当前文件夹的更多信息,也可以改变该文件夹的名称。其属性及说明如表5-9所示: 表5-9 Folder 对象的属性及说明 属 性 说 明 Attributes 返回文件夹的属性。可以是下列值中的一个或其组合:Normal(0)、ReadOnly(1)、Hidden(2)、System(4)、Volume(名称)(8)、Directory(文件夹)(16)、Archive(32)、Alias(64)和Compressed(128)。例如,一个隐藏的只读文件,Attributes的值为3 DateCreated 返回该文件夹的创建日期和时间 DateLastAccessed 返回最后一次访问该文件夹的日期和时间 DateLastModified 返回最后一次修改该文件夹的日期和时间 Drive 返回该文件夹所在的驱动器的驱动器字母 Files 返回Folder对象包含的Files集合,表示该文件夹内所有的文件 IsRootFolder 返回一个布尔值说明该文件夹是否是当前驱动器的根文件夹 Name 设定或返回文件夹的名字 ParentFolder 返回该文件夹的父文件夹对应的Folder对象 Path 返回文件夹的绝对路径,使用相应的长文件名 ShortName 返回DOS风格的8.3形式的文件夹名 ShortPath 返回DOS风格的8.3形式的文件夹的绝对路径 Size 返回包含在该文件夹里所有文件和子文件夹的大小 SubFolers 返回该文件夹内包含的所有子文件夹对应的Folders集合,包括隐藏文件夹和系统文件夹 Type 如果可能,返回一个文件夹的说明字符串(例如,“Recycle Bin”) (2) Folder对象的方法 Folder对象提供一组可用于复制、删除和移动当前文件夹的方法。这些方法的运行方式与FileSystemObject对象的CopyFolder、DeleFolder和MoveFolder方法相同,但这些方法不要求source参数,因为源文件就是这个文件夹。这些方法及说明如表5-10所示: 表5-10 Folder对象的方法及说明 方 法 说 明 Copy(destination,overwrite) 将这个文件夹及所有的内容复制到destination指定的文件夹。如果destination的末尾是路径分隔符(‘’),那么认为destination是放置拷贝文件夹的一个文件夹。否则认为destination是要创建的新文件夹的路径和名字。如果目标文件夹已经存在且overwrite参数设置为False,将产生错误,缺省的overwrite参数是True Delete(force) 删除文件夹及里面的所有内容。如果可选的force参数设置为True,即使文件夹设置为只读或含有只读的文件,也将删除该文件夹。缺省的force是False Move(destination) 将文件夹及里面所有的内容移动到destination指定的文件夹。如果destination的末尾是路径分隔符(‘’),那么认为destination是放置移动文件夹的一个文件夹。否则认为destination是一个新的文件夹的路径和名字。如果目标文件夹已经存在,则出错 CreateTextFile (filename,overwrite,unicode) 用指定的文件名在文件夹内创建一个新的文本文件,并且返回一个相应的TextStream对象。如果可选的overwrite参数设置为True,将覆盖任何已有的同名文件。缺省的overwrite参数是False。如果可选的unicode参数设置为True,文件的内容将存储为unicode文本。缺省的unicode是False 在文件夹之间可以使用当前文件夹的ParentFolder属性,返回到父目录。当到达一个文件夹时,如果IsRootFolder属性是True,就停下来。离开驱动器的根目录,沿目录树向下,可遍历或访问在Folders集合(由当前文件夹的SubFolders属性返回)内的指定文件夹。 下列程序遍历了驱动器C根目录内的所有文件夹,并显示各个文件夹的有关信息。 VBScript程序如下: 'In VBScript: ' Create a FileSystemObject instance Set objFSO = Server.CreateObject("Scripting.FileSystemObject") ' Get a reference to drive C Set objDriveC = objFSO.GetDrive("C:") ' Get a reference to the root folder Set objRoot = objDriveC.RootFolder ' Get a reference to the SubFolders collection Set objFolders = objRoot.SubFolders ' Get a reference to the first folder in the SubFolders collection For Each objFolder In objFolders Set objFolder1 = objFolders.Item((objFolder.Name)) Exit For Next ' Iterate through all the files in this folder For Each objFile in objFolder1.Files Response.Write "Name: " & objFile.Name & " " Response.Write "ShortName: " & objFile.ShortName & " " Response.Write "Size: " & objFile.Size & " bytes " Response.Write "Type: " & objFile.Type & "<BR>" Response.Write "Path: " & objFile.Path & " " Response.Write "ShortPath: " & objFile.ShortPath & "<BR>" Response.Write "Created: " & objFile.DateCreated & " " Response.Write "LastModified: " & objFile.DateLastModified & "<P>" Next http://www.25175.com/200609/25175/25175_html/2007-12/2591.html
百度博客http://hi.baidu.com/sdink/blog/ 和QQ空间同时更新http://516649425.qzone.qq.com <" CODEPAGE="936"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>JScript读写文件</title> </head> <body> <% /************************************ JScript读写文件 虽然有人说用JScript来做asp的脚本语言是膜拜 但是没有过vb基础的人看上去会很痛苦,正如我 本人,而且个人觉得JScript一点都不比vbScrip t差,几乎asp我能想得出来的JScript也可以搞 定,而且玩过c、c++、java的人就比较清析,有 层次感,冒号结束,大括号语句。 *************************************/ var objFSO, objTextFile,objFolder; var sRead, sReadLine, sReadAll; var ForReading = 1, ForWriting = 2, ForAppending = 8; //创建一个FileSystemObject对象objFSO objFSO = new ActiveXObject("Scripting.FileSystemObject"); //创建一个文本文件在服务器端当前路径下 //,True 表示可覆盖此文件,False 表示 //不可覆盖此文件,默认是 True //并返回供读写此文件的一个 TextStream(文本流) 对象 objTextFile =objFSO.CreateTextFile(Server.MapPath("\HowToDemoFile.txt"), true); //向objTextFile[TextStream(文本流)]写入一行文字 objTextFile.WriteLine("This line is written using WriteLine()."); //写空行为一行,参数为几就空几行 objTextFile.WriteBlankLines(1); // 向 objTextFile[TextStream(文本流)]文件写入指定的文本 objTextFile.Write ("This line is written using Write()."); //关闭objTextFile[TextStream(文本流)] objTextFile.Close(); /********************************************** FileSystemObject对象的方法(也叫函数)OpenTextFile, 打开一个从服务器端当前路径下的HowToDemoFile.txt文件, 以打开文件用于读取数据但是无法向此文件写数据的方式打 开,如果此文件不存在,那么就创建,OpenTextFile涵数原 型:FileSystemObject.OpenTextFile(fname,mode,create, format),fname:必需的。要打开的文件的名称。 mode:可 选的,如何打开文件,1=ForReading - 打开文件用于读取 数据。您无法向此文件写数据。2=ForWriting - 打开 文件用于写数据,8=ForAppending - 打开文件,并向文 件的末尾写数据,create:可选的。设置如果文件名不存 在,是否创建新文件。True 指示可创建新文件,而 F alse 指示新文件不会被创建。False 是默认的。format: 可选的。文件的格式。0=TristateFalse - 以 ASCII 打 开文件。默认,-1=TristateTrue - 以 Unicode 打开文 件。-2=TristateUseDefault - 使用系统默认格式打开文件 并返回可用来访问此文件的 TextStream(文本流) 对象 ***********************************************/ objTextFile = objFSO.OpenTextFile(Server.MapPath("\HowToDemoFile.txt"), ForReading,true); //使用不同的方法来读取文件的内容。 //ReadLine 方法可从 TextStream 文件中读取一整行字符,并以字符串返回结果。 sReadLine = objTextFile.ReadLine(); //Read 方法从 TextStream 文件中读取指定数量的字符,并以字符串返回结果 sRead = objTextFile.Read(4); //ReadAll 方法可读取整个 TextStream 文件,并以字符串返回结果 //此方法不适合大型文件(会浪费内存资源) sReadAll = objTextFile.ReadAll(); //关闭objTextFile[TextStream(文本流)] objTextFile.Close(); //定义一个字符串 var sfolder="sdkin\\"; //创建一个文件夹 objFSO.CreateFolder(Server.MapPath(sfolder)); //移动文件到文件 objFSO.MoveFile(Server.MapPath(")); //拷贝文件,s1是获取文件,Copy函数第二个参数为True 时文件/文件夹可被覆盖为false时则相反,默认是 true var s1=objFSO.GetFile(Server.MapPath("")); s1.Copy(Server.MapPath(") //拷贝文件夹,s1是获取文件夹,Copy函数第二个参数为True 时文件/文件夹可被覆盖为false时则相反,默认是 true var s2=ibjFSO.GetFolder(Server.MapPath(sfolder)); s2.Copy(Server.MapPath("sdkin1\\"),false) %> </body> </html> 下面贴出MS的VBScript和Jscript 帮助页 http://support.microsoft.com/kb/300982/zh-cn http://social.msdn.microsoft.com/Search/zh-CN?query=jscript%20CreateTextFile&ac=8 http://msdn.microsoft.com/zh-cn/default.aspx #Asp http://hi.baidu.com/sdink/item/c3766ff4673137d66325d295
转自:http://blog.csdn.net/zlp321002/article/details/480925 ----系统表---------------------------------------------------------------------------------------------------- 虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL Server 将所有数据库对象的信息均存放在系统表中,作为 SQL Server 的管理、开发人员,了解各个系统表的作用将有助于我们了解 SQL Server 的内在工作原理。 SQL Server 的系统表非常多,其中最常用的与元数据查询有关的表有如下一些: 系统表 描述 syscolumns 存储每个表和视图中的每一列的信息以及存储过程中的每个参数的信息。 syscomments 存储包含每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的原始 SQL 文本语句。 sysconstraints 存储当前数据库中每一个约束的基本信息。 sysdatabases 存储当前服务器上每一个数据库的基本信息。 sysindexes 存储当前数据库中的每个索引的信息。 sysobjects 存储数据库内的每个对象(约束、默认值、日志、规则、存储过程等)的基本信息。 sysreferences 存储所有包括 FOREIGN KEY 约束的列。 systypes 存储系统提供的每种数据类型和用户定义数据类型的详细信息。 将系统存储过程、系统函数、信息架构视图与系统表结合使用,可以方便地让我们获得所有需要的元数据信息。 示例: 1、 获得当前数据库所有用户表的名称。 SELECT OBJECT_NAME (id) FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0 其中主要用到了系统表 sysobjects以及其属性 xtype,还有就是用到了 OBJECTPROPERTY 系统函数来判断是不是安装 SQL Server 的过程中创建的对象。 2、 获得指定表上所有的索引名称 SELECT name FROM sysindexes WHERE id = OBJECT_ID ('mytable') AND indid > 0 ----系统存储过程---------------------------------------------------------------------------------------------------- 系统存储过程 描述 sp_columns 返回指定表或视图的列的详细信息。 sp_databases 返回当前服务器上的所有数据库的基本信息。 sp_fkeys 若参数为带有主键的表,则返回包含指向该表的外键的所有表;若参数为带有外键的表名,则返回所有同过主键/外键关系与该外键相关联的所有表。 sp_pkeys 返回指定表的主键信息。 sp_server_info 返回当前服务器的各种特性及其对应取值。 sp_sproc_columns 返回指定存储过程的的输入、输出参数的信息。 sp_statistics 返回指定的表或索引视图上的所有索引以及统计的信息。 sp_stored_procedures 返回当前数据库的存储过程列表,包含系统存储过程。 sp_tables 返回当前数据库的所有表和视图,包含系统表。 ----系统函数---------------------------------------------------------------------------------------------------- COLUMNPROPERTY 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。 COL_LENGTH 返回指定数据库的指定属性值,如是否处于只读模式等。 DATABASEPROPERTYEX 返回指定数据库的指定选项或属性的当前设置,如数据库的状态、恢复模型等。 OBJECT_ID 返回指定数据库对象名的标识号 OBJECT_NAME 返回指定数据库对象标识号的对象名。 OBJECTPROPERTY 返回指定数据库对象标识号的有关信息,如是否为表,是否为约束等。 fn_listextendedproperty 返回数据库对象的扩展属性值,如对象描述、格式规则、输入掩码等。 ----使用信息架构视图访问元数据--------------------------------------------------------------------------------------------------- 信息架构视图基于 SQL-92 标准中针对架构视图的定义,这些视图独立于系统表,提供了关于 SQL Server 元数据的内部视图。信息架构视图的最大优点是,即使我们对系统表进行了重要的修改,应用程序也可以正常地使用这些视图进行访问。因此对于应用程序来说,只要是符合 SQL-92 标准的数据库系统,使用信息架构视图总是可以正常工作的。 常用的信息架构视图有以下一些: 信息架构视图 描述 INFORMATION_SCHEMA .CHECK_CONSTRAINTS 返回有关列或过程参数的信息,如是否允许空值,是否为计算列等。 INFORMATION_SCHEMA .COLUMNS 返回当前数据库中当前用户可以访问的所有列及其基本信息。 INFORMATION_SCHEMA .CONSTRAINT_COLUMN_USAGE 返回当前数据库中定义了约束的所有列及其约束名。 INFORMATION_SCHEMA .CONSTRAINT_TABLE_USAGE 返回当前数据库中定义了约束的所有表及其约束名。 INFORMATION_SCHEMA .KEY_COLUMN_USAGE 返回当前数据库中作为主键/外键约束的所有列。 INFORMATION_SCHEMA .SCHEMATA 返回当前用户具有权限的所有数据库及其基本信息。 INFORMATION_SCHEMA .TABLES 返回当前用户具有权限的当前数据库中的所有表或者视图及其基本信息。 INFORMATION_SCHEMA .VIEWS 返回当前数据库中的当前用户可以访问的视图及其所有者、定义等信息。 由于这些信息架构都是以视图的方式存在的,因此我们可以很方便地获得并利用需要的信息。 例如,我们要得到某个表有多少列,可以使用以下语句: SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='mytable' ----应用------------------------------------------------------------------------------------------------------------------- --1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype='u' and status>=0 --2:获取某一个表的所有字段 select name from syscolumns where id=object_id(N'表名') --3:查看与某一个表相关的视图、存储过程、函数 select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like N'%表名%' --4:查看当前数据库中所有存储过程 select name as 存储过程名称 from sysobjects where xtype='P' --5:查询用户创建的所有数据库 select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa') 或者 select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 --6:查询某一个表的字段和数据类型 select column_name,data_type from information_schema.columns where table_name = N'表名' --7:获取数据库文件路径 select ltrim(rtrim(filename)) from 数据库名..sysfiles where charindex('MDF',filename)>0 or select ltrim(rtrim(filename)) from 数据库名..sysfiles where charindex('LDF',filename)>0 --8:获取某一个表的基本信息 sp_MShelpcolumns N'表名' --9:获取某一个表的主键、外键信息 exec sp_pkeys N'表名' exec sp_fkeys N'表名' --10:判断某一个表是否存在某一列(字段) if exists(select 1 from syscolumns where id=object_id(N'表名) and name=N'字段') print N'存在' else print N'不存在' 下面给出了一个存储过程,它的作用是自动将当前数据库的用户存储过程加密。 DECLARE @sp_name nvarchar(400) DECLARE @sp_content nvarchar(2000) DECLARE @asbegin int declare @now datetime select @now = getdate() DECLARE sp_cursor CURSOR FOR SELECT object_name(id) FROM sysobjects WHERE xtype = 'P' AND type = 'P' AND crdate < @now AND OBJECTPROPERTY(id, 'IsMSShipped')=0 OPEN sp_cursor FETCH NEXT FROM sp_cursor INTO @sp_name WHILE @@FETCH_STATUS = 0 BEGIN SELECT @sp_content = text FROM syscomments WHERE id = OBJECT_ID(@sp_name) SELECT @asbegin = PATINDEX ( '%AS' + char(13) + '%', @sp_content) SELECT @sp_content = SUBSTRING(@sp_content, 1, @asbegin - 1) + ' WITH ENCRYPTION AS' + SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content)) SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']' EXEC sp_executesql @sp_name EXEC sp_executesql @sp_content FETCH NEXT FROM sp_cursor INTO @sp_name END CLOSE sp_cursor DEALLOCATE sp_cursor 该存储过程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存储过程的 SQL 定义语句,将 AS 修改为了 WITH ENCRYPTION AS,从而达到了加密存储过程的目的。本存储过程在 SQL Server 2000 上通过
分享自 儒雅的男人blog http://www.cnblogs.com/yushaoye201314/archive/2013/04/19/3031203.html 好文,转载收藏 这两天在调用Microsoft.SqlServer.SMO.dll组件 《add login,create,backup,restore database to Sql Server using SMO》,接触到一些数据库的名词定义:登录名,用户,角色,架构,权限,部分新人对几个名词的概念不是很清晰 所以参考部分文档,摘录如下(权当温故⑧^_^): SqlServer2008的安全机制分为四个级别: 1.操作系统的安全性 创建操作系统用户账号(win7): 2.数据库服务器的登录安全性【下面两种验证模式下登录所使用的用户名,即为:登录名定义。】 数据库服务器登录模式分为: ①Windows身份验证模式(如下图) 用户名即是:当前Windows操作系统中的用户账户,我这里是用的管理员账号(计算机名),如果系统账户有登录密码 可以相应的输入 登录成功后,设置SqlServer 验证模式如图: ②混合身份验证模式(Windows身份验证模式&SqlServer身份验证模式[前者安全性比后者高]),如下图: 在安装SQLServer2008时 会默认生成一个登录名:sa,其隶属于服务器角色:sysadmin。 而新创建的登录名,则会自动关联服务器角色:public,除了默认的数据库:master,其他的数据都将没有访问权限,如果想要访问其他数据库: 1.则需要在登录名-新建-用户映射里面勾选相应的数据库:则相应的数据库会自动创建一个同名(登录名)数据库用户账号 (注①:master数据库不勾选也是默认访问的 数据库用户里是没有同名账号。) (注②:当登录名要删除之前 要先手动删除由登录名映射数据库而生成的用户) 2.或者在登录名-新建-服务器角色 中直接勾选sysadmin这样就可以访问所有的数据库(或在服务器角色sysadmin-右击属性-添加-登录名)了:修改服务器角色为 sysadmin 不会在数据库用户里创建同名账号。 以下是数据库服务器的角色列表以及其对应所拥有的操作权限,如下图: 3.数据库的使用安全性 登录名 只能登录进SqlServer服务器,并不能让访问服务器中的数据库,而使用登录名登录进数据库服务器后想要访问特定的数据库 还必须具有数据库用户名,用户名在特定的数据库内创建,并必须关联一个登录名,通过授权给该用户指定可以访问的数据库对象的权限 数据库用户可以新建或者由登录名映射数据库而生成。注:无论是新建的数据库用户 还是由登录名映射数据库生成的数据库用户 都要遵循 数据库用户1:1登录名的规则 创建数据库用户时 需要关联登录名;创建数据库角色是 需要关联使用者 一般选择dbo; dbo(DataBase Owner)是数据库的所有者,拥有数据库中的所有对象,每个数据库都有dbo,sysadmin服务器角色的成员自动映射成dbo,无法删除dbo,且此用户始终出现在每个数据库中。通常 登录名sa映射为数据库用户dbo. 数据库用户的生成需要关联数据库角色:数据库角色有三种:固定数据库角色,用户定义数据库角色,应用程序角色,如下图: 4.数据库对象的使用安全性 我们一般将表,视图,存储过程,函数 统称为数据库对象,而数据库对象包含在架构中,而给角色划分权限也就是开放架构中部分或者全部的对象做相应的执行权限操作, 数据库对象的常用权限 如下图: 权限操作分为三种:授予,拒绝,撤销,语法及代码如下 1 --授予权限操作 2 --语法:Grant {ALL|statement[,,,,n]} TO security_account[,,,n] 3 --授予角色"students_mag"对"studengs"数据库中"stu"表 delete insert update权限 4 use students 5 go 6 grant delete,inster,update 7 on stu 8 to students_msg 9 go 10 --撤销权限操作 11 --语法:revoke {all|statement[,,,n]} from security_account[,,,n] 12 --使用revoke 撤销角色"students_mag"对"studengs"数据库中"stu"表 delete insert update权限 13 use students 14 go 15 revoke delete,insert,update 16 on stu 17 from students_mag CASCADE 18 --拒绝权限操作 19 --deny {all|statement[,,,n]} to security_account[,,,n] 20 --在数据库"students"的"stu"表中执行insert操作的权限授予了public角色,然后拒绝用户guest拥有该项权限 21 use students 22 go 23 grant insert 24 on stu 25 to public 26 go 27 deny insert 28 on stu 29 to guest 在创建或生成数据库用户时 需要关联架构,由登录名映射数据库生成的数据库用户 默认选择了dbo,手动创建数据库用户,则选择dbo,如下图: 针对数据库设置用户/角色权限,如下图: 总结:数据库的安全和权限如下图所示: 操作过程中相关的步骤、用T-SQL语句表示如下: 1.利用系统存储过程sp_addsrvrolemember可将登录名添加到某个固定服务器角色中 语法:exec sp_addsrvrolemember 'login',''role' 2.利用系统存储过程sp_dropsrvrolemember可从固定服务器角色中删除登录名 语法:exec sp_dropsrvrolemember 'login','role' 3.利用系统存储过程sp_srvrolepermission可以浏览固定服务器角色的权限 语法:exec sp_srvrolepermission 'role' 4.使用系统存储过程浏览固定的数据库角色 语法:exec sp_helpdbfixedrole 5.创建用户自定义数据库角色 语法:create role role_name [authorization owner_name] role_name:将要创建的数据库角色名 owner_name:该角色拥有者的名字,必须是当前数据库里的用户或角色,默认为dbo T-Sql:create role 'myRole' 使用存储过程sp_addrolemember给新建数据库角色设置已经存在的数据库角色功能exec sp_addrolemember 'db_datareader','myRole' 使用存储过程sp_droprolemember撤销给新建数据库角色所设置的已存在数据库角色的功能exec sp_droprolemember 'db_datareader','myRole' Proc示例:exec sp_addrole 'testRole','dbo' 5.1.删除用户自定义数据库角色 语法:drop role testRole proc:exec sp_droprole 'testRole' 6.创建数据库服务器登录名 T-Sql:create LOGIN lisi with password='111111' Proc :exec sp_addlogin 'lisi' [,'111111' [,'master']] 7.修改登录名 名称和密码 alter login lisi with name=lisi_new alter login lisi_new with password='abcdef' 8.删除登录名 T-Sql:drop login lisi_new Proc :exec sp_droplogin 'lisi_new' 8.1.禁用登录名 alter login lisi_new disable 8.2.启用登录名 alter login lisi_new enable 9.创建数据库用户 T-Sql语法:create user user_name {for|from} login login_name 示例:use Sales go create user myUser from login lisi_new 9.1.创建带有默认架构的数据库用户 语法:use Sales go create user myUser from login lisi_new with default_schema=HRmanager 10.使用存储过程sp_helpuser查看数据库用户 11.删除数据库用户 T-Sql:drop user user_name Proc :exec sp_dropuser 'user_name' 12.使用存储过程sp_addrolemember给数据库用户设置固定数据库角色功能 语法:exec sp_addrolemember 'role','security_account' 示例:exec sp_addrolemember 'db_datareader','myUser' 13.使用存储过程sp_droprolemember撤销给数据库用户所设置的固定数据库角色功能 语法:exec sp_droprolemember 'role','security_account' 示例:exec sp_droprolemember 'db_datareader','myUser' 总结:关于数据库服务器级的角色管理 与 数据库级角色管理 如下图
约定几个目录 /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php.ini 一,php-fpm的启动参数 #测试php-fpm配置 /usr/local/php/sbin/php-fpm -t /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t #启动php-fpm /usr/local/php/sbin/php-fpm /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf #关闭php-fpm kill -INT `cat /usr/local/php/var/run/php-fpm.pid` #重启php-fpm kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` 二,php-fpm.conf重要参数详解 pid = run/php-fpm.pid #pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log #错误日志,默认在安装目录中的var/log/php-fpm.log log_level = notice #错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice. emergency_restart_threshold = 60 emergency_restart_interval = 60s #表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。 process_control_timeout = 0 #设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0. daemonize = yes #后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。 listen = 127.0.0.1:9000 #fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置. listen.backlog = -1 #backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41 listen.allowed_clients = 127.0.0.1 #允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接 listen.owner = www listen.group = www listen.mode = 0666 #unix socket设置选项,如果使用tcp方式访问,这里注释即可。 user = www group = www #启动进程的帐户和组 pm = dynamic #对于专用服务器,pm可以设置为static。 #如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定: pm.max_children #,子进程最大数 pm.start_servers #,启动时的进程数 pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程 pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0. pm.status_path = /status #FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到 ping.path = /ping #FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。 ping.response = pong #用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong. request_terminate_timeout = 0 #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。 request_slowlog_timeout = 10s #当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off' slowlog = log/$pool.log.slow #慢请求的记录日志,配合request_slowlog_timeout使用 rlimit_files = 1024 #设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。 rlimit_core = 0 #设置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整数. 默认值: 系统定义值. chroot = #启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用. chdir = #设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时) catch_workers_output = yes #重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空. 三,常见错误及解决办法整理 1,request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。 如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时,我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的request_terminate_timeout参数。 request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免"502 Bad Gateway"。解决办法是request_terminate_timeout设置为10s或者一个合理的值,或者给file_get_contents加一个超时参数。 帮助 1 2 3 4 5 6 7 $ctx = stream_context_create(array( 'http' => array( 'timeout' => 10 //设置一个超时时间,单位为秒 ) ) ); file_get_contents($str, 0, $ctx); 2,max_requests参数配置不当,可能会引起间歇性502错误: http://hily.me/blog/2011/01/nginx-php-fpm-502/ pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0. 这段配置的意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动重启该进程。 但是为什么要重启进程呢? 一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。 正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否还存在这个问题。 目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己的实际情况设置这个值,不能盲目地加大。 话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占用量来重启 PHP-CGI 进程,会是更好的一个解决方案。 3,php-fpm的慢日志,debug及异常排查神器: request_slowlog_timeout设置一个超时的参数,slowlog设置慢日志的存放位置,tail -f /var/log/www.slow.log即可看到执行过慢的php过程。 大家可以看到经常出现的网络读取超过、Mysql查询过慢的问题,根据提示信息再排查问题就有很明确的方向了。
1,$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2,$_SERVER["REQUEST_URI"] 说明:访问此页面所需的URI 3,$_SERVER["SCRIPT_NAME"] 说明:包含当前脚本的路径 4,$_SERVER["PHP_SELF"] 说明:当前正在执行脚本的文件名 实例: 1,http://www.biuuu.com/ (直接打开主页) 结果: $_SERVER["QUERY_STRING"] = "" $_SERVER["REQUEST_URI"] = "/" $_SERVER["SCRIPT_NAME"] = "/index.php" $_SERVER["PHP_SELF"] = "/index.php" 2,http://www.biuuu.com/?p=222 (附带查询) 结果: $_SERVER["QUERY_STRING"] = "p=222" $_SERVER["REQUEST_URI"] = "/?p=222" $_SERVER["SCRIPT_NAME"] = "/index.php" $_SERVER["PHP_SELF"] = "/index.php" 3,http://www.biuuu.com/index.php?p=222&q=biuuu 结果: $_SERVER["QUERY_STRING"] = "p=222&q=biuuu" $_SERVER["REQUEST_URI"] = "/index.php?p=222&q=biuuu" $_SERVER["SCRIPT_NAME"] = "/index.php" $_SERVER["PHP_SELF"] = "/index.php" $_SERVER["QUERY_STRING"]获取查询语句,实例中可知,获取的是?后面的值 $_SERVER["REQUEST_URI"] 获取http://www.biuuu.com后面的值,包括/ $_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php $_SERVER["PHP_SELF"] 当前正在执行脚本的文件名 当前url:"http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'] 总结一下,对于QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF,深入了解将有利于我们在$_SERVER函数中正确调用这四个值。通过实例详解$_SERVER函数中QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF掌握四个变量之间的区别。
jqueryuifunction [javascript] view plaincopy jQuery UI Datepicker这个用于日期显示很方便而且提供了多种样式,可以从jQuery UI中选择喜欢的样式和jQuery UI组件随意下载js库,如果只是使用datepicker那么选择时之选UI Core和Widgets中的Datepicker,然后选择喜欢的主题,选择版本,下载即可。 不过下载的jQuery UI库中是没有中文的,我们可以将如下js代码放到一个js文件中,然后在文件中引用即可:jQuery(function($){ $.datepicker.regional['zh-CN'] = { clearText: '清除', clearStatus: '清除已选日期', closeText: '关闭', closeStatus: '不改变当前选择', prevText: '<上月', prevStatus: '显示上月', prevBigText: '<<', prevBigStatus: '显示上一年', nextText: '下月>', nextStatus: '显示下月', nextBigText: '>>', nextBigStatus: '显示下一年', currentText: '今天', currentStatus: '显示本月', monthNames: ['一月','二月','三月','四月','五月','六月', '七月','八月','九月','十月','十一月','十二月'], monthNamesShort: ['一','二','三','四','五','六', '七','八','九','十','十一','十二'], monthStatus: '选择月份', yearStatus: '选择年份', weekHeader: '周', weekStatus: '年内周次', dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], dayNamesMin: ['日','一','二','三','四','五','六'], dayStatus: '设置 DD 为一周起始', dateStatus: '选择 m月 d日, DD', dateFormat: 'yy-mm-dd', firstDay: 1, initStatus: '请选择日期', isRTL: false}; $.datepicker.setDefaults($.datepicker.regional['zh-CN']); }); 注意保存时需要把编码方式选为UTF-8,如果是使用记事本或者Ediplus另存为时可以选择。 $(function() { $.datepicker.setDefaults($.extend({showMonthAfterYear: false}, $.datepicker.regional[''])); $("#datepicker").datepicker($.datepicker.regional['fr']); $("#locale").change(function() { $('#datepicker').datepicker('option', $.extend({showMonthAfterYear: false}, $.datepicker.regional[$(this).val()])); }); });
问题描述:.net网站建设在提交后出现css部分失效,如div位置,字体大小。问题解决:原因是,过去的提示语句我们一律使用了Response.write("<script>alert("***")</script>"),用了.write输出 js脚本.alert等破坏了css 加载。解决办法将Response.write("<script>alert("***")</script>")改换成Page.RegisterStartupScript("Startup","<script>alert("***")</script>").下面贴出msdn上的标准代码<html><head><script language="C#" runat="server">public void Page_Load(Object sender, EventArgs e){if (!this.IsStartupScriptRegistered("Startup")){String scriptString = "<script language=JavaScript> function DoClick() {";scriptString += "showMessage2.innerHTML='<h4>Welcome to Microsoft .NET!</h4>'}";scriptString += "function Page_Load(){ showMessage1.innerHTML=";scriptString += "'<h4>RegisterStartupScript Example</h4>'}<";scriptString += "/";scriptString += "script>";this.RegisterStartupScript("Startup", scriptString);}}</script></head><body topmargin="20" leftmargin="10" onload="Page_Load()"><form id="myForm" runat="server"><span id="showMessage1"></span><br><input type="button" value="ClickMe" onclick="DoClick()"><br><span id="showMessage2"></span></form></body></html> http://beijing.liebiao.com/wangzhanjianshe/46752756.html
客人在我所供职的酒店上网的时候,经常会弹出一个对话框,显示一些提示,如上网的注意事项和消费标准等信息;并且有自己的电影和歌曲服务器,DHCP-server也是其中的一台服务器,宾馆、酒店就是用这台机器,为客户分配IP地址提供上网功能,即客户把自己的计算机连上网线,网卡配置自动获取IP地址,就会从动态主机配置协议(DHCP)服务器分配到一个IP地址;采用DHCP server可以自动为用户设置网络IP地址、掩码、网关、DNS、Wins 等网络参数,简化了用户网络设置,提高了管理效率。 那么我们的问题也出现了:常见的,很多用户抱怨用这种方法上不了网,但不是所有客户都上不了网。经过调查发现,住宾馆、酒店的人绝大多数是商务人员和工程师,他们携带的手提电脑一般安装的是Windows server版本,server版本默认启动了DHCP server功能,当一台这样的计算机连入网络,在他之后的计算机就会把他当成DHCP服务器,并被分配了不正确的IP地址,从而上不了网。 DHCP服务器地址分配方式 DHCP是一种用于简化主机IP配置管理的协议标准。通过采用DHCP标准,可以使用DHCP服务器为网络上所有启用了DHCP的客户端分配、配置、跟踪和更改(必要时)所有TCP/IP设置。此外,DHCP还可以确保不使用重复地址、重新分配未使用的地址,并且可以自动为主机连接的子网分配适当的IP地址。当一个网络中,有2个或2个以上的DHCP服务器时,提醒切勿将DHCP地址池定义的过大,以免多个地址池之间出现"包含于"的关系,或者是部分客户端手工指定的IP地址包含于DHCP服务器的地址池中,从而造成DHCP的一些异常故障。 针对不同的需求,DHCP服务器有三种机制分配IP地址: 自动分配 DHCP服务器给首次连接到网络的某些客户端分配固定IP地址,该地址由用户长期使用; 动态分配 DHCP服务器给客户端分配有时间限制的IP地址,使用期限到期后,客户端需要重新申请地址,客户端也可以主动释放该地址。绝大多数客户端主机得到的是这种动态分配的地址; 手动分配 由网络管理员为客户端指定固定的IP地址。 三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。 每项技术都是有利有弊的,DHCP也不例外,由于DHCP有着配置简单,管理方便的优点,问题也随之产生,由于DHCP的运作机制,通常服务器和客户端没有认证机制,如果网络上存在多台DHCP服务器将会给网络造成混乱。由于用户不小心配置了DHCP服务器引起的网络混乱非常常见,足可见此问题的普遍性。 本人在从事网络工作的几年里,遇到过很多问题,其中有关DHCP-server冲突的不在少数,在解决问题的同时也总结了一些经验,在这里简单介绍一下,与大家分享,希望给在解决此类问题的同行一些帮助,也希望广大高手指出其中的不足和需要改进的地方。 DHCP服务器冲突的解决方法 使用DHCP snooping技术来解决 针对这种DHCP服务器冲突的解决方法有很多,最直接的方法就是贴告示,让入住的客户在上网时关闭Windows的DHCP网络服务,这个选项在‘控制面板',‘管理工具'里的‘DHCP网络服务',进入关闭即可。这里要注意的是,非server版的Windows不用关闭,并且不要把‘控制面板',‘管理工具',‘服务'中的DHCP client给停止了,这样是分配不到地址的。 当然上面的方法比较被动也不合常理,更不便于我们网络的管理,所以还是应该从我们网络本身出发来解决问题。 既然是DHCP的问题,那么我们就用DHCP的技术来解决问题,比较有代表的就是DHCP snooping技术。DHCP snooping技术是DHCP安全特性,通过建立和维护DHCP snooping绑定表过滤不可信任的DHCP信息,这些信息是指来自不信任区域的DHCP信息。DHCP snooping绑定表包含不信任区域的用户mac地址、IP地址、租用期、vlan-id接口等信息。 首先定义交换机上的信任端口和不信任端口,其中信任端口连接DHCP服务器或其他交换机的端口;不信任端口连接用户或网络。不信任端口将接收到的DHCP服务器响应的DHCP ack 和DHCP off报文丢弃;而信任端口将此DHCP报文正常转发,从而保证了用户获取正确的IP地址。具体配置如下:配置中的命令都是以CISCO的设备为基础,但不管是哪个公司的设备,总体设计思想是一致的,不同的可能在命令格式上略有差异,工作人员应该根据具体的实际情况来解决相应的问题。 在全局模式下启动DHCP snooping功能,这个默认是关闭的,而且不是所有设备都支持这个功能,最好先看使用说明。 switch(config)#ip dhcp-snooping 如果有vlan就使用下面的命令来监测具体的vlan switch(config)#ip dhcp-snooping vlan vlan-id 然后定义可信任的端口,默认情况交换机的端口均为不信任端口,通常网络设备接口, TRUNK 接口和连接DHCP服务器的端口定义为可信任端口。 switch(config)#int f0/x switch(config-if)#ip dhcp snooping trust 使用PVLAN技术来解决 有很多二层的技术可以防止DHCP-server冲突的,PVLAN就是其中一个运用比较广的技术。 PVLAN私有局域网(private vlan),在PVLAN的概念里,端口有3种类型:Isolated port,Community port, Promiscuous port;它们分别对应不同的vlan类型:Isolated port属于Isolated PVLAN,Community port属于Community PVLAN,而代表一个Private vlan整体的是Primary vlan,前面两类vlan需要和它绑定在一起,同时它还包括Promiscuous port。在Isolated PVLAN中,Isolated port只能和Promiscuous port,彼此之间不能访问;在Community PVLAN中,vlan与vlan之间都不能访问,同一Community vlan的接口可以互相访问,并且所有Community vlan的接口都可以与Promiscuous port进行通信。利用这项技术,我们可以把上连或连接DHCP服务器的接口定义为Promiscuous port,其他接口分配到Isolated vlan里,这样所有接口都只能与上连或DHCP服务器进行通信,即使有一台机器设为DHCP服务器,其他机器也不会与它产生流量,把它做为服务器。 利用这个技术解决DHCP-server冲突的方法有很多,也很灵活,下面介绍一种比较简单的方法,也是用的比较多的: 首先把交换机配置成transparents模式: switch(config)#vtp mode transparent 顺便可以打开端口的保护功能,它的意思是打开端口保护的端口之间不能访问,但打开保护的端口可以与没有开启此项功能的端口通信,可以根据自己的需求来打开保护功能: switch(config)#int range f0/124 switch(config-if-range)#switchitchport protected 建立isolated vlan和primary vlan,把isolated vlan定义为primary lan的附属vlan,因为要与primary互相访问: switch(config)#vlan 14 switch(config-vlan)private-vlan isolated switch(config)#vlan 44 switch(config-vlan)#private-vlan primary switch(config-vlan)#private-vlan association 14