SQLServer 数据库应用专题

知识博客专集

微软SQL Server数据库的两种请求游标


  【it168 技术】游标(cursor)是系统为用户开设的一个数据缓冲区,存放sql语句的执行结果。每个游标区都有一个名字。用户可以用sql语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。

  关系数据库中的操作会对整个行集起作用。由 select 语句返回的行集包括满足该语句的 where 子句中条件的所有行。这种由语句返回的完整行集称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。

  游标通过以下方式来扩展结果处理:

  允许定位在结果集的特定行。

  从结果集的当前位置检索一行或一部分行。

  支持对结果集中当前位置的行进行数据修改。

  为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。

  提供脚本、存储过程和触发器中用于访问结果集中的数据的 transact-sql 语句。

  请求游标

  microsoftsql server 支持两种请求游标的方法:

  transact-sql

  transact-sql 语言支持在 iso 游标语法之后制定的用于使用游标的语法。

  数据库应用程序编程接口(api)游标函数

  sql server 支持以下数据库 api 的游标功能:

  ado(microsoft activex 数据对象)

  ole db

  odbc(开放式数据库连接)

  应用程序不能混合使用这两种请求游标的方法。已经使用 api 指定游标行为的应用程序不能再执行 transact-sql declare cursor 语句请求一个 transact-sql 游标。应用程序只有在将所有的 api 游标特性设置回默认值后,才可以执行 declare cursor。

  如果既未请求 transact-sql 游标也未请求 api 游标,则默认情况下 sql server 将向应用程序返回一个完整的结果集,这个结果集称为默认结果集。

  游标进程

  transact-sql 游标和 api 游标有不同的语法,但下列一般进程适用于所有 sql server 游标:

  1、将游标与 transact-sql 语句的结果集相关联,并且定义该游标的特性,例如是否能够更新游标中的行。

  2、执行 transact-sql 语句以填充游标。

  3、从游标中检索您想要查看的行。从游标中检索一行或一部分行的操作称为提取。执行一系列提取操作以便向前或向后检索行的操作称为滚动。

  4、根据需要,对游标中当前位置的行执行修改操作(更新或删除)。

  5、关闭游标。

SQL Server数据转换服务小妙招


  导读:sql server数据迁移的知识之前已经为大家介绍了很多,比如sql server数据库迁移方法,接下来就为大家详细介绍sql server数据迁移至云端应用技巧,以方便大家在以后的实际工作中做好sql server数据库的迁移工作。

  微软的sql azure并不完全支持sql server 2005或sql server 2008的所有功能,因此,在数据转移的时候必须十分小心。目前sql azure也还没有提供任何管理工具(除了sql server management studio,当然不能完全靠它的object explorer来做转移)做这类的管理作业,微软在codeplex网站上有一个sql azure migration wizard的工具,到是十分适合采用(这部分我们稍后会提到)。

  将既有的数据库数据转换到sql azure上面,或是把sql azure上面的数据转下来,这都牵扯到数据的输入和输出。如果我们单单针对将数据输入和输出的作法来看,对天天在处理数据库的行家而言,这并不是甚么新鲜的事了,方法也很多,而传统的大批数据转换的做法也大都能适用,例如:

  运用sql server提供bcp工具程序(请参考msdnlibray的bcp utility)。

  用ssis(sql integration server service,使用visual studio2008)。

  运用odbc and ado.net 提供的api 功能。

  另外,微软的sync framework也是一个好选择。这一点我们会在稍后作说明。

  云端解决方法

  每次读取一次记录然后再写入一次记录,还不如一次性读入一堆数据放置在云端,然后再以本地的方式做大笔数量的写入。

  

 

  图1 使用worker role做bulk传送

  如图1所示,基于这个原理运用web role作为用户的接口负责读取上传的数据,并将数据放入blobs中,然后产生jobs的工作项。至于worker role的部分则一直负责观察jobs的工作项目,一旦有工作项目进入到blobs中,就会把数据读出来,再运用bcp的工具程序一次性写入到目标数据库中,完成一个jobs的工作。

  使用blobs

  我们使用blobs是因为它被设计来储存大量的文字及二进制数据格式。非常简单的读取方式,让我们只要运用rest api就能上传、管理、组织及维护这些数据。blobs有三种资源,分别是account、containers及blobs,它的架构观念简洁且存取容易,因此很容易被拿来再运用。所谓的拿来再运用并非空穴来风,其实它在设计之初就有这个预先的计划,提供非结构化的二进制的庞大存储器;让它具有不受任何限制的基础,可以被用来储存任何数据或索引。blobs有二种,block blob能存储最高200gb的数据,而page blob能支持最高1tb的数据,主要用于随机读写用。例如windows azure xdrive就是运用page blob做出来的一块类似ntfs格式硬盘的仿真装置,相当能够吸引哪些熟悉文件系统的人来使用它。

  sql azure 的存取方式

  sql azure采用db service的方式,与amazon web services的simple db类似,可以只用database的service(不过存取的命令就不同了,simple db是透过web rest或soap接口,而sql azure则是透过ole db/odbc/ado.net,并透过t-sql语法来做存取)。与google app engine的存取模式不同,google app engine内建的database不能单独存取,只能透过部署在app engine上面的application进行存取。

  既然可以进行独立存取,便可运用microsoft cloud computing开发web application,那样将会有两种模式:

  (1)web application部署在windows azure,并由sql azure提供database services。

  (2)web application部署在自家环境,并由sql azure提供database services。

  然而,不管使用哪一种模式,web application都是透过传统sql server的1433 port来存取sql azure。

  因此,若是web application or developer在防火墙里面对外的联机被管制的话,那么使用上述第一个模式会是比较方便开发。

  不管采用哪一种connecting string,简单来说,该services就是listen 在tcp:servername.ctp.database.windows.net:1433这个位置。

  上文中介绍到的sql server数据迁移至云端应用技巧并不是万能的,可能在有些情况下就不适用,希望大家灵活掌握,灵活运用,为以后的数据库迁移工作带来方便。

在asp.net中备份还原SQL Server数据库


在web中,安全性主要体现在两个方面:一个是程序安全性,即防止网页在插入恶意代码;另一个是数据库安全性,这个我们可以经常备份数据库来实现。

  在文中,我将演示如果在网页中备份和恢复数据库。

  其实备份和恢复数据库都是利用sql server提供的sql语句来备份的。

  备份:use master;backup database @name to disk=@path;

  恢复:use master;restore database @name from disk=@path;

  上面用的是参数化sql语句,可以在程序执行的时候动态给参数赋值。

  代码:

<%@ page language=\”c#\” autoeventwireup=\”true\” codefile=\”databaseaction.aspx.cs\” inherits=\”databaseaction\” %>
<!doctype html public \”-//w3c//dtd xhtml 1.0 transitional//en\” \”http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd\”>
<html xmlns=\”http://www.w3.org/1999/xhtml\” >
<head runat=\”server\”>
  <title>无标题页</title>
</head>
<body>
  <form id=\”form1\” runat=\”server\”>
  <div>
  <table border=\”0\” width=\”100%\”>
  <tr><td colspan=\”2\”>数据库还原和备份</td></tr>
  <tr><td>请选择数据库</td><td>
    <asp:dropdownlist id=\”ddldatabaselist\” runat=\”server\”>
    </asp:dropdownlist></td></tr>
  <tr><td>
    数据库文件名</td><td>
    <asp:textbox id=\”txtdbfilename\” runat=\”server\”></asp:textbox></td></tr>
  <tr><td>
    操作选项</td><td>
    <asp:radiobutton id=\”rbbackup\” runat=\”server\” checked=\”true\” groupname=\”action\” text=\”备份\” />
    <asp:radiobutton id=\”rbrestore\” runat=\”server\” groupname=\”action\” text=\”还原\” /></td></tr>
    <tr><td>
    操作</td><td>
       <asp:button id=\”btnok\” runat=\”server\” onclick=\”btnok_click\” text=\”执行\” /></td></tr>
  </table>
  </div>
  </form>
</body>
</html>

后台代码:

using system;
using system.data;
using system.configuration;
using system.collections;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.data.sqlclient;
/// <summary>
/// 功能说明:本例中演示在asp.net中如何备份和恢复数据库
/// 备份数据库主要使用数据库的备份语句。数据库备份文件放在
/// app_data文件夹下。
/// 作者:周公
/// 日期:2008-08-19
/// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/08/19/2796077.aspx
/// </summary>
public partial class databaseaction : system.web.ui.page
{
  protected void page_load(object sender, eventargs e)
  {
    if (!page.ispostback)
    {
      //在dropdownlist中绑定所有数据库
      sqlconnection connection = new sqlconnection(\”data source=zhoufoxcn;user id=sa;password=sa\”);
      sqlcommand command = new sqlcommand(\”sp_helpdb\”, connection);
      command.commandtype = commandtype.storedprocedure;
      connection.open();
      sqldatareader reader = command.executereader();
      ddldatabaselist.datasource = reader;
      ddldatabaselist.datatextfield = \”name\”;
      ddldatabaselist.databind();
      reader.close();
      connection.close();
    }
  }
  protected void btnok_click(object sender, eventargs e)
  {
    string dbfilename = txtdbfilename.text.trim();
    sqlconnection connection = new sqlconnection(\”data source=zhoufoxcn;user id=sa;password=sa\”);
    string dbname = ddldatabaselist.selectedvalue;
    if (!dbfilename.endswith(\”.bak\”))
    {
      dbfilename = \”.bak\”;
    }
    if (rbbackup.checked)//备份数据库
    {
      sqlcommand command = new sqlcommand(\”use master;backup database @name to disk=@path;\”,connection);
      connection.open();
      string path=server.mappath(\”~app_data\”) \”\” dbfilename;
      command.parameters.addwithvalue(\”@name\”, dbname);
      command.parameters.addwithvalue(\”@path\”, path);
      command.executenonquery();
      connection.close();
    }
    else//恢复数据库
    {
      sqlcommand command = new sqlcommand(\”use master;restore database @name from disk=@path;\”, connection);
      connection.open();
      string path = server.mappath(\”~app_data\”) \”\” dbfilename;
      command.parameters.addwithvalue(\”@name\”, dbname);
      command.parameters.addwithvalue(\”@path\”, path);
      command.executenonquery();
      connection.close();
    }
  }
}

  以上代码在windowsxp visualstudio2005 sql server2000下测试通过

一些常用的SQL语句


学习sql数据库,sql语句是一定都需要掌握的,下文为您介绍了一些经常会用到的sql语句,希望对您学习sql数据库有些许的帮助。

新建约束:
alter table [表名] add constraint 约束名 check ([约束字段] <= \\\’2000-1-1\\\’)

删除约束:
alter table [表名] drop constraint 约束名

新建默认值
alter table [表名] add constraint 默认值名 default \\\’51windows.net\\\’ for [字段名]

删除默认值
alter table [表名] drop constraint 默认值名

删除sql server 中的日志,减小数据库文件大小
dump transaction 数据库名 with no_log
backup log 数据库名 with no_log
dbcc shrinkdatabase(数据库名)
exec sp_dboption \\\’数据库名\\\’, \\\’autoshrink\\\’, \\\’true\\\’

\\\\\\\’添加字段通用函数
sub addcolumn(tablename,columnname,columntype)
conn.execute(\\\”alter table \\\”&tablename&\\\” add \\\”&columnname&\\\” \\\”&columntype&\\\”\\\”)
end sub

\\\\\\\’更改字段通用函数
sub modcolumn(tablename,columnname,columntype)
conn.execute(\\\”alter table \\\”&tablename&\\\” alter column \\\”&columnname&\\\” \\\”&columntype&\\\”\\\”)
end sub

\\\\\\\’检查表是否存在

sql=\\\”select count(*) as dida from sysobjects where id = object_id(n\\\’[所有者].[表名]\\\’) and objectproperty(id, n\\\’isusertable\\\’) = 1\\\”

set rs=conn.execute(sql)

response.write rs(\\\”dida\\\”)\\\’返回一个数值,0代表没有,1代表存在

判断表的存在:
select * from sysobjects where id = object_id(n\\\’[dbo].[tablename]\\\’) and objectproperty(id, n\\\’isusertable\\\’) = 1

某个表的结构
select * from syscolumns where id = object_id(n\\\’[dbo].[你的表名]\\\’) and objectproperty(id, n\\\’isusertable\\\’) = 1

以上就是常见sql语句的介绍。

教你如何在SQL Server数据库中加密数据


导读:为了防止某些别有用心的人从外部访问sql server数据库,盗取sql server数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建sql server数据库驱动的解决方案时,我们首先需要考虑的的第一条设计决策就是如何加密存储sql server数据,以此来保证它的安全,免受被他人窥测。

sql server数据库中有哪一种支持可以用于加密对象和数据?从一开始就讨论一下sql server数据库欠缺什么是明智的,或者是对于sql server数据库中的加密部分你不应该做什么。

首先,sql server数据库有两个内置的密码函数——即,pwdencrypt() 和 pwdcompare()。同时,还有两个sql server数据库用来管理密码哈希的没有正式记录的函数:pwdencrypt() 将密码哈希过后进行存储; pwdcompare()将提供的字符串与哈希后的字符串进行比较。不幸的是,这个哈希函数不是非常安全,它可以通过字典攻击算法被破解(类似命令行应用程序!)。

这些函数随着sql server的版本发展而不断进行修改,这也是另一个没有使用它们的原因。早期版本的sql server对密码进行的哈希,在后来的版本中无法解密,所以如果你依赖一个版本中的函数,那么当升级的时候,所有你的加密数据就都没有用了,除非你可以首先对其解密——这也就违背了加密的最初的目的。

第二,你可能会尝试去创建一个针对你的数据库的自制的加密解决方案,但是有以下三个理由说明你不要这样做:

除非你是加密专家,否则胡乱编写的加密系统只会提供非常低级的价值不高的保护。新鲜的是,单向密码哈希或者 "rotx "形式的加密几乎不需要费事就可以被轻松打败。

如果由于你自己的能力的缺乏而导致加密被破解,那么你的数据就完蛋了。你需要将所有的东西进行没有加密的备份,是吗?(即使你加密了,那里有没有安全漏洞?)

当市面上提供有专业级别的,具有工业强度的加密解决方案的时候,你就不值得花费时间去自己做。把你的时间用于构建一个好的,坚固的数据库,而不是再重新发明一次车轮。

那么,什么才是好的加密数据的方式呢?

对于新手,微软提供了一个自己生成的加密解决方案,cryptoapi 。对于轻量级的加密,军用级别的安全就不在考虑范围之内,它具有相对容易实现的优势:管理员可以安装一个名为capicom 的activex 控制,它可以在t-sql存储过程中提供cryptoapi 功能。capicom 支持各种类型的双向加密和单向哈希算法,所以管理员可以挑选最适合应用程序的问题的部分。

如果你对使用微软的解决方案不感兴趣,还有一些很好的第三方的方案可以使用。一家名为activecrypt 的软件有限责任公司制造了xp_crypt ,它是sql server的插件,可以在视图、程序和触发器中通过扩展存储过程和用户自定义函数(在sql server 2000中)来完成加密。你可以下载一个支持无线的md5,des ,以及sha1哈希的免费版本的应用程序; 其他的加密模型就是在比特深度上进行的。(完全版本是无限的。)在你自己的代码中,你可以使用xp_crypt,与activex 控制一样(在受限的免费版本中)。对于asp程序员来说,一个名为aspencrypt 的组件提供了一种将高级加密整合到你的代码中的简单方式。

对数据库文件自身进行加密或者提供传输层上的安全保护怎么样?对于前者,大家可以在windows系统中持续使用加密文件系统。然而,你必须保存加密密钥的备份,在出现问题的时候,这个数据有可能会丢失。对于后者,有ipsec和sql server自己的ssl加密,都是sql server和windows自带的大家的主要精力应该放在避免以明文存储敏感数据,因为从数据库中抽取没有加密的数据同样是最容易受到攻击的薄弱环节。

sql server数据库的安全防护工作时很重要的,希望大家能从上文中学到保障sql server数据库安全的方法,做好sql server数据库的安全工作,确保sql server数据库中数据库信息的绝对安全。

SQL中创建唯一约束使数据列中没有重复值


       笔者今天在做一个网站应用时,发现会员在后台可以把同一个名称往同一个数据表字段里添加,在程序里明明有限制,但这种问题还是出现了,怎么办?还是在数据的源头下手吧!远程连接上数据库,在数据关系图里添加了此表,右键此表->属性->索引/键->新建->在\”列名\”中添加指定列,选择\”创建 unique\”,选择\”约束\”,关闭表,保存关系图即完成限制,大功告成!

 

以下内容为网上转载:

1、创建唯一约束
  创建唯一约束来确保不参与主键的特定列的值不重复。尽管唯一约束和主键都强制唯一性,但在下列情况下,应该为表附加唯一约束以取代主键约束:
  
  如果要对列或列的组合强制唯一性。可以为表附加多个唯一约束,而只能为表附加一个主键约束。
   
  如果要对允许空值的列强制唯一性。可以为允许空值的列附加唯一约束,而只能将主键约束附加到不允许空值的列。当将唯一约束附加到允许空值的列时,确保在约束列中最多有一行含有空值。

  创建唯一约束
  
  i、在数据库关系图中右击将包含约束的表,然后从快捷菜单中选择\”属性\”命令。
  -或-  
  为将包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择\”属性\”命令。
  
  ii、选择\”索引/键\”选项卡。
    
  iii、选择\”新建\”命令。系统分配的名称出现在\”索引名\”框中。
    
  iv、在\”列名\”下展开列的列表,选择要将约束附加到的列。若要将约束附加到多个列,在后续行中选择其它的列。
  
  v、选择\”创建 unique\”复选框。
    
  vi、选择\”约束\”选项。
  当保存表或关系图时,唯一约束即创建在数据库中。
  
  如果使用的是 sql server,可以控制键值的排序次序以及当存在重复键时所采取的操

作。为此,应创建唯一索引取代唯一约束。
  
  2、修改唯一约束
  
  当要更改约束附加到的列、更改约束名称或设置附加属性时,修改唯一约束。
  
  修改唯一约束
  
  i、在数据库关系图中右击包含约束的表,然后从快捷菜单中选择\”属性\”命令。
  -或-
  为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择\”属性\”命令。
  
  ii、选择\”索引/键\”选项卡。
  
  iii、从\”选定的索引\”列表中选择要更改的约束。
  
  iv、完成下表中的操作:
   

  当保存表或关系图时,约束即在数据库内被更新。
  
  3、删除唯一约束
  当要删除对包含在约束表达式中的列或列组合中输入值的唯一性要求时,删除唯一约束。
  
  删除唯一约束
  i、在数据库关系图中,右击包含约束列的表,然后从快捷菜单中选择\”索引/键\”命令。
  -或-
    为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择\”索引/键\”命令。
  ii、从\”选定的索引\”列表中选择唯一约束。
  iii、选择\”删除\”按钮。
  注意 选择\”删除\”按钮将导致一个无法撤消的操作,而且不保存对数据库关系图所做的所有其它更改。若要撤消该操作,不保存更改即关闭当前的数据库关系图或表设计器窗口以及所有其它打开的数据库关系图和表设计器窗口。
   
  当保存表或关系图时,约束即从数据库中被删除。

sql两个时间相减 DateDiff()


sql中datediff的用法

datediff
返回跨两个指定日期的日期和时间边界数。

语法
datediff ( datepart , startdate , enddate )

参数
datepart

是规定了应在日期的哪一部分计算差额的参数。下表列出了 microsoft? sql server? 识别的日期部分和缩写。

日期部分 缩写
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
hour hh
minute mi, n
second ss, s
millisecond ms

startdate

是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果您只指定年份的最后两位数字,则小于或等于\”两位数年份截止期\”配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。

enddate

是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

返回类型
integer

注释
startdate 是从 enddate 减去。如果 startdate 比 enddate 晚,返回负值。

当结果超出整数值范围,datediff 产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。

计算跨分钟、秒和毫秒这些边界的方法,使得 datediff 给出的结果在全部数据类型中是一致的。结果是带正负号的整数值,其等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。

示例
此示例确定在 pubs 数据库中标题发布日期和当前日期间的天数。

use pubs
go
select datediff(day, pubdate, getdate()) as no_of_days
from titles
go
======================================

datediff(d,預計落香港期,getdate())

SQL server 2008中,不能对已经建好的表的数据结构进行更改


 sql server中,不能对已经建好的表的数据结构进行更改,并提示: 启用了“阻止保存要求重新追寻表的更改”选项;

解决方案:执行如下操作:

工具-选项-designers-表设计器和数据库设计器。在右边的“表选项”框中,将“阻止保存要求重新创建表的更改”复选框中的勾去掉。单击“确定”就可以了!

SQL字符串处理函数大全


sql字符串处理函数大全

select语句中只能使用sql函数对字段进行操作(链接sql server),
select 字段1 from 表1 where 字段1.indexof(\”云\”)=1;
这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。
left()是sql函数。
select 字段1 from 表1 where charindex(\’云\’,字段1)=1;

字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于char、varchar、 binary、 和varbinary 数据类型以及可以隐式转换为char 或varchar的数据类型。可以在select 语句的select 和where 子句以及表达式中使用字符串函数。
常用的字符串函数有:

一、字符转换函数
1、ascii()
返回字符表达式最左端字符的ascii 码值。在ascii()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
2、char()
将ascii 码转换为字符。如果没有输入0 ~ 255 之间的ascii 码值,char() 返回null 。
3、lower()和upper()
lower()将字符串全部转为小写;upper()将字符串全部转为大写。
4、str()
把数值型数据转换为字符型数据。
str (<float_expression>[,length[, <decimal>]])
length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10, decimal 缺省值为0。
当length 或者decimal 为负值时,返回null;
当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数小于length ,左边补足空格。
二、去空格函数
1、ltrim() 把字符串头部的空格去掉。

2、rtrim() 把字符串尾部的空格去掉。

三、取子串函数
1、left()
left (<character_expression>, <integer_expression>)
返回character_expression 左起 integer_expression 个字符。

2、right()
right (<character_expression>, <integer_expression>)
返回character_expression 右起 integer_expression 个字符。

3、substring()
substring (<expression>, <starting_ position>, length)
返回从字符串左边第starting_ position 个字符起length个字符的部分。

四、字符串比较函数
1、charindex()
返回字符串中某个指定的子串出现的开始位置。
charindex (<’substring_expression’>, <expression>)
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
此函数不能用于text 和image 数据类型。
2、patindex()
返回字符串中某个指定的子串出现的开始位置。
patindex (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。
与charindex 函数不同的是,patindex函数的子串中可以使用通配符,且此函数可用于char、 varchar 和text 数据类型。

五、字符串操作函数
1、quotename()
返回被特定字符括起来的字符串。
quotename (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
2、replicate()
返回一个重复character_expression 指定次数的字符串。
replicate (character_expression integer_expression) 如果integer_expression 值为负值,则返回null 。

3、reverse()
将指定的字符串的字符排列顺序颠倒。
reverse (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。

4、replace()
返回被替换了指定子串的字符串。
replace (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。

4、space()
返回一个有指定长度的空白字符串。
space (<integer_expression>) 如果integer_expression 值为负值,则返回null 。

5、stuff()
用另一子串替换字符串指定位置、长度的子串。
stuff (<character_expression1>, <start_ position>, <length>,<character_expression2>)
如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回null 值。
如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。
六、数据类型转换函数
1、cast()
cast (<expression> as <data_ type>[ length ])

2、convert()
convert (<data_ type>[ length ], <expression> [, style])

1)data_type为sql server系统定义的数据类型,用户自定义的数据类型不能在此使用。
2)length用于指定数据的长度,缺省值为30。
3)把char或varchar类型转换为诸如int或samllint这样的integer类型、结果必须是带正号或负号的数值。
4)text类型到char或varchar类型转换最多为8000个字符,即char或varchar数据类型是最大长度。
5)image类型存储的数据转换到binary或varbinary类型,最多为8000个字符。
6)把整数值转换为money或smallmoney类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。
7)bit类型的转换把非零值转换为1,并仍以bit类型存储。
8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“ ”,以标识发生了这种截断。
9)用convert()函数的style 选项能以不同的格式显示日期和时间。style 是将datatime 和smalldatetime 数据转换为字符串时所选用的由sql server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。
七、日期函数
1、day(date_expression)
返回date_expression中的日期值

2、month(date_expression)
返回date_expression中的月份值

3、year(date_expression)
返回date_expression中的年份值

4、dateadd()
dateadd (<datepart>, <number>, <date>)
返回指定日期date 加上指定的额外日期间隔number 产生的新日期。
5、datediff()
datediff (<datepart>, <date1>, <date2>)
返回两个指定日期在datepart 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的整数值。

6、datename()
datename (<datepart>, <date>)
以字符串的形式返回日期的指定部分此部分。由datepart 来指定。

7、datepart()
datepart (<datepart>, <date>)
以整数值的形式返回日期的指定部分。此部分由datepart 来指定。
datepart (dd, date) 等同于day (date)
datepart (mm, date) 等同于month (date)
datepart (yy, date) 等同于year (date)

8、getdate()
以datetime 的缺省格式返回系统当前的日期和时间

无法向会话状态服务器发出会话状态请求 错误的解决方法


错误如下:   
   异常详细信息:    system.web.httpexception:    无法向会话状态服务器发出会话状态请求。请确保已启动    asp.net    state    service,并且客户端和服务器端口是相同的。如果服务器位于远程计算机上,请检查    hkey_local_machine\\system\\currentcontrolset\\services\\aspnet_state\\parameters\\allowremoteconnection    的值,确保服务器接受远程请求。   
    
   源错误:     
    
   执行当前    web    请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。   
    
原因分析:
web.config中配置sessionstate的mode为stateserver,但服务器没有开启改个服务。
解决方法:
1.web.config里面 把sessionstate 的mode改为\”inproc\”   ;
2.在服务中启用\”asp.net state service\”
这样是可以了,但没有理解为什么要这么做。后来在网上找了一上才知道真真的原因。
session模型简介
  session是什么呢?简单来说就是服务器给客户端的一个编号。当一台www服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台www服务器建立连接时,他就与这个服务器建立了一个session,同时服务器会自动为其分配一个sessionid,用以标识这个用户的唯一身份。这个sessionid是由www服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。
  这个唯一的sessionid是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的sessionid自动附加在http头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给sessionid所对应的用户。试想,如果没有sessionid,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,sessionid还有很多其他的作用,我们会在后面提及到。
  除了sessionid,在每个session中还包含很多其他信息。但是对于编写asp或asp.net的程序与来说,最有用的还是可以通过访问asp/asp.net的内置session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入:
<%
if session(\”pageviewed\”) = \”\”then
 session(\”pageviewed\”) = 1
else
 session(\”pageviewed\”) = session(\”pageviewed\”) 1
end if
%>
  通过以下这句话可以让用户得知自己浏览了几个页面:
<%
response.write(\”you have viewed \” & session(\”pageviewed\”) & \” pages\”)
%>
  可能有些有些读者会问:这个看似像是数组的session(“..”)是哪里来的?需要我定义吗?实际上,这个session对象是具有asp解释能力的的www服务器的内建对象。也就是说asp的系统中已经给你定义好了这个对象,你只需要使用就行了。其中session(“..”)中的..就好像变量名称,session(“..”)=$$中的$$就是变量的值了。你只需要写上句话,在这个用户的每个页面中都可以访问..变量中的值了。
  其实asp一共内建了7个对象,有session、application、cookie、response、request、server等。在其他的服务器端脚本语言如jsp、php等中也有其类似的对象,只是叫法或者使用方法上不太一样。
asp session的功能的缺陷
  目前asp的开发人员都正在使用session这一强大的功能,但是在他们使用的过程中却发现了asp session有以下缺陷:
  进程依赖性:asp session状态存于iis的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭iis服务都会造成信息的丢失。
  session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些session信息并不会随之迁移过去。例如:新浪网站的www服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些www服务器共享session信息怎么办呢?
cookie的依赖性:实际上客户端的session信息是存储与cookie中的,如果客户端完全禁用掉了cookie功能,他也就不能享受到了session提供的功能了。
鉴于asp session的以上缺陷,微软的设计者们在设计开发 asp.net session时进行了相应的改进,完全克服了以上缺陷,使得asp.net session成为了一个更加强大的功能。
web.config文件简介
  有的asp.net程序员说:web.config文件?我从来没有听说过啊,可是我写的程序不是也能很正常的运转吗?是的,你说得没错,没有web.config文件程序是可以正常运行的。但是,如果你做了一个大型的网站,需要对整个网站做一些整体配置,例如整个网站的页面使用何种语言编写的、网站的安全认证模式、session信息存储方式等,这时你就需要使用web.config文件了。虽然web.config文件中的某些选项是可以通过iis配置的,但是如果在web.config中也有相应的设置就会覆盖掉iis中的配置。而且,web.config文件的最大的便利之处就是可以在asp.net页面中通过调用system.web名字空间访问web.config中的设置。
  web.config有两种,分别是服务器配置文件和web应用程序配置文件,他们都名为web.config。在这个配置文件中会保存当前iis服务器中网页的使用哪种语言编写的、应用程序安全认证模式、session信息存储方式的一系列信息。这些信息是使用xml语法保存的,如果想对其编辑,使用文本编辑器就行了。
  其中服务器配置文件会对iis服务器下所有的站点中的所有应用程序起作用。在.net framework 1.0中,服务器的web.config文件是存在:\\winnt\\microsoft.net\\framework\\v1.0.3705中的。
  而web应用程序配置文件web.config则保存在各个web应用程序中。例如:当前网站的根目录\\inetpub\\wwwroot,而当前的web应用程序为myapplication,则web应用程序根目录就应为:\\inetpub\\wwwroot\\myapplication。如果你的网站有且只有一个web应用程序,一般说来应用程序的根目录就是\\inetpub\\wwwroot。如果想添加一个web应用程序,在iis中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个web应用程序。但是,这样通过iis添加web应用程序是不会为你生成web.config文件的。如果想创建一个带有web.config文件的web应用程序,需要使用visual studio.net,新建一个web应用程序项目。
  web应用程序的配置文件web.config是可选的,可有可无。如果没有,每个web应用程序会使用服务器的web.config配置文件。如果有,则会覆盖服务器web.config配置文件中相应的值。
  在asp.net中,web.config修改保存后会自动立刻成效,不用再像asp中的配置文件修改后需要重新启动web应用程序才能生效了。
web.config文件中的session配置信息
  打开某个应用程序的配置文件web.config后,我们会发现以下这段:
<sessionstate
  mode=\”inproc\”
  stateconnectionstring=\”tcpip=127.0.0.1:42424\”
  sqlconnectionstring=\”data source=127.0.0.1;trusted_connection=yes\”
  cookieless=\”false\”
  timeout=\”20\”
/>
  这一段就是配置应用程序是如何存储session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionstate节点的语法是这样的:
<sessionstate mode=\”off|inproc|stateserver|sqlserver\”
               cookieless=\”true|false\”
               timeout=\”number of minutes\”
               stateconnectionstring=\”tcpip=serverort\”
               sqlconnectionstring=\”sql connection string\”
               statenetworktimeout=\”number of seconds\”
/>
必须有的属性是
属性 选项 描述
mode   设置将session信息存储到哪里
off 设置为不使用session功能
inproc 设置为将session存储在进程内,就是asp中的存储方式,这是默认值。
stateserver 设置为将session存储在独立的状态服务中。
sqlserver 设置将session存储在sql server中。
可选的属性是:
属性 选项 描述
cookieless   设置客户端的session信息存储到哪里
ture 使用cookieless模式
false 使用cookie模式,这是默认值。
timeout   设置经过多少分钟后服务器自动放弃session信息。默认为20分钟
stateconnectionstring   设置将session信息存储在状态服务中时使用的服务器名称和端口号,例如:\”tcpip=127.0.0.1:42424”。当mode的值是stateserver是,这个属性是必需的。
sqlconnectionstring   设置与sql server连接时的连接字符串。例如\”data source=localhost;integrated security=sspi;initial catalog=northwind\”。当mode的值是sqlserver时,这个属性是必需的。
statenetworktimeout   设置当使用stateserver模式存储session状态时,经过多少秒空闲后,断开web服务器与存储状态信息的服务器的tcp/ip连接的。默认值是10秒钟。
asp.net中客户端session状态的存储
  在我们上面的session模型简介中,大家可以发现session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的sessionid,而其他的session信息则保存在服务器端。在asp中,客户端的sessionid实际是以cookie的形式存储的。如果用户在浏览器的设置中选择了禁用cookie,那末他也就无法享受session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在asp.net中客户端的session信息存储方式分为:cookie和cookieless两种。
  asp.net中,默认状态下,在客户端还是使用cookie存储session信息的。如果我们想在客户端使用cookieless的方式存储session信息的方法如下:
  找到当前web应用程序的根目录,打开web.config文件,找到如下段落:
<sessionstate
  mode=\”inproc\”
  stateconnectionstring=\”tcpip=127.0.0.1:42424\”
  sqlconnectionstring=\”data source=127.0.0.1;trusted_connection=yes\”
  cookieless=\”false\”
  timeout=\”20\”
/>
  这段话中的cookieless=\”false\”改为:cookieless=\”true\”,这样,客户端的session信息就不再使用cookie存储了,而是将其通过url存储。关闭当前的ie,打开一个新ie,重新访问刚才的web应用程序,就会看到类似下面的样子:

 
  其中,::url::http://localhost/mytestapplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的session id。注意,这段信息是由iis自动加上的,不会影响以前正常的连接。
asp.net中服务器端session状态的存储
准备工作
  为了您能更好的体验到实验现象,您可以建立一个叫做sessionstate.aspx的页面,然后把以下这些代码添加到中。
<scriptrunat=\”server\”>
sub session_add(sender as object, e as eventargs)
    session(\”mysession\”) = text1.value
    span1.innerhtml = \”session data updated! <p>your session contains: <font color=red>\” & \\
             session(\”mysession\”).tostring() & \”</font>\”
end sub
sub checksession(sender as object, eas eventargs)
    if (session(\”mysession\”)is nothing) then
    span1.innerhtml = \”nothing, session data lost!\”
    else
    span1.innerhtml = \”your session contains: <font color=red>\” & \\
             session(\”mysession\”).tostring() & \”</font>\”
end if
end sub
<formrunat=\”server\”id=\”form2\”>
    <inputid=\”text1\”type=\”text\”runat=\”server\”name=\”text1\”>
    <inputtype=\”submit\”runat=\”server\”onserverclick=\”session_add\”
      value=\”add to session state\” id=\”submit1\”name=\”submit1\”>
    <inputtype=\”submit\”runat=\”server\”onserverclick=\”checksession\”
      value=\”view session state\” id=\”submit2\”name=\”submit2\”>
</form>
<hrsize=\”1\”>
<fontsize=\”6\”><spanid=\”span1\”runat=\”server\” /></font>
  这个sessionstate.aspx的页面可以用来测试在当前的服务器上是否丢失了session信息。
将服务器session信息存储在进程中
  让我们来回到web.config文件的刚才那段段落中:
<sessionstate
  mode=\”inproc\”
  stateconnectionstring=\”tcpip=127.0.0.1:42424\”
  sqlconnectionstring=\”data source=127.0.0.1;trusted_connection=yes\”
  cookieless=\”false\”
  timeout=\”20\”
/>
  当mode的值是inproc时,说明服务器正在使用这种模式。
  这种方式和以前asp中的模式一样,就是服务器将session信息存储在iis进程中。当iis关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的session信息都存储在了iis的进程中,所以iis能够很快的访问到这些信息,这种模式的性能比进程外存储session信息或是在sql server中存储session信息都要快上很多。这种模式也是asp.net的默认方式。
  好了,现在让我们做个试验。打开刚才的sessionstate.aspx页面,随便输入一些字符,使其存储在session中。然后,让我们让iis重起。注意,并不是使当前的站点停止再开始,而是在iis中本机的机器名的节点上点击鼠标右键,选择重新启动iis。(想当初使用nt4时,重新启动iis必须要重新启动计算机才行,微软真是@#$%^&)返回到sessionstate.aspx页面中,检查刚才的session信息,发现信息已经丢失了。
将服务器session信息存储在进程外
  首先,让我们来打开管理工具->服务,找到名为:asp.net state service的服务,启动它。实际上,这个服务就是启动一个要保存session信息的进程。启动这个服务后,你可以从windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存session信息的进程。
  然后,回到web.config文件中上述的段落中,将mode的值改为stateserver。保存文件后的重新打开一个ie,打开sessionstate.aspx页面,保存一些信息到session中。这时,让我们重起iis,再回到sessionstate.aspx页面中查看刚才的session信息,发现没有丢失。
  实际上,这种将session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为stateserver,还需要在stateconnectionstring中配置相应的参数。例如你的计算你是192.168.0.1,你想把session存储在ip为192.168.0.2的计算机的进程中,就需要设置成这样:stateconnectionstring=\”tcpip=192.168.0.2:42424\”。当然,不要忘记在192.168.0.2的计算机中装上.net framework,并且启动asp.net state services服务。
将服务器session信息存储在sql server中
  首先,还是让我们来做一些准备工作。启动sql server和sql server代理服务。在sql server中执行一个叫做installsqlstate.sql的脚本文件。这个脚本文件将在sql server中创建一个用来专门存储session信息的数据库,及一个维护session信息数据库的sql server代理作业。我们可以在以下路径中找到那个文件:
[system drive]\\winnt\\microsoft.net\\framework\\[version]\\
  然后打开查询分析器,连接到sql server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫aspstate的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上session信息是存储在了tempdb数据库的aspstatetempsessions表中的,另外一个aspstatetempapplications表存储了asp中application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->sql server代理->作业,发现也多了一个叫做aspstate_job_deleteexpiredsessions的作业,这个作业实际上就是每分钟去aspstatetempsessions表中删除过期的session信息的。
  接着,我们返回到web.config文件,修改mode的值改为sqlserver。注意,还要同时修改sqlconnectionstring的值,格式为:
sqlconnectionstring=\”data source=localhost; integrated security=sspi;\”
  其中data source是指sql server服务器的ip地址,如果sql server与iis是一台机子,写127.0.0.1就行了。integrated security=sspi的意思是使用windows集成身份验证,这样,访问数据库将以asp.net的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的sql server验证方式更好的安全性。当然,如果sql server运行于另一台计算机上,你可能会需要通过active directory域的方式来维护两边验证的一致性。
  同样,让我们做个试验。向sessionstate.aspx中添加session信息,这时发现session信息已经存在sql server中了,即使你重起计算机,刚才的session信息也不会丢失。现在,你已经完全看见了session信息到底是什么样子的了,而且又是存储在sql server中的,能干什么就看你的发挥了,哈哈。
总结
  通过这篇文章,你可以看到在session的管理和维护上,asp.net比asp有了很大的进步,我们可以更加随意的挑选适合的方法了。对于企业级的应用来说,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好!



Powered By wordpress Copyright SQLServer 数据库应用专题 © 2009-2012 版权所有