SQLSERVER游标及循环语句

整理一下,关于游标,MSDN有: 过 Transact-SQL 服务器游标检索特定行。   参数 NEXT 紧跟当前行返回结果行,并且当前行递增为返回行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。 PRIOR 返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。 FIRST 返回游标中的第一行并将其作为当前行。 LAST 返回游标中的最后一行并将其作为当前行。 ABSOLUTE { n | @nvar} 如果 n 或 @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则不返回行。n 必须是整数常量,并且 @nvar 的数据类型必须为 smallint、tinyint 或 int。 RELATIVE { n | @nvar} 如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则返回当前行。在对游标进行第一次提取时,如果在将 n 或 @nvar 设置为负数或 0 的情况下指定 FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为 smallint、tinyint 或 int。 GLOBAL 指定 cursor_name 是指全局游标。 cursor_name 要从中进行提取的打开的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,cursor_name 指的是局部游标。 @ cursor_variable_name 游标变量名,引用要从中进行提取操作的打开的游标。 INTO @variable_name[ ,…n] 允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。   注释 如果 SCROLL 选项未在 ISO 样式的 DECLARE CURSOR 语句中指定,则 NEXT 是唯一支持的 FETCH 选项。如果在 ISO 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项,则支持所有 FETCH 选项。 如果使用 Transact-SQL DECLARE 游标扩展插件,则应用下列规则: 如果指定了 FORWARD_ONLY 或 FAST_FORWARD,则 NEXT 是唯一受支持的 FETCH 选项。 如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 选项,并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个,则支持所有 FETCH […]

龙生   03 Feb 2016
View Details

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

Insert是T-sql中常用语句,Insert INTO table(field1,field2,…) values(value1,value2,…)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。       1.INSERT INTO SELECT语句       语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1       要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:    —1.创建测试表     create TABLE Table1     (         a varchar(10),         b varchar(10),         c varchar(10),         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED         (             a ASC         )     ) ON [PRIMARY]     create TABLE Table2     (         a varchar(10),         c varchar(10),         d int,         CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED         (             a ASC         )     ) ON [PRIMARY]     GO     —2.创建测试数据     Insert into Table1 values('赵','asds','90')     Insert into Table1 values('钱','asds','100')     Insert into Table1 values('孙','asds','80')     Insert into Table1 values('李','asds',null)     GO     select * from Table2     —3.INSERT INTO SELECT语句复制表数据     Insert into Table2(a, c, d) select a,c,5 from Table1     GO     —4.显示更新后的结果     select * from Table2     GO     —5.删除测试表     drop TABLE Table1     drop TABLE Table2       2.SELECT INTO FROM语句       语句形式为:SELECT vale1, value2 into Table2 from Table1       要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:    —1.创建测试表     create TABLE Table1     (         a varchar(10),         b varchar(10),         c varchar(10),         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED         (             a ASC         )     ) ON [PRIMARY]     GO     —2.创建测试数据     Insert into Table1 values('赵','asds','90')     Insert into Table1 values('钱','asds','100')     Insert into Table1 values('孙','asds','80') […]

龙生   02 Feb 2016
View Details

sqlserver 自增ID插入指定数据

注意: 1.set identity_insert只对当前会话生效。 2.set identity_insert 表名 ON 设置后,必须显示指定Id,否则插入错误。如insert into table_name values('111')将报错。    向自增ID插入指定值。 报错:“当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ' ' 中的标识列插入显式值”。    插入语句未显示指定ID。 报错:“仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表' '中的标识列指定显式值”。 from:http://www.cnblogs.com/wanghonghu/p/4093411.html

龙生   02 Feb 2016
View Details

C#实现动态生成Word

1. 一个控制台例子,实现动态生成Word。 首先,添加引用:COM->Microsoft Word 11.0 Object Library。

2. 介绍几篇牛人写的关于操作Word的文章 [分享]一段导出到word模版的代码 http://www.cnblogs.com/goody9807/archive/2005/08/25/222526.html 再谈word2003编程 http://www.cnblogs.com/Andmm/archive/2008/06/18/1224422.html 最近一直在做C#操作office方面的工作!总结一下!Word(二) http://www.cnblogs.com/wngwz/archive/2004/08/19/34678.html C#也能动态生成Word文档并填充数据 http://www.cnblogs.com/qyfan82/archive/2007/09/14/893293.html from:http://www.cnblogs.com/tianzhiliang/archive/2011/07/07/2099800.html

龙生   02 Feb 2016
View Details

C#也能动态生成Word文档并填充数据

引用http://blog.csdn.net/mengyao/archive/2007/09/13/1784079.aspx using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using Microsoft.Office.Interop.Word; namespace WindowsApplication4 {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         private void button1_Click(object sender, EventArgs e)         {             CreateWordFile("c:\\dd.doc");         }         public string CreateWordFile(string CheckedInfo)        {             string message = "";             try             {                 Object Nothing = System.Reflection.Missing.Value;                 Directory.CreateDirectory("C:/CNSI");  //创建文件所在目录                 string name = "CNSI_" + DateTime.Now.ToLongDateString()+".doc";                 object filename = "C://CNSI//" + name;  //文件保存路径                 //创建Word文档                 Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.ApplicationClass();                 Microsoft.Office.Interop.Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);                 //添加页眉                 WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;                 WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader;                 WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");                 WordApp.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐                 WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置                 WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距                 //移动焦点并换行                 object count = 14;                 object WdLine = Microsoft.Office.Interop.Word.WdUnits.wdLine;//换一行;                  WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点                  WordApp.Selection.TypeParagraph();//插入段落                  //文档中创建表格                  Microsoft.Office.Interop.Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);                  //设置表格样式                  newTable.Borders.OutsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleThickThinLargeGap;                  newTable.Borders.InsideLineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;                  newTable.Columns[1].Width = 100f;                  newTable.Columns[2].Width = 220f;                  newTable.Columns[3].Width = 105f;                  //填充表格内容                  newTable.Cell(1, 1).Range.Text = "产品详细信息表";                  newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体                  //合并单元格                  newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));                  WordApp.Selection.Cells.VerticalAlignment = Microsoft.Office.Interop.Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中                  WordApp.Selection.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中                                           //填充表格内容                  newTable.Cell(2, 1).Range.Text = "产品基本信息";                  newTable.Cell(2, 1).Range.Font.Color = Microsoft.Office.Interop.Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色                  //合并单元格                  newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));                  WordApp.Selection.Cells.VerticalAlignment = Microsoft.Office.Interop.Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;                   //填充表格内容                   newTable.Cell(3, 1).Range.Text = "品牌名称:";                   newTable.Cell(3, 2).Range.Text = "BrandName";                   //纵向合并单元格                   newTable.Cell(3, 3).Select();//选中一行                   object moveUnit = Microsoft.Office.Interop.Word.WdUnits.wdLine;                   object moveCount = 5;                   object moveExtend = Microsoft.Office.Interop.Word.WdMovementType.wdExtend;                    WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);                    WordApp.Selection.Cells.Merge();                    //插入图片                    string FileName = @"c:\picture.jpg";//图片所在路径                    object LinkToFile = false;                    object SaveWithDocument = true;                    object Anchor = WordDoc.Application.Selection.Range;                    WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);                     WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度                     WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度                     //将图片设置为四周环绕型                     Microsoft.Office.Interop.Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape(); […]

龙生   02 Feb 2016
View Details

C# Stream 和 byte[] 之间的转换

一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Image img = Image.FromStream(ms); ms.Close(); this.pictureBox1.Image 二. C#中byte[]与string的转换代码 1、System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding(); byte[] inputBytes =converter.GetBytes(inputString); string inputString = converter.GetString(inputBytes); 2、string inputString = System.Convert.ToBase64String(inputBytes); byte[] inputBytes = System.Convert.FromBase64String(inputString); FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); 三. C# Stream 和 byte[] 之间的转换 /// 将 Stream 转成 byte[] public byte[] StreamToBytes(Stream stream) {     byte[] bytes = new byte[stream.Length];     stream.Read(bytes, 0, bytes.Length);     // 设置当前流的位置为流的开始     stream.Seek(0, SeekOrigin.Begin);     return bytes; } /// 将 byte[] 转成 Stream public Stream BytesToStream(byte[] bytes) {     Stream stream = new […]

龙生   02 Feb 2016
View Details

利用Data URL(data:image/jpg;base64,)将小图片生成数据流形式

先看一段代码:

那这些代码是如何生成的咧? 先看下这些代码“data:image/jpg;base64,iVBORw0KGgoAAAANSUhE……” 就是一张图片的Data URL,就是利用base64编码把图片数据翻译成标准ASCII字符。 等同于:

显示结果: Data URL是在本地直接绘制图片,不是从服务器加载,所以节省了HTTP连接,起到加速网页的作用。 语法: data:image/jpg;    声明数据协议及类型名称 base64,               编码形式为base64 /9j/4AAQSkZ……    base64编码结果 最后附上Data URL的生成方法(PHP):

注意:本方法适合于小图片,大图片就不要考虑了,另外IE8以下浏览器不支持这种方法。用这种方法会加重客户端的CPU和内存负担,总之有利有弊。 from:http://www.lvtao.net/dev/php-image-data-url.html

龙生   01 Feb 2016
View Details

使用jquery获取父元素或父节点的方法

jquery获取父元素方法比较多,比如parent(),parents(),closest()这些都能帮你实现查找父元素或节点,下面我们来一一讲解: 先举个例子, 1.<ul class="parent1"> 2.<li><a href="#" id="item1">jquery获取父节点</a></li> 3.<li><a href="#">jquery获取父元素</a></li> 4.</ul>   我们的目的是通过 id 为 item1 的便签a取到 class 为 parent1 的ul元素,有以下几种方法: 1、parent([expr]) 取得一个包含着所有匹配元素的唯一父元素的元素集合。 你可以使用可选的表达式来筛选。 代码如下 1.$('#item1').parent().parent('.parent1'); 2、:parent 匹配含有子元素或者文本的元素 代码如下   1.$('li:parent');  3、parents([expr]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。 代码如下  1.$('#items').parents('.parent1'); 4、closest([expr]) closest会首先检查当前元素是否匹配,如果匹配则直接返回元素本身。如果不匹配则向上查找父元素,一层一层往上,直到找到匹配选择器的元素。如果什么都没找到则返回一个空的jQuery对象。 closest和parents的主要区别是:1,前者从当前元素开始匹配寻找,后者从父元素开始匹配寻找;2,前者逐级向上查找,直到发现匹配的元素后 就停止了,后者一直向上查找直到根元素,然后把这些元素放进一个临时集合中,再用给定的选择器表达式去过滤;3,前者返回0或1个元素,后者可能包含0 个,1个,或者多个元素。 closest对于处理事件委派非常有用。 1.$('#items1').closest('.parent1'); from:http://www.cnblogs.com/weixing/archive/2012/03/20/2407618.html

龙生   01 Feb 2016
View Details

Asp.Net MVC4 之Url路由

先来看下面两个个url,对比一下: http://xxx.yyy.com/Admin/UserManager.aspx http://xxx.yyy.com/Admin/DeleteUser/1001 对于第1个Url,假设它与服务器上的文件有直接的关系,那么服务器在接受客户端请求并将对应的文件传送给客户端。我们大概可以猜到它是对用户管理的一个页面,它的物理文件UserManager.aspx在网站根目录下面的Admin文件夹中。而第2个url,在不知道Mvc路由以及Url重写时,很难猜到这个Url背后具体有些什么,前提条件是基于.Net框架开发的Web项目。 那么在这里,我们引入Asp.Net Mvc Url路由这个概念,也正是本文所要阐述的主题,Url路由模块是负责映射从浏览器请求到特定的控制器动作。 基于上面提到的Url路由以及其作用,我们就大概能猜到第2个Url背后有些啥了。 自然而然的Admin就是控制器了,DeleteUser是控制器里面的动作及Action了,1001就是Action的参数。到这里我们对Url路由有一个简单的认识,那么接着看下面一组url,假设Home是控制器,Index是控制器里面的Action,至于1001或者2345这类数据我们暂且约定为参数: http://xxx.yyy.com http://xxx.yyy.com/Home/1001 http://xxx.yyy.com/Index/1001 http://xxx.yyy.com/Home/Index/1001/2345 http://xxx.yyy.com/System/Home/Index/1001 按照约定,从上面的几组Url中可以看出,有的缺控制器,有的缺Action,有的带有好几个参数,有的又莫名的多出了控制器、Action、参数之外的东西,那么他们能正确的访问吗? 注册路由 在vs2012里面新建一个asp.net mvc4 web 应用程序项目,可以在项目的根目录下App_Start里面看到RouteConfig文件,在这个文件里面就可以添加url路由了。在文件里面可以看到MapRoute 这个方法,它是RouteCollection的扩展方法,并且含有多个重载,下面看看MapRoute方法的参数,这里选参数最多的那个:

从上面的代码片段大概可以看出该方法含有路由名称、路由的Url、默认值、约束、首先查找路由所在的命名空间,该方法是返回对映射路由的引用。不过在RouteConfig文件中我们可以看到添加路由的代码:

稍微分析一下这段代码可以知道,在路由集合里面添加了一个名为"Default"的路由,并且有一个默认的路由指向,指向名称为Home的控制器,并且Action为Index,可以明显的看到这里 "id = UrlParameter.Optional" 的写法,它的意思就是说Action的参数可以不需要用户来指定,可以缺省。 多个参数如何传递 之前在一个QQ群里面见到一兄弟在问,类似这样的Url“http://xxx.yyy.com/Home/Index/1001/2345/tauruswu”在路由里面怎么配置?其实这个也很简单,我们只需要将路由配置、以及Action稍作调整。

这个是调整之后的路由配置,只需要在Url后面再加上"{*catchall}"即可,那么Action调整之后如下

在Action里面定义了一个参数"catchall"用来接收Url中除了Id之外其他所有的参数值,那么上面那个Url中接收的参数就是“2345/tauruswu”,这样看起来好不好了,不过我觉得怪怪的,有没有更好的解决方法了?Url有必要写成那么长吗?这个问题在后续文章中会涉及到。 你也许会犯的错误 不知各位兄弟在刚刚接触MVC的时候,有没有碰到过这样的问题,如下图 那么这个错误是如何引起的了?代码是这么写的

我们再看英文提示大概就是说匹配出了多个控制器为"Home"的类型,在它的提示中也告诉了我们解决方法,说在MapRoute方法中使用"namespaces"这个参数,我们先将这个放在一边,将抛出这个错误的源码给找出来,具体的源码在DefaultControllerFactory这个类中,看类名就能猜出它的作用是什么了。

上面标粗的代码的意思是说优先解析“MvcDebug.Controllers.Tauruswu”这个命名空间里面的控制器。 路由约束 对于路由约束,我个人觉得这个可能在实际开发中用的不是很多,既然MapRoute方法提供了constraints这个参数及约束,那么在某些特定的场合肯定能发挥它的作用。在MVC中提供了三种路由约束方案,分别是: 1)正则表达式 ,2)http方法 ,3)自定义约束 。下面我们分别介绍下这三种约束的使用方法。 1)正则表达式 ,在路由配置中,我们做了这样的规则,只匹配Controller名称以H开头的

2) http方法 ,我们将路由配置稍作修改

然后在对应的Action上面打个标记

你们说这样行不行了? 3) 自定义约束,如果说上面两种需求还是不能满足你,那么我们可以自定义约束。我们翻看HttpMethodConstraint这个类,可以看到它是继承IRouteConstraint这个接口,其定义是

里面只有一个布尔类型的方法,关于这个例子,是从网上借鉴过来的,如下

这段代码的意思就是检查客户端请求的UserAgent属性值,看它是否含有一个被传递给构造函数的值。那么我们将路由作如下修改

很显然,这个只能在IE游览器下面游览。 如何创建自定义路由处理程序 在翻阅MapRoute方法源码的时候,看到了这么一段

在Route实例化的时候,它是用到了“MvcRouteHandler“这个类,该类继承”IRouteHandler“接口,如果我们不用系统里面已经定义好的路由处理方案,我们要自己来实现一套?改怎么下手,此时只需要继承”IRouteHandler“这个接口并实现”GetHttpHandler“方法即可。 最后在添加路由时,像这样操作

当我们在游览器里面请求/DemoUrl这个地址时,就会用到我们自定义的处理程序,在实际开发当中,如果真的要用到自定义路由处理程序,那么我们就要实现很多原本框架所实现的空能,虽然这给我们带来了很大的扩展空间,但是又不可控。 总结 Url路由系统是通过请求地址进行解析从而得到以目标Controller/Action名称为核心的路由数据,Url路由系统是建立在Asp.net 之上,我们在调试System.Web.Routing的源码时候可以得知。在这里我们由浅入深的了解了路由系统,接下来我们会讲到控制器以及Action,也是最为核心的东西。   转发处:http://www.cnblogs.com/wucj/p/3113878.html

龙生   20 Jan 2016
View Details
1 276 277 278 432