发布新日志

  • sqlserver2005(转)

    2010-06-17 17:30:20

    '用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联

    问题一、忘记了登录Microsoft SQL Server 2005 的sa的登录密码

    解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,修改密码点击确定就可以了。

    问题二、已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233)

    解决方法:打开‘程序’-‘所有程序’-‘Microsoft SQL Server 2005 ’-‘配置工具’-‘SQL Server 配置管理器’,在弹出的窗体中,找到‘SQL Server 2005 网络配置’,把‘MSSQLSERVER的协议’下的“Named Pipes”和“TCP/IP”启动,然后重新启动Microsoft SQL Server 2005就可以了。

    问题三、无法打开用户默认数据库。登录失败。用户‘sa’登录失败。(Microsoft SQL Server, 错误:4064)

    解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,将默认数据库设置成master,点击确定就可以了。


    问题四、sql server 2005 错误 18452
    无法连接到服务器
    服务器:消息18452, 级别16,状态1
    [Microsoft][ODBC SQL Server Driver][SQL Server]用户‘sa’登陆失败。原因:未与信任SQL Server连接相关联
    该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(例如 sa )进行连接,解决方法如下

    设置允许SQL Server身份登录 (基本上这个很有用)
    操作步骤:
    1。在企业管理器中,展开"SQL Server组",鼠标右键点击SQL Server服务器的名称
    2。选择"属性"
    3。再选择"安全性"选项卡
    4。在"身份验证"下,选择"SQL Server和 Windows"
    5。确定,并重新启动SQL Server服务
    问题五、用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。
    解决方法:检查你的数据库的认证模式,windows 和 混合模式,需要SA登陆的请选择混合模式。
    检查计算机1433连接端口,1434数据端口是否打开

    针对sql 2005 进入管理器中“安全”==》“用户”==》双击用户(弹出属性对话框)==》“状态”把状态改成enable,退出管理器重新登录(用户验证模式)
    即:右键数据库属性对话框,选择“安全性”选项卡,服务器身份验证模式选择“SQL Server和Windows身份验证模式 。然后重新配置sa的登陆信息即可。

    SQL SERVER 2005使用sa 登录失败-提示该用户与可信 SQL Server 连接无关联
    错误提示:
    sa 登录失败,提示该用户与可信 SQL Server 连接无关联
    解决方法:
    打开SQL Server Management Studio Express,
    右键点击服务器,选择Properties(属性),在弹出窗口中点击Security(安全)切换到安全面板,
    将server authentication服务器认证从windows authentication mode(windows用户认证模式)
    修改为Sql Server and Windows Authentication mode(Sql server和windows认证模式),ok。
    打开security(安全性) -- logins(登录名) ,右键选中sa,选择properties(属性),点击Status(状态)切换到状态面板,将Login(登录)设置为Enabled(启用)。


    切记:一定要把SQL2005服务重启才生效。

  • Oracle数据库导入导出方法(转)

    2009-06-17 20:57:15

    1.使用命令行:

    数据导出:

    1.将数据库TEST完全导出,用户名system密码manager导出到D:\daochu.dmp中

    exp system/manager@TEST file=d:\daochu.dmp full=y

    2.将数据库中system用户与sys用户的表导出

    exp system/manager@TEST file=d:\daochu.dmp ōwner=(system,sys)

    3.将数据库中的表inner_notify、notify_staff_relat导出

    exp aichannel/aichannel@TESTDB2 file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat)

    4.将数据库中的表table1中的字段filed1以"00"打头的数据导出

    exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"

    上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。

    也可以在上面命令后面加上compress=y来实现。

    数据的导入:

    1.将D:\daochu.dmp 中的数据导入 TEST数据库中。

    imp system/manager@TEST file=d:\daochu.dmp

    imp aichannel/aichannel@HUST full=y  file= d:\data\newsmgnt.dmp ignore=y

    上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。

    在后面加上 ignore=y 就可以了。

    2.将d:\daochu.dmp中的表table1导入

    imp system/manager@TEST file=d:\daochu.dmp tables=(table1)

    2.plsql:

    数据导出:

    TOOLS-Export user objects(用户对象)

    TOOLS-Export tables(表)

    数据的导入:

    TOOLS-Import tables

    Oracle Import(表)SQLInserts(用户对象)

    也可以将用户对象的语句拷贝出来,粘贴到Command Window这样的好处是可以看到执行的过程。

  • (转)组合查询之核心:拼接字符串

    2009-03-30 18:59:05

    '组合查询之核心:拼接字符串
      '功能:定义查询条件,定义返回集,定义排序方式
      '平台:Windows 2000 Server + IIS5.0 + SQL Server 2000
      '语言:VBScript.
      '作者:Cheery_Ke
      '***********Start************
      '**************读取变量*************
      .
      .
      .
      seaLastUpdTime = Request("seaLastUpdTime1")&"-"&Request("seaLastUpdTime2")&"-"&Request("seaLastUpdTime3")
       
      returnItem = Request("ReturnItem")'******个人设定要返回的字段
       
      'Response.Write returnItem
       
      '***********拼接字符串***************************
       
      If returnItem <> "" Then
       
      SQL = "Select ComID,ComName, " & returnItem & " From ClientInfo Where ISInva = 0"
       
      Else
       
      SQL = "Select ComID,ComName From ClientInfo where IsInva = 0"
       
      End If
       
      If seaComName <> "" Then
       
       SQL = SQL & " And ComName Like '%"&seaComName&"%'"
       
      End If
       
      If seanexus1 <> "" Then
       
       SQL = SQL & " And nexus like '%"&seanexus1&"%'"
       
      End If
       
      If seanexus2 <> "" Then
       
       SQL = SQL & " And nexus like '%"&seanexus2&"%'"
       
      End If
       
      If seaComType <> "" Then
       
       SQL = SQL & " And ComType = '"&seaComType&"'"
       
      End If
       
      If seaComProv <> "" Then
       
       SQL = SQL & " And ComProv = '"&seaComProv&"'"
       
      End If
       
      If seaTimeFrist11 <> "" Then
       
       seaTimeFrist1 = seaTimeFrist11&"-"&seaTimeFrist12&"-"&seaTimeFrist13
       
       SQL = SQL & " And TimeFrist > '"&seaTimeFrist1&"'"
       
      End If
       
      If Request(seaTimeFrist1) <> "" Then
       
       seaTimeFrist1 = Request(seaTimeFrist1)
       
       SQL = SQL & " And TimeFrist > '"&seaTimeFrist1&"'"
       
      End If
       
      If seaTimeFrist21 <> "" Then
       
       seaTimeFrist2 = seaTimeFrist21&"-"&seaTimeFrist22&"-"&seaTimeFrist23
       
       SQL = SQL & " And TimeFrist < '"&seaTimeFrist2&"'"
       
      End If
       
      If Request(seaTimeFrist2) <> "" Then
       
       seaTimeFrist2 = Request(seaTimeFrist2)
       
       SQL = SQL & " And TimeFrist < '"&seaTimeFrist2&"'"
       
      End If
       
      If seaNearTime11 <> "" Then
       
       seaNearTime1 = seaNearTime11&"-"&seaNearTime12&"-"&seaNearTime13
       
       SQL = SQL & " And TimeNear > '"&seaNearTime1&"'"
       
      End If
       
      If Request(seaNearTime1) <> "" Then
       
       seaNearTime1 = Request(seaNearTime1)
       
       SQL = SQL & " And TimeNear > '"&seaNearTime1&"'"
       
      End If
       
      If seaNearTime21 <> "" Then
       
       seaNearTime2 = seaNearTime21&"-"&seaNearTime22&"-"&seaNearTime23
       
       SQL = SQL & " And TimeNear < '"&seaNearTime2&"'"
       
      End If
       
      If Request(seaNearTime2) <> "" Then
       
       seaNearTime2 = Request(seaNearTime2)
       
       SQL = SQL & " And TimeNear < '"&seaNearTime2&"'"
       
      End If
       
      If seaAppTime11 <> "" Then
       
       seaAppTime1 = seaAppTime11&"-"&seaAppTime12&"-"&seaAppTime13
       
       SQL = SQL & " And AppTime > '"&seaAppTime1&"'"
       
      End If
       
      If Request(seaAppTime1) <> "" Then
       
       seaAppTime1 = Request(seaAppTime1)
       
       SQL = SQL & " And AppTime > '"&seaAppTime1&"'"
       
      End If
       
      If seaAppTime21 <> "" Then
       
       seaAppTime2 = seaAppTime21&"-"&seaAppTime22&"-"&seaAppTime23
       
       SQL = SQL & " And AppTime < '"&seaAppTime2&"'"
       
      End If
       
      If Request(seaAppTime2) <> "" Then
       
       seaAppTime2 = Request(seaAppTime2)
       
       SQL = SQL & " And AppTime < '"&seaAppTime2&"'"
       
      End If
       
      If Request("seaLastUpdTime1") <> "" Then
       
      // seaLastUpdTime0 = seaLastUpdTime1&"-"&seaLastUpdTime2&"-"&seaLastUpdTime3
       
       SQL = SQL & " And LastUpdTime > '"&seaLastUpdTime&"'"
       
      End If
       
      If Request(seaLastUpdTime1) <> "" Then
       
       //seaLastUpdTime0 = Request(seaLastUpdTime0)
       
       SQL = SQL & " And LastUpdTime > '"&seaLastUpdTime&"'"
       
      End If
       
      If Session("Pop") = "1" Then
       
       AdminName = Session("UserName")
       
      SQL = SQL & " And (OurSales Like '%"&AdminName&"%' Or nexus Like '%w%') Order By " & Order
       
      Else
       
      Response.Write SQL
       
      SQL = SQL & " Order By "& Order 'Order设定排序方式
       
      End If
       
      'Response.Write SQL
  • (转)OLEDB的连接字符串

    2009-03-30 18:56:17

    有许多种办法可以连上一个数据库. 你可以用System DSN, DSN-less连接或是本地的OLEDB provider. OLEDB? 这是什么什么玩艺儿? 也许你们中的许多人以前没有听说过. 要回答这个问题,我们先得回顾一下数据库连接的历史.

    早期的数据库连接是非常困难的. 每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的底层API有深刻的了解. 因此,能处理各种各样数据库的通用的API就应运而生了. 也就是现在的ODBC(Open Database Connectivity), ODBC是人们在创建通用API的早期产物. 有许多种数据库遵从了这种标准,被称为ODBC兼容的数据库.
    ODBC兼容的数据库包括Access, MS-SQL Server, Oracle, Informix等.

    但ODBC并不是完美无缺的,它仍然含有大量的低级的调用,开发ODBC应用程序仍较困难. 开发者不得不将大量的精力花在底层的数据库通信中,而不能专注于他们所要处理的数据. 后来微软提出了一个解决方案: DAO(Data Access Objects). DAO的代码看起来象这样:

    objItem.AddNew
    objItem.Name = "Chair"
    objItem.Price = 10
    objItem.Update

    你也许看过DAO的代码. 后来DAO演变为RDO(Remote Data Objects, 为分布式数据库体系设计), 再后来是ADO. 尽管它们都有各自的不足之处. 根据微软的说法,"ODBC提供了本地SQL数据的存取,DAO提供了高级的数据对象". DAO和RDO都需要数据以SQL(Structured Query Language)的格式存储. 针对这些缺陷,微软提出了OLEDB,一个基于COM的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像).

    OLEDB位于ODBC层与应用程序之间. 在你的ASP页面里,ADO是位于OLEDB之上的"应用程序". 你的ADO调用先被送到OLEDB,然后再交由ODBC处理. 你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升. 那我们该如何直接连接到OLEDB呢?

    要想直接连到OLEDB层,你必须改变你的connection对象连接字符串. 先用老办法创建一个connectiong对象:

    Dim objConn
    Set bjConn = Server.CreateObject("ADODB.Connection"

    接下去,我们不用常规的类似DSN=pubs or DRIVER={MS SQL-
    Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine的连接字符串,而采用下面的连接字符串:

    objConn.ConnectionString = "Provider=ProviderName; Data
    Source=DatabaseSource; Initial Catalog=DatabaseName; User ID=UserID;
    Password=Password"

    对于SQL:
    ProviderName = SQLOLEDB
    Data Source = Server Name
    Initial Catalog = Database Name

    对于Access:
    ProviderName = Microsoft.Jet.OLEDB.3.51
    Data Source = Full path to .MDB file

    下面让我们来看两个例子,一个是针对Access的,还有一个是针对SQL的. 如果你的连接SQL的DSN-less连接串是这样的:

    DRIVER={MS SQL-Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine

    那么直接连接到OLEDB的连接字符串应该是这样的:

    Provider=SQLOLEDB; Data Source=myMachine; Initial Catalog=pubs; User
    ID=sa; Password=

    让我们来看看Access,如果你的Access的连接字符串是:

    DRIVER={Microsoft Access Driver (*.mdb)};
    DBQ=c:\inetpub\wwwroot\users.mdb

    那么直接连接到OLEDB的连接字符串应该是这样的:

    Provider=Microsoft.Jet.OLEDB.3.51; Data
    Source=c:\inetpub\wwwroot\users.mdb

    就是这么简单,挺棒的吧?

    这很重要吗?
    现在你也许对为什么要学习这种新的数据库连接方法感到有些儿迷惑,为什么不走标准的DSN-less/System DSN路子呢? 让我来告诉你为什么. 据Wrox出的ADO 2.0
    Programmer's Reference一书中的测试,用OLEDB连接而不是DSN或DSN-less的连接会得到的性能提升如下:

    性能比较
    SQL Access
     OLEDB DSN OLEDB DSN
    Connection Times: 18 82 Connection Times: 62 99
    Iterating through 1,000 Records Times: 2900 5400 Iterating through
    1,000 Records Times: 100 950


    我希望这篇文章能对你有点儿帮助,我相信你会对你的连接SQL及Access数据库的方法做一些小小的改进的.

  • (转)WebComputing━ADO总结报告

    2009-03-30 18:52:54

    在当今提出的多种动态网页(Dhtml)解决方案中都强调了与数据库的连接,其实网页接挂后台数据库也是当前的热门应用,在电子商务等领域有着广泛的应用.MicroSoft为了适应其发展推出了新的ADO(Active Data Object)模型,通过ODBC的连接可以对当前流行的桌面数据库系统提供方便,快洁的连接.在这里,我想通过ADO在ASP技术中的应用来总结一下ADO对象以及其各自的属性和方法.51Testing软件测试网 A@2[.f6J s
    一、ADO对象模型:
    z2_ PWnnPb138711下面简单介绍一下ADO的对象模型
    2t7}'J!V&pda@s g138711ADO有三大对象,即Connection对象,Command对象,RecordSet对象.51Testing软件测试网%M+_g\7J,{
    Connection(对象)
    +Lm8p$N Tf V8{5N138711─Errors(集合)─Error(对象)51Testing软件测试网'lM.T2CN
    Command(对象)
    ?#Ql&_+ns138711─Parameters(集合)─Parameter(对象)51Testing软件测试网 W)[M T7HR;fM1w Ro,y
    RecordSet(对象)
    v){ ^2R,]W138711─Fields(集合)─Field(对象)
    51Testing软件测试网;L V[&s)?Lfv$x51Testing软件测试网k3o B*d(l Wo X}#v

      其中Connection对象,Command对象,RecordSet对象和Field对象又分别具有Properities集合而产生Properity对象.我们在asp编程中已经对这几个对象有了足够的了解.下面是以上三大对象的相互关系.
    _^rVS138711Command.ActiveConnection-$#@62;Connection51Testing软件测试网i_:p5\tt
    RecordSet.ActiveConnection-$#@62;Connection
    \$k'zP$s B+Qkb138711Connection.Execute-$#@62;RecordSet
    *f f*G`7^'aI138711Command.Execute-$#@62;RecordSet
    JZ U"IC138711RecordSet.Source-$#@62;Command51Testing软件测试网G!RX%G6SD'Jm,r
    好了,有了以上的关系表后,你应该能理解有一些等价的表达形式了.51Testing软件测试网(XQZ@)og.Lsn
    形式151Testing软件测试网O5?}3v|#K
    set rs = Server.CreateObject("ADODB.RecordSet")
    ,?5ePdD^138711strConn = "driver={SQL Server};server=srv;"& _
    i V5x;S"o$n138711"uid=sa;pwd=;database=pubs"51Testing软件测试网h'p7yyGt)f@8b
    strSQL = "Select * From Employee ;"51Testing软件测试网L-KpsB8e/`
    rs.open strSQL,strConn,,,adCmdText
    A,y P:p6afy k P'N138711形式251Testing软件测试网*k}'X7i%G9J o
    set conn = Server.CreateObject("ADODB.Connection")
    ~|aMua138711strConn ="driver={SQL Server};server=srv;"& _
    B!jJ{M#A I7zb138711"uid=sa;pwd=;database=pubs"
    5YT`4R-R7\l138711conn.open strConn
    'l@9^ MZ W OU p138711set rs = Server.CreateObject("ADODB.RecordSet")51Testing软件测试网3?4xvo[/m3AV&s
    rs.ActiveConnection=conn(注意此句)51Testing软件测试网OX+EN(A
    strSQL = "Select * From Employee ;"51Testing软件测试网 y WP[mUE
    rs.open strSQL,,,,adCmdText
    ,M0D wQaa`0L138711"上面这句也可以写成rs.open strSQL,conn,,,adCmdText
    ;B*M YIrg6yi*f8m'}:v138711形式351Testing软件测试网3v1wg9sR(v
    set conn = Server.CrreateObject("ADODB.Connection")
    kzSo&L'Zvd138711set rs = Server.CreateObject("ADODB.RecordSet")
    Y/Z*H/I3rU0AG&U&eM%v138711strConn ="driver={SQL Server};server=srv;"& _
    2bS4c(t-t:c.q138711"uid=sa;pwd=;database=pubs"51Testing软件测试网,TT1{;oXt w x$k
    conn.open strConn
    $BL4c @\b7\138711strSQL = "Select * From Employee ;"
    v i?i^ c138711rs=conn.Execu strSQL(注意次句)
    v|"Q;L$DK:i:A138711形式451Testing软件测试网cSLqW Cq
    set rs = Server.CreateObject("ADODB.RecordSet")
    @F]N7^v)N+uAz138711strConn ="driver={SQL Server};server=srv;"& _
    0DILUm_138711"uid=sa;pwd=;database=pubs"51Testing软件测试网3T*^_tr rB
    strSQL = "Select * From Employee ;"
    +t)UR^8M.J-N4o138711rs.open strSQL,strConn,,,adCmdText

    Kcc$sF%l$E138711

    r9LoR-l m3{ eq138711注:上面的例子中均假设SQL Server的name=srv,使用SQL Server Authentication采用了默认的帐号sa,该帐号没有设定密码。

    t4l)J o2t138711

    -eOg&|d:k138711  上面这几种形式都能够产生一个相同的RecordSet对象的实例rs,但方法各异,在后面的讨论中我们将看到它们不同的优越性.

    :Pv'io R3yC:T138711

    ?h5[5F)G9P0n138711二、Connection对象:
    'g rl k"@P2LymLO"N138711
      在ADO的模型中,Connection对象是最基本的对象,他主要是提供与数据库的连接。其他的两个对象都是通过它与数据库的连接来完成操作的。它的属性、方法如下所示。
    8KxN5c^\138711Connection对象的主要属性
    Y4kprEZ#GOBrt138711  1、 CursorLocation,它的取值有两个,一个是adUseClient,一个是adUseServer(默认),从其英语本身的含义就可以看出,前者是使用客户端的游标,而后者是使用服务器端的游标。二着的差别在于adUseClient游标可以提供供应商所没有提供的额外的属性,因而灵活性更大。需要注意的是Connection对象与RecordSet对象均有此属性,由Connection对象产生的RecordSet对象会自动的继承这个属性。另外要让此属性对Connection和RecordSet对象的实例起作用的话,必须在打开它们之前先定义。
    Z&w i(hAu[138711
    Eu9L(ES'OA138711下面看一个例子51Testing软件测试网`u8V{6O
    Set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网 w#J&|e^#aE-hz
    conn.CursorLocation=adUseClient
    0y-p-J-]:Um$RN&u138711strConn ="driver={SQL Server};server=srv;"& _51Testing软件测试网F(H U8a"x#YG
    "uid=sa;pwd=;database=pubs"51Testing软件测试网_8eXb D;F
    conn.open strConn
    .q2Xw%fGB8tgl h+a138711set rs= Server.CreateObject("ADODB.RecordSet")
    [t@,^,_N5I%B ~138711rs.open "emloyee",conn,,,adCmdTable
    M [F1wq138711采用次种方式则conn与rs的游标均为adUseClient了。51Testing软件测试网zYI|AR+_9W j
      2、 ConnectionString,在打开一个Connection实例之前设定数据库的连接信息。在上面的例子中我们使用了一条语句conn.open strConn,其中的strConn就是ConnectionString,因此我们可以重写上面的语句如下:51Testing软件测试网;Ga$Z:Hb#L~)R T mV
    Conn.ConnectionString=strConn
    %Ed$EA |&^138711Conn.open51Testing软件测试网#g @1WEn8|-mM
      3、 ConnectionTimeOut,设置连接超时。51Testing软件测试网 T#j.gf"{7dy0I
      4、 CommandTimeOut,设置命令执行超时。
    xw2v3I}.@ F d+U/?138711
    Connection的主要方法
    q4yM c0p%nHB138711
      1、 open,打开一个Connection的对象实例,常用的写法为conn.open ConnectionString,如果在打开之前已经定义了ConnectionString属性的话,就可以直接的打开。51Testing软件测试网:Y a @V NzJ"^"r[E{,]
      2、 Execute,产生一个RecordSet实例,常用的写法为51Testing软件测试网w.O\9]r"G
    Rs=conn.Excute CommandText,RecordsAffected,Option51Testing软件测试网7m FN!?U+w-ny!yD7A
    其中的CommandText可以为以下的几种形式,主要由Option的值来决定1) SQL语句,此时Option的值为adCmdText,表示将执行一段SQL语句。2)数据库的一个表名,此时Option的值为adCmdTable,表示将对该表进行操作。51Testing软件测试网5dHA1y.P?y
      3、一个StoredProcedure名字,此时Option取值为adCmdStoredProc,它表示将要执行一个SQL上定义的存储过程。这是一个非常灵活而强大的方法,它可以对用户隐藏数据库的具体信息,而只需用户提供适当的参数就可以了,还能返还需要的参数值。在后面介绍Command对象时再做详细的介绍。值得注意的是,有时Excute后并不需要返回一个RecordSet对象,例如在表中删除记录。看下面的例子:51Testing软件测试网D3nVG*Fv4v:Oa9X1g
    set conn= Server.CreateObject("ADODB.Connection")
    0jk)SA/K2EC[A4n.x138711conn.ConnectionString="driver={SQL Server};server=srv;"& _51Testing软件测试网Y xuwx
    "uid=sa;pwd=;database=pubs"
    6J/I FPz4G0Z138711conn.open51Testing软件测试网p-u&^_4z
    conn.Execute "Delect From Employee Where Job_ID=1;",,adCmdText
    1e[)R8I!|PzGz3f138711  该例子删除Employee表中Job_ID为1的记录,并不需要再返回一个RecordSet的实例,但如果将最后一句变为rs= conn.Execute "Delect From Employee Where Job_ID=1;",,adCmdText那么我们就可以用此rs来指向表中的记录条了。返回的rs和后面RecordSet对象中用Source属性产生的rs是相同的。

    m:r6]A6b138711
    Connection对象的集合
    (M8|:V'CU)yxH138711
    1、 Errors集合,对应产生Error对象。我们将在后面做单独的讨论。51Testing软件测试网#dT%Ywd sir
    2、 Properties集合,对应产生Property对象,下面给出一段代码,它包含了Property对象的主要方法和属性。

    tw_OM8RH7n138711

    /bEFL-f13871151Testing软件测试网7]9O2Er-H1Qr,GB

    \9Z*?(B^138711$#@60;%51Testing软件测试网P2j$fM6g:ZR*\)h1y!O:E
    "this program is testing the ADO"s Property object
    "^mI,Jv*Yk+S138711Const adCmdTable = &H000251Testing软件测试网 b(?A.Y1|p4H
    set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网&P q*_*@`G8_t?
    set rs=Server.CreateObject("ADODB.RecordSet")51Testing软件测试网YF%GS`&tv(s
    conn.ConnectionString="Driver={Microsoft Access Driver (*.mdb)};DBQ="& _
    5Y(z-B m%GYo P hn138711Server.Mappath("/source_asp")&"/property/employee.mdb;"
    dR6B1`0UP ZZ138711conn.open
    L%ID8?J138711rs.ActiveConnection=conn
    (kz zR\k:ue(hC138711rs.open "employee",,,adCmdTable51Testing软件测试网meVa wj
    dim i,j
    1{+^o `n [/W6C138711for i=0 to rs.fields.count-1
    lX5^ D`6V138711Response.Write rs.fields(i).name&"$#@60;br$#@62;"
    S!R6q/TZ p138711next51Testing软件测试网i)bfs ynn0i
    for j=0 to rs.properties.count-1
    {J x Nu _"J q138711Response.write rs.properties(j).name&"$#@60;br$#@62;"
    [EP:i7a.gl r138711next
    YH ag%zt3X2z138711rs.close
    1M$~#~arV0v!m,y o138711conn.close51Testing软件测试网,s\8^IOL)@T
    %$#@62;51Testing软件测试网tM(Hj%^;\

    4I1d'y+|+]'E S138711三、Error对象:51Testing软件测试网'WL-J!I%M c f3nG
      前面讲到了Connection对象是用于与各类的数据库进行挂接的,但在此过程中将会出现一些不可预测的错误,因而有了Error这个对象。首先要清楚一个概念,Error对象是在连接数据库时产生的,而并非那些运行时的实时错误。也就是我们常用 On Error Resume Next来忽略到的错误。这些错误将在Err对象中,我们可以用一个统一的模板来集中处理,我会在后面给出一个实例。下面还是先来看Error对象的属性和方法:
    :j'\8pav3_138711  1、 Count属性:用来统计Errors集合的数目,它的特点与前面讲到的Property对象的Count对象相同。
    /zDS0^x{n]"m j$u138711  2、 Clear方法:写法为Error.Clear,是用来清除Errors集合中的原有对象的,在统计新的Error对象时应该先使用此语句。
    QG9q5Up"m{[.M138711  3、 Item方法:用来指定特定的一个错误,语法为Error.Item(number),其中number为一数字。由于Item为默认的方法,所以Error(number)的写法与前面的写法是等价的。下面是一段程序。用来列举Error的所有对象。
    *vd:G lN'R?U;V138711$#@60;%51Testing软件测试网_.L1\oNsH|3[
    "this program is testing the ADO"s Error object51Testing软件测试网DbfY7~ m
    Dim i
    ]M0e&fB7I$c8L138711Set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网"a f#rC\8H5_
    conn.ConnectionString="Driver={Microsoft Access Driver (*.mdb)};DBQ=" _51Testing软件测试网;]7bJLf;e6F Im
    &Server.Mappath("/source_asp")&"/property/employee.mdb;"51Testing软件测试网([1w{ Z X[/C`"rW;R
    conn.open51Testing软件测试网8T+Q"H3z5~*V
    if conn.errors.count$#@62;0 then
    ?Oe%{~9r&\138711response.write "connection to database cause problem!"&"$#@60;br$#@62;"51Testing软件测试网]2W:tEXk}/p
    for i =0 to conn.errors.count-1
    %L7UI;AVM138711response.write conn.errors.item(i)&"$#@60;br$#@62;"
    %\5Q B3NkK138711next
    &R1T Ole_P138711else51Testing软件测试网x0S%^/ac\4E}
    response.write "connection to database successfully!"51Testing软件测试网CoH+f;Tt5h-P,^)n9F
    end if51Testing软件测试网0JRoZ#zIs
    conn.close51Testing软件测试网,T5];~!{d/X
    %$#@62;51Testing软件测试网Z `*RJJOq6c
      对于Err对象的通用模板处理程序我将在讨论RecordSet对象时给出。
    r3k/VG&k+J k"Z138711  下面我们将讨论ADO的第二个大的对象━Command对象,我的一个做网站的朋友告诉我他在平时使用ASP挂接数据库时很少使用Command对象,原因是Command对象不好使用,而喜欢用RecordSet对象。是的,可以这么说Command对象是整个ADO模型中最难掌握的一个,但也是功能和性能最好的一个。特别是它的StoredProcedue,它将处理的过程大部分都使用了在SQL Server上已经编译和优化了的存储过程,用过SQL Server的朋友都会明白的。下面就让我们来看Command对象

    )@tVm^ x9tk138711

    X \~},kh]138711四、Command对象:
    '{_*m2I@138711
      从英语字面的意思就可以看出,Command是用来做命令执行和参数传递的。而Command对象的批量参数传递,StoredProcude执行等等灵活而强大的功能也是它受到青睐的原因。Command对象主要是向SQL语句、StoredProcude传递参数,依靠SQL Server的强大功能来完成数据库的操作;而RecordSet对象可以说是微软从新封装了数据对象,并提供了一系列的方法和属性来简化数据库的编程。我们看下面的一个例子,它用了两种不同的方法实现了向数据库中增加一新的记录条。从中可以清楚的看到Command对象与RecordSet对象的不同点。51Testing软件测试网4{S9h'v]
    方法1(Command)
    O6]"v1N t*i0gJ9_1N138711const adCmdText=&H0001
    b|].|&N138711const adInteger=3
    5uX0Z n;X`/Y4^]o138711const adVarChar=20051Testing软件测试网O }SG6c0Ha#N
    const adParamInput = &H0001
    cW,v%qQ2x138711set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网^9IH'Yd7px{
    set comm=Server.Createobject("ADODB.Command")
    +](X [hyd138711conn.open "Driver={ Microsoft Access Driver};DBQ="& _51Testing软件测试网0N%v/{5w~1wK_T'Z
    Server.Mappath("/source_asp")&"/property/employee.mdb;"51Testing软件测试网"p*l_"I"f"D/UmL Rv
    comm.ActiveConnection=conn
    b;fMt} X138711comm.CommandType=adCmdText
    a j:_6Mv:Eo138711comm.CommandText="insert into employee (Job_ID,Fri_Name,Last_Name)"& _51Testing软件测试网PY mMN
    &"values(?,?,?)"
    {|.A4yT6|+Z)gf138711set param=comm.CreateParameter("ID",adInteger,adParamInput,3,4)51Testing软件测试网Cbq~8t,L$M.k"N+f
    comm.Parameters.Append param51Testing软件测试网lrx.x U)e
    set param=comm.CreateParameter("FN",adVarChar,adParamInput,255,"bill")
    ;d:}f iPJ!R138711comm.Parameters.Append param
    u1@D)ap138711set param=comm.CreateParameter("LN",adVarChar,adParamInput,255,"Gates")
    Vk MX7n138711comm.Parameters.Append param
    v}YrM2M138711comm.Execute
    "M/U9H Ov"~;O1zYP138711conn.close
    51Testing软件测试网]'BZ9B G+{

    51Testing软件测试网 [tf_-Kd8s&O6S

    51Testing软件测试网 Pm-e'm1bq:c v

    }R cJ(ee6j5J138711方法2(RecordSet)
    2[0UP"ZoC138711const adCmdTable=&H0002
    mOt;yAk138711set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网;Hgb3`$eq Z
    set rs=Server.Createobject("ADODB.RecordSet")51Testing软件测试网'fH&a-u-y.~)Z
    conn.open "Driver={Microsoft Access Driver (*.mdb)};DBQ="& _51Testing软件测试网1U1k:U;^'E kN
    Server.Mappath("/source_asp")&"/property/employee.mdb;"51Testing软件测试网%E(H,^+\J
    rs.ActiveConnection=conn51Testing软件测试网sc5oser
    rs.open "employee",,,adCmdTable
    "z4?.r:X][138711rs.addnew51Testing软件测试网1T/VXOK_l
    rs("Job_ID")=4
    -q#sf0Jl3s;V138711rs("Fri_Name")="bill"51Testing软件测试网` h;ck0Ru%L4o
    rs("Last_Name")="Gates"51Testing软件测试网X O*M G%mTt:b&M?
    rs.update51Testing软件测试网-m G~}9N:d&M9^b
    rs.close51Testing软件测试网Y\^a0U'`Xv5AM
    conn.close
    1\ [j w+Y138711  从上面的例子就可以看出来了,这两个对象在处理一些问题上所用的不同的方法.RecordSet对象似乎更加好理解一些,因为它加入了一些在ANSI SQL中没有的元素,它其实是用 SQL在数据库上产生一个记录集,然后用一个游标来指向这个记录集,超作该游标来遍历这个记录集。但在性能上来讲的话Command的性能也相对要优越些.其可重应用性也非常的好。而且如果你是批量的加入记录的话,你也能体会到第一种方案的好处了,因为Command对象就是将SQL产生的记录集作为整体来处理。下面详细介绍Command对象的属性、方法和集合。
    o6@*L.^3v\13871151Testing软件测试网/F{0T,{I
       1、 CreateParameter方法:用来产生一个Parameter对象,常用的写法为Set param=comm.CreateParameter(name,type,direction,size,value),其中name为参数的引用名,在后面引用参数的值时会有用;type为指定参数的类型,例如整数为adInteger;direction指定参数是输入还是输出,相应的值为adParamInput和adParamOutput;size指定参数的最大长度或最大的值;value指定参数的值。可以将各个选项分开来写,下面的两种写法是等价的:
    &I tT%Cyn `o%U138711Set param= comm.CreateParameter(name,type,direction,size,value)
    M+p*@/Tk@;]13871151Testing软件测试网$fV'`tBFD ~
    set param= comm.CreateParameter(name,type,direction,size)
    \+?U%F P:K6r!s*n$v t-M138711param.value=value
    +WzQ!cP G138711  下面的方法其灵活性更大。大家请注意,在使用了CreateParameter方法后只是建立了新的 parameter对象,还需使用Parameter对象的append方法将该参数传递给Command对象。51Testing软件测试网#@wq0c(U
      2、 Execute方法:在指定了CommandText后,并将参数传递出去后,用Execute方法来完成执行。51Testing软件测试网l{9|"e:x
      3、 ActiveConnection属性:用来指定与Connection对象的连接,这里的一个技巧就是不同的Command对象指向同一个Connection连接。51Testing软件测试网g*e'mSF|XR&[
      4、 CommandText属性:其值可以是一条SQL命令句,可以是一个表名,也可以是一个StoredProcedure名。51Testing软件测试网9abc3UQ*ryk&v
      5、 CommandType属性:它的值由CommandText相应值的给出,分别为adCmdText,adCmdTable,adCmdStoredProc。与前面在讲Connection对象的Execute方法中的相应的选项的含义相同。
    )Py }O| Eg138711  6、 CommandTimeOut属性:设定命令执行的超时的值。
    .yIa/x } Je138711  7、 Properties集合:我们不多讲了,与Connection对象的Property集合相差不多。51Testing软件测试网)n6Tw Yy+Jeg
      8、 Parameters集合:也就是参数对象的集合了,他有主要Item方法、Append方法,和Count属性,用法与Property对象及Error对象的相应属性和方法类似,下面给出一个示例:51Testing软件测试网ahq3Wm \5W
    const adCmdText=&H000151Testing软件测试网Xy;gZg4s)[/ki
    const adInteger=351Testing软件测试网y,U4psG:p_i*U
    const adVarChar=200
    rB3VP5o138711Const adParamInput = &H000151Testing软件测试网4S%QZ X*`tQ$]
    set conn=Server.CreateObject("ADODB.Connection")
    D H?Qy|'l3n9]!K138711set comm=Server.Createobject("ADODB.Command")51Testing软件测试网Wu;? p LR'KyX
    conn.open "Driver={Microsoft Access Driver (*.mdb)};DBQ="& _
    ~,~ rf*L3\138711Server.Mappath("/source_asp")&"/property/employee.mdb;"
    n[M6ssA138711comm.ActiveConnection=conn51Testing软件测试网\-ow7Sf
    comm.CommandType=adCmdText
    ;\ B'h4WKCv*B138711comm.CommandText="Insert Into employee (Job_ID,Fri_Name,Last_Name)"& _51Testing软件测试网4i O1X%}M_%W
    "Values(?,?,?);"51Testing软件测试网1] M(e6x#{7JHj
    set param=comm.CreateParameter("ID",adInteger,adParamInput,3)51Testing软件测试网4mVa0D:C`
    param.value=1451Testing软件测试网K0M v g#g
    comm.Parameters.Append param51Testing软件测试网]`5a1Q1UDc8H
    set param=comm.CreateParameter("FN",adVarChar,adParamInput,255,"bill")
    U"Kg u9kQu9F138711comm.Parameters.Append param
    c*fdS9E;y#mp.B!i [[7a138711set param=comm.CreateParameter("LN",adVarChar,adParamInput,255,"Gates")
    Dk&Xer9K+UYH138711comm.Parameters.Append param
    S h,P3S:C P138711comm.Execute
    f`O'K(e1V?%OP138711conn.close
    e*Mkjk138711"The folowing statments show the value of parametrs
    0~E7Q6M)H-{4g m138711dim i
    O._\(CM Bv|-e138711for i=0 to comm.parameters.count-1
    .cUiX*Y-{K-}2[138711response.write comm.parameters.item(i)&"$#@60;br$#@62;"51Testing软件测试网;a#s\;Z[|
    next
    lI*L'X)I138711  当然,我们在引用参数时也可以不用数字,而用前面在CreateParameter时定义的名字,例如:FN、ID等等。另外我们可以将上面的程序的显示部分改为
    a KR \2w+sv~c138711dim key51Testing软件测试网y(C1pI x'k+e
    for each key in comm.parameters51Testing软件测试网vn2F4R6h.~'_i]1V:|;e$O
    response.write key&"$#@60;br$#@62;"51Testing软件测试网R's g,QUUh$|?,\
    next
    0J5l3e7E8[138711  下面我想重点讲一讲StoredProcedure,它的强大足以让我们对它关注,当然这其中会涉及到一些SQLServer的知识

    NN~,AHoC13871151Testing软件测试网%~]'u:a}QGGoQ

    五、StoredProcedure51Testing软件测试网WU V(R7u x:w [ E7wCX
      在讨论StoredProcedure之前,我还要对Command对象的Execute方法的作用进行一下阐述,一般来说使用Command的Execute方法有三个目的。1、用于进行一些简单的处理,例如删除一条记录:51Testing软件测试网+o]1Q1c+r `9A0O"q
    comm.CommandType=AdCmdText51Testing软件测试网,~_+tI%EF&U3D%P
    comm.CommandText="Delect From employee Where Job_ID=1"
    6f9K/xa"R138711comm.execute
    'N6xAy;~X138711  这样的工作不需要返回什么东西。2、用于进行一些复杂的处理,例如进行一个Transact的设计,这类一般都是和StoredProcedure一同工作的,而且有输出参数和输入的参数,这也是我们本章的讨论主题。3、用于返回一个RecordSet对象,用于其它的处理,例如:51Testing软件测试网nprF?` j C1`
    comm.CommandType=AdCmdText
    N+Q7Fzr kXx*l[,B138711comm.CommandText="Delect From employee Where Job_ID=1"51Testing软件测试网6P+wvh+Mc.zR$D z
    set rs=comm.execute
    ,o`Lm-lM7e%D!s138711dim i51Testing软件测试网 O-_ Z7fF.j'v&}(n
    while not rs.EOF
    Qo3}a)w'kG138711for i=0 to rs.fileds.count-151Testing软件测试网w*yurk@:ut@
    response.write rs.fileds.item(i).value&","
    !H!cSU$a JS138711next51Testing软件测试网)C!i?o{`P Xbu
    response.write "$#@60;br$#@62;"51Testing软件测试网*I2tB0] J0pL
    rs.MoveNext
    uPQ1w9M#|]ib138711wend51Testing软件测试网;?(AP.T6H"S1TtA
      好了,还是让我们从新回到StoredProcedure的讨论上来。StoredProcedure是什么呢?它是一个预先存储的数据库执行动作集,在SQL的管理结构中,对于一个数据库下有几个部分,一个是数据表的集合、一个就是StoredProcedure的集合。将两者结合可以完成很多强大的功能。StoredProcedure其实是对传统的SQL语句的一种扩展,主要是在参数的输入与输出上。下面我大致的介绍一下StoredProcedure的语法结构和与Command对象的参数的传递问题。
    zR0Mr1qGf138711StoredProcedure的标准写法:(在SQL Server上用Query Analyzer执行)51Testing软件测试网B#e9DBc/Ew+H(f P-x
    Create Procedure Procedure_Name
    3J.ie1b3J9p:zV138711Define Parameter51Testing软件测试网1_3zkz"_$[
    As51Testing软件测试网#m!?g,rB,o0uq
    SQL Structure
    H F6hTK*eo)x138711上  面的语法结构中,Procedure_Name为存储结构的的名字,也是你将在Command中引用的名字。然后是定义输出和输入的参数。最后是一个SQL结构化语句。下面是一个StoredProcedure的例子,它无需输入的参数,也没有输出。51Testing软件测试网6W%_%U*J(l!GZ
    Create Procedure Del_User
    51Testing软件测试网\t2_y~5y

    51Testing软件测试网RK&KJ'as\

    51Testing软件测试网 ^u/a m/A?x

    ,I\ [[1@138711As
    3Vfp\2H138711Delect From Employee Where Job_ID=151Testing软件测试网{VL#}@!o#s lqw
    如果我们要删除指定的 Job_ID该怎么办呢?,这时我们需要给这个StoredProcedure输入的参数。51Testing软件测试网9B-W%x[^'W mVO
    Create Procedure Del_User151Testing软件测试网8S:OFm6I
    @intID int51Testing软件测试网~[#gZU
    As51Testing软件测试网v}@0f7jd8k
    Delect From Employee Where Job_Id = @intID
    }:x?4eF6l!vExW |,?138711好了,这里的@intJob就是一个输入的参数,它可以从外部接受输入的值,下面是给它输入的asp程序:
    !q1B] bD TFr138711set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网i!ck/@9Ii
    set comm=Server.CreateObject("ADODB.Command")
    +T [O)S,Q138711conn.ConnectionString="Driver={SQL Server};Server=ser;"& _
    _MA u^138711"uid=sa;pass=;database=employee "51Testing软件测试网X;qRe~F
    conn.open
    U PVF T/GO*i b_138711comm.ActiveConnection=conn
    *E%d9onuH3G&@#vz8X9\138711comm.CommandType=adCmdStoredProc
    t5W,rZ5\138711comm.CommandType="Del_User1"
    :QJ)N;CK7W.`pB138711"这里的名字就是前面在SQL Server中定义过的StoredProcedure的名字。
    .[2[y)L,^138711"下面就是参数的输入
    q V4F'g8`2St138711param=comm.CreateParameter("ID",adInt,adParamInput,4)
    X'_hhD138711"这里的adParamInput定义是最重要的。51Testing软件测试网^-F N,N&c]:RA
    Param.Value=1 "这里的值可以输入你想要的值,也可以用Request来获得
    l C:~|/T3A G wk138711Comm.Parameters.Append param
    K(p2x a+`R!`@a(U138711Comm.Execute
    +^ `%\'e5D8E)f+`9G)[138711  这样我们就可以向StoredProcedure传递参数了。有时在一个StoredProcedure中,还存在有输出的参数,下面是一个例子它返回一个Job_ID确定的Fri_Name的值
    q S k5|.d!T3y138711Create Procedure Get_fName
    rP@/yA138711@intID int
    aLX4f(UvQ0j6k138711@fName varChar Output "说明为输出的参数51Testing软件测试网*Qm1Iw ~,km8B(L:^
    As51Testing软件测试网C VRG%v3G%VM
    Select @fName = Fri_Name Where Job_ID = @intID
    A%\A7X8r$]*hA6C$ps2f138711它相应的asp程序也要改写为下面的形式
    Tif/^b2f#_138711set conn=Server.CreateObject("ADODB.Connection")
    M+~8d6Du_9H138711set comm=Server.CreateObject("ADODB.Command")
    :a2{XC@138711conn.ConnectionString="Driver={SQL Server};Server=ser;"&_
    '^:e.v1f(@%C138711"uid=sa;psss=;database=employee"
    C;y]$N5_\138711conn.open
    K!q:opSiB$o*q;y138711comm.ActiveConnection=conn
    9R+X&sa uV*SK%l138711comm.CommandType=adCmdStoredProc
    4S0R@^9Uz-P138711comm.CommandType="Get_fName"
    _f%o q"Kh[&f8Q1@$p1U138711"这里的名字就是前面定义过的StoredProcedure的名字。51Testing软件测试网w!P"U0^l)Pcg/{k
    "下面就是参数的输入51Testing软件测试网b.d+O"Y'jr9t0ya,lYf
    param=comm.CreateParameter("ID",adInt,adParamInput,4)51Testing软件测试网3T-T:t/NC-jo;]
    "这里的adParamInput定义是最重要的。
    ;I9I$`;RS!VP6dZ138711Param.Value=2 "这里的值可以输入你想要的值,也可以用Request来获得51Testing软件测试网2F,\7M?^i:D0yQ:K%|
    Comm.Parameters.Append param
    dJA#u8W138711param=comm.CreateParameter("fName",adVarchar,adParamOutput,255,"")
    Q"l7\*q2{qV#ZFW138711"这里的adParamOutput定义是最重要的。说明它是一个输出的参数,默认的值 为一空的字符串51Testing软件测试网7jWO["n0ku r
    comm.Parameters.Append param
    }p|W t,c138711Comm.Execute51Testing软件测试网\"~/X F;sg:Jh*y&u
    Response.Write "Job_Id为"¶m(0)&"的员工的首姓为"¶m(1)
    p,S'Z]&?138711  我给大家简单介绍了一下StoredProcedure的基本概念,但StoredProcedure比较复杂,如果你想进一步的深入,必须对SQL Server的结构体系有全面的了解。另外,我们并没有在上面的里子中体会到StoredProcedure的优势,很多人会认为那还不如用普通的方法,其实在构建很多企业级的应用时才能够体会到用StoredProcedure的强大和必要性,这里我举一个简单的例子。一个网络银行的数据库(onLoan)中有两个相关的表Loan表和LoanHistory表,loan表用于记录贷款的信息,而每一笔贷款的记录在Loan表中登记后都必须在LoanHistory表中登记,因为定期的结算都是使用LoanHistory表的。你也许会说那很好办啊。用两个Insert Into语句分别向两个表中插入记录不就行了吗!但要注意的是在这个应用中,若记录在任何的一个表中插入失败都必须将整个的过程给取消(也就是一个事务的取消),那么若仅简单的使用两个Insert Into语句的话,若是在第一个语句执行完毕后,在第二个语句尚未完成时就发生了故障,这时第一个语句产生的效果是没法消除的了。如果我们将这整个的过程定义为一个事务,事务没有完整的结束就Roll Back所有的影响不就达到了要求吗?这在SQL Server中可以用Begin Transaction和Commit Transaction来完成的,例子如下:51Testing软件测试网.xg-Kx3eb
    Create StoredProcedure insert_loan51Testing软件测试网1cE8K2f%E
    As
    dR,L4E&E.Np-W138711Begin transaction51Testing软件测试网a(s/EID3F.JSvt i
    Inset into Loan (Loan_ID,Loan_Data,Loan_amount)
    $VY_dV$a138711Values(?,?,?)
    a't8n#]1e7v:^-h/_138711Inset into Loan (Loan_ID,Loan_Data,Loan_amount,Loan_Describle)51Testing软件测试网2b-B*M"Q#m6c'E5r
    Values(?,?,?,?)51Testing软件测试网y,W6l!Dx8S,{w)L
    Commit Transaction51Testing软件测试网ZD,I+R+bdl
      好了,这看上去好象没有什么不同吧,但需要注意的是我们现在将两个Insert into语句作为了一个的事务来处理,只有两个Insert into语句都完成的话才是一个整体的事务结束,那么它才会去作用这个数据库中的两个表,若在事务中发生了故障的话,则所有的影响将取消(Roll Back)。好了,这样的处理是只有在SQL Server中用StoredProcedure才能完成的。ANSI的SQL当然就不行了。这里讲的大家可能不太明白,你可以参看SQL Server的手册来作更多的了解。
    N S6Lv GD5l,S138711  下面我们来看最后的一个对象─RecordSet对象,也是属性和方法最多的一个了。我们使用的频率也是最高的一个,在这之后,我还想谈谈ADO与ORACLE的一些问题。

    qN,Pw*Z2w:w!k138711

    0plCr:e*vK {t138711六、RecordSet对象51Testing软件测试网6C^+[Q3`y~+~
      写到这一篇的时候,我不禁想到了先贤的两句话,一句是孟子在曹刿论战中所说的:一鼓作气,再而衰,三而竭。这篇ADO总结报告的前五部分都是一鼓作气之作,不知这后面的再而衰部分是否能保持连续了。另外的一句是王安石在游褒禅山记中所说的:世之奇伟、瑰怪、非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。我们学习编程又何尝不是这样了,若非有志,能及于险远是不能真正掌握的。51Testing软件测试网2Gl-S5Q#Q
      好了,讲了这么多的题外话,还是让我们回到正题上来,我想,由于大家对RecordSet都有足够的认识,所以我就不象前面的几章中那样对它的每一个属性和方法都做完整的介绍,我想通过几个有代表性的编程实例来给大家讲一讲。
    7R2\8W8nQwZ,uo1387111、 方法51Testing软件测试网n?k{hj-e
    AddNew, CancelBatch, CancelUpdate, Clone, Close, Delete, GetRows, Move, MoveFirst, MoveLast, MoveNext, MovePrevious, NextRecordset, Open, Requery, Resync, Supports, Update, UpdateBatch
    51Testing软件测试网3Tjq7U2h/Q

    51Testing软件测试网)Jn&p e,J:{M

    51Testing软件测试网+^2Nyu"jqX`

    51Testing软件测试网n)Zx0Dp5D

    2、 属性51Testing软件测试网-ASD/\]5A
    AbsolutePage,AbsolutePosition,ActiveConnection,BOF,Bookmark, CacheSize, CursorLocation, CursorType, EditMode, EOF, Filter, LockType, MarshalOptions, MaxRecords, PageCount, PageSize, RecordCount, Source, State, Status
    51Testing软件测试网t cA?qw^4C)Ykl

    :@c)l [ eO EU1387113、 集合
    v2yn'J `138711Fields,Properties51Testing软件测试网4AN4i%x.]i$Eo

    (C#aH#\nB138711

    F`)u+~yc\!tz;d138711实例一:分页显示及导航:
    ? kiLZ138711
      为什么我要再提分页的这个问题呢?因为这是一个最基本的问题,虽然有很多关于分页的文章,但我觉得他们的方法偏于复杂。其实RecordSet的AbsolutePage就可以轻松的实现分页,当你指定了PageSize属性后,对AbsolutePage指定值就可以翻转到指定的页面。但是如果你想使用AbsolutePage的话,你必须在打开RecordSet对象之前将它的CursorLocation值设为adUseClient,这个属性是继承Connection对象的一个相同属性的。你也可以在打开Connection对象之前来设定它。下面是源代码,为了方便,我将导航栏独立成了一个子程序方便大家使用。51Testing软件测试网-CFJ)b;d
    $#@60;%51Testing软件测试网4i7yC J,aQ+k@(gp
    sub navigator(PageNo,Target)51Testing软件测试网;\8B'Dd6^?/r'j
    Response.Write "$#@60;table border=0$#@62;"
    ovJL*M&Y"X"G2G138711Response.Write "$#@60;tr$#@62;"
    C;g+Ry+a;x138711Response.Write "$#@60;td$#@62;"
    i%[-p1g:Y%GCLb0d138711if PageNo$#@62;1 then
    |tj7tXq(?a138711Response.write "$#@60;a href="&chr(34)&Target&"?Page=1"&chr(34)&"$#@62;┃第一页$#@60;/a$#@62;"
    9g:l,ZOH138711else
    ${,W{8N7~&?138711Response.Write "┃第一页"51Testing软件测试网7W!H'S(M[ X#L1Mb'w
    end if51Testing软件测试网5|;](v!o;q S-`1`
    Response.Write "$#@60;/td$#@62;"51Testing软件测试网*l*h e}%O
    Response.Write "$#@60;td$#@62;"51Testing软件测试网Dc+j5F8al6@)Z
    if PageNo$#@60;rs.PageCount then
    y]e:a ip138711Response.write"$#@60;a href="&chr(34)&Target&"?Page="&PageNo+1&chr(34)&"$#@62;┃下一页$#@60;/a$#@62;"51Testing软件测试网^bZf },Ry ? N
    else51Testing软件测试网xY"Q-DCB8k
    Response.Write "┃下一页"
    W+qU\%?,Z/r138711end if51Testing软件测试网5X!e3JwPwVc
    Response.Write "$#@60;/td$#@62;"51Testing软件测试网x y8N/?Q+h/m(?
    Response.Write "$#@60;td$#@62;"
    :m [;iG3w|iV_ ~138711if PageNo$#@62;1 then
    B"zg8O+o"K138711Response.write "$#@60;a href="&chr(34)&Target&"?Page="&PageNo-1&chr(34)&"$#@62;┃前一页$#@60;/a$#@62;"51Testing软件测试网u*wPzBH7oJxx eX
    else
    -Ix$~-hJL$C138711Response.Write "┃前一页"
    $R~0Wb }138711end if
    8KC}`#nh4F:yu?138711Response.Write "$#@60;/td$#@62;"51Testing软件测试网 n6a4y#H[Y
    Response.Write "$#@60;td$#@62;"51Testing软件测试网~0RJ7dU)x1AN
    if PageNo$#@60;rs.PageCount then
    m{,c;i\t r138711Response.write "$#@60;a href="&chr(34)&Target&"?Page="&rs.PageCount&chr(34)&"$#@62;┃最后一页$#@60;/a$#@62;"51Testing软件测试网2~#wRt(h
    else51Testing软件测试网*r3`:t+A-Bat-w
    Response.Write "┃最后一页"51Testing软件测试网J-Uf(kH a!I2m
    end if
    4\`2A*Q2R l138711Response.Write "$#@60;/td$#@62;"
    )C+g8IKx/W [4oz @B6t138711Response.Write "$#@60;td$#@62;"
    {K[E0qK138711Response.Write "┃页次:"&PageNo&"/"&rs.PageCount&"页┃"&rs.PageSize&"条记录/页┃"51Testing软件测试网#U)NO(e5h9w6\&Z9O
    Response.Write "$#@60;/td$#@62;"51Testing软件测试网)]D X.qSU uC2| M!H h
    Response.Write "$#@60;td valign="middle"$#@62;"51Testing软件测试网Oa5e;D i{w
    Response.Write "$#@60;form. action="&chr(34)&Target&chr(34)&" method="&chr(34)&"POST"&chr(34)&"$#@62;"
    6U)[&zTh G138711Response.Write "$#@60;input type="text"size=3 maxlength=4 name="Page"$#@62;"51Testing软件测试网+T;DB4}$Z{)a ~ s
    Response.Write " $#@60;input type="submit"value="转到"$#@62;"51Testing软件测试网`D Cl(Le
    Response.Write "$#@60;/form$#@62;"51Testing软件测试网6r OS/B@Su_o
    Response.Write "$#@60;/td$#@62;"
    dyED/`:LW138711Response.Write "$#@60;/tr$#@62;"
    U.U/A7B t^/z,Z138711Response.Write "$#@60;/table$#@62;"51Testing软件测试网^h rR5kH'h5c
    end sub
    R9D`"Bl,j138711%$#@62;
    51Testing软件测试网*v5XTJ^:X*^

    q"i6i G [@9Q.Rn]13871151Testing软件测试网&Bv_][*lfH

    51Testing软件测试网I&r PPs Z"?

    $#@60;%
    yGe3Z,e y4f138711const adCmdText=&H0001
    F9w&M(Lt138711const adVarChar=200
    "jcBx(C0\)Gw138711const adInteger=3
    3C ]!dXX138711const adParamInput=&H000151Testing软件测试网&WoS(P fW X"HTE
    const adCmdTable=&H0002
    .`&?x9O$v~7[+NQ138711const adUseClient=351Testing软件测试网o#t"nPZ"H[H0{xJ
    const adDate=7
    oC Mo9]Y138711const adLongVarChar=20151Testing软件测试网0g3mD9TJ
    set conn=Server.CreateObject("ADODB.Connection")51Testing软件测试网a/| \1Ov:?8`'m
    conn.ConnectionString="Driver={Microsoft Access Driver (*.mdb)};DBQ="& _
    CL3KG6EcQ138711Server.Mappath("/source_asp")&"/process/process.mdb;"
    &GtF@$B*L/|Q H;z138711conn.Open
    Eoy5L l`(g-xtW138711%$#@62;

    d9J l3q$i wf?13871151Testing软件测试网~m;vdqn'L X {

    $#@60;%51Testing软件测试网^!X:a$w%Nb$W
    const MaxPageSize=5
    ![Ms1r*\q5[138711%$#@62;51Testing软件测试网 QO-uIxPp
    $#@60;html$#@62;51Testing软件测试网p0B8O}Xc.Hp1G
    $#@60;head$#@62;
    @{ B7r@,dOi138711$#@60;title$#@62; See Book $#@60;/title$#@62;
    h*NQ&klU)E138711$#@60;/head$#@62;
    oPPm&Cc138711$#@60;body$#@62;51Testing软件测试网@%fR2iU v+MH
    $#@60;%51Testing软件测试网Nrt |$Yvy
    dim i,j,PageNo
    tj(n*KTt138711set rs=Server.CreateObject("ADODB.RecordSet")51Testing软件测试网,w.F kk B#~o
    rs.ActiveConnection=conn
    M,DD'O#M%@7L138711rs.CursorLocation=adUseClient
    ,`1zG4kxuU138711rs.Open "Select * From books",,,adCmdText
    6[(o3_/wzK+ew138711if rs.BOF then51Testing软件测试网SE&o,P c0Y
    Response.Write "欢迎使用图书,资料管理程序!"51Testing软件测试网9n.UTP;W!rt
    else51Testing软件测试网J6`3w h,D"dI
    rs.PageSize=MaxPageSize
    D2G+kF%i138711if isempty(Request.QueryString("Page")) then51Testing软件测试网dz[&S u2y ar7m
    PageNo=151Testing软件测试网:n``4P Tr#JX_
    elseif cInt(Request.QueryString("Page"))$#@60;1 then
    J+z lkK2x138711PageNo=1
    kl` rh-Nj B5^D138711elseif cInt(Request.QueryString("Page"))$#@62;rs.PageCount then
    A5E$w+EjQ P P138711PageNo=rs.PageCount51Testing软件测试网0O7S^4oTJ5y$Q]
    else
    2p n~?P/arw.l138711PageNo=cInt(Request.QueryString("Page"))
    ?%W:rA#X(I3T6bIq138711end if
    4H.P#~7i&V@(l138711if Request.ServerVariables("Request_Method")="POST" and not Isempty(Request.Form("Page")) then
    @ V9N S]N3R138711PageNo=cInt(Request.Form("Page"))
    %Y2C&K?Sp)S"a(n138711end if
    cU'\ O]#T138711rs.AbsolutePage=PageNo
    vD xK:s138711Response.Write "$#@60;table border="0" width="100%"$#@62;"
    1IX'W,M.Xi8R&M138711Response.Write "$#@60;tr$#@62;$#@60;td colspan="&rs.fields.count&"$#@62;"
    v#[U+~!m f8X8k138711Target="books.asp"
    c&hcG*|_ O138711call navigator(PageNo,Target) "调用导航栏
    &vhNp#t,{A EF138711Response.Write "$#@60;/td$#@62;$#@60;/tr$#@62;"51Testing软件测试网r`9[]"u
    Response.Write "$#@60;tr$#@62;"51Testing软件测试网,]%dQw }[ CM_
    for i=0 to rs.fields.count-1
    $_ q#@9Fz138711Response.Write "$#@60;td$#@62;"&rs.fields.item(i).name&"$#@60;/td$#@62;"
    `,^[o_WVF)s#}138711next
    F$\Z/R:bhh138711Response.Write "$#@60;/tr$#@62;"51Testing软件测试网)I4B'Ij8C/a.So!E(Ei
    j=051Testing软件测试网%Uh$zokS
    while (not rs.EOF) and j$#@60;rs.PageSize51Testing软件测试网y1_8Q/^c7epi~4dg]
    Response.Write "$#@60;tr$#@62;"
    S w2]'s-e4`138711for i=0 to rs.fields.count-151Testing软件测试网'b,n.g7l3^@3A
    if i=1 then
    StwN0o/at"DCGB138711Response.Write "$#@60;td$#@62;"&"$#@60;a href="&chr(34)&"status.asp?BookName="& _51Testing软件测试网Y,[)qi|]~/B
    rs.fields.item(i).value&chr(34)&"$#@62;"&rs.fields.item(i).value&"$#@60;/a$#@62;$#@60;/td$#@62;"
    iO${.z9@I3}z'Z? P138711"这里这样写是为了级联式查询而做的。
    T0fjGxj138711else
    uqW%QT M138711Response.Write "$#@60;td$#@62;"&rs.fields.item(i).value&"$#@60;/td$#@62;"51Testing软件测试网G?8V{J
    end if
    Q1ncU5K7g2IO(w9l?138711next
    Dajs(gEL$~138711Response.Write "$#@60;/tr$#@62;"
    :SE[e;x8FW.d:V)z o:m138711rs.MoveNext51Testing软件测试网{X+Up'o sg8u
    j=j+1
    PD;^b8Ru J*e138711wend
    .LL2G!E,u'w/?138711Response.Write "$#@60;/table$#@62;"
    %y/h'T p7{qt }x138711end if
    "REkm.e IjD;_138711%$#@62;

  • (转)用ADO连接数据库的三种方法及其性能比较

    2009-03-30 15:54:56

    ado连接数据库通常有三种方法:system dsn connection,dsn-less connection 和 ole db connection,这是大家都很熟悉的,它们的使用方法如下:

    (注:三种方法的区别在于使用的是哪个关键字 - dsn,driver,data source,provider。uid,pwd 是 odbc 的标记,user id,password 是 oledb 的标记。特别指出的是 data source 在 odbc 标记中表示数据源,等同于 dsn,在 oledb 标记中表示服务器名或数据库名。)

    'system dsn connection

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

    cnn.open "dsn=your_dsn;uid=user_name;pwd=password;"

    '或者用 oledb 标记

    cnn.open "data source=your_dsn;user id=user_name;password=password;"

      

    'dsn-less connection

    '以sql server为例

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

    cnn.open "driver={sql server};server=server_name;uid=user_name;pwd=pwd;database=pubs"

    'ole db connection

    '以sql server为例

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

    cnn.open "provider=sqloledb;data source=server_name;initial catalog=pubs;user id=user_name;password=pwd;"

    下面,我们讨论一下它们各自的性能。

    从本质上说,system dsn 和 dsn-less connection 都是通过 odbc 与数据库进行连接的,它们之间区别不大(事实上也确实如此)。有很多人说 dsn-less connection 要优于 system dsn connection,对这一点我不反对。(是不是前后有些矛盾,刚说它们区别不大,现在又......)我曾经分别对这两种连接测试过,但是失败了。因为我的测试数据没有规律,根本说明不了问题(或许用假设检验能比较两者的性能,不过得算死)。于是我得出了结论:没有结论!后来在网上看到一篇文章 system dsn or dsn-less connection? 算是有了答案。

    结论就是(这是原文):

    these tests showed that dsn-less connection were slightly faster than system dsn connections.the increase in performance was nothing monumental;the greatest performance boost was mere 13% faster with 64 concurrent requests.for one,two,or four concurrent requests,there was virtually no performance improvement.in fact,no noticeable improvement is seen in a dsn-less connection over a system dsn until there are 10 or more concurrent connections.

    为什么?因为 system dsn 在连接时要读注册表。

    现在只有ole db没有说了(打字真累)。ole db 比 odbc 要高效的多。

    根本不用测试,这个结论是显而易见的。如果你还有些怀疑,建议去看看 连接池(connection pooling)介绍 那里有 mdac framework 的图示,从图中可以看出,经 odbc 连接是 ado-->ole db-->odbc provider-->odbc-->driver-->数据库;经 ole db 是 ado-->ole db-->db provider-->数据库。哪个更直接?当然是 ole db!

    ole db 连接数据库比 odbc 快,检索数据比 odbc 快。所以,我建议每一个在网上安家的人:用ole db!

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

    'connection string for sql server

    cnn.open "provider=sqloledb;data source=srvname;initial catalog=dbname;user id=user_id;password=yourpassword;"

    'for access

    cnn.open "provider=microsoft.jet.oledb.4.0;data source=db_path"

    连接数据库就是这么容易!

    Deer 08:47:54
    'for Access
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db_path"


    1.
    set dbconnection=Server.CREATEOBJECT("ADODB.CONNECTION")
    DBPath = Server.MapPath("customer.mdb")
    dbconnection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
    SQL="select * from auth where id="" & user_id &"""
    SET uplist=dbconnection.EXECUTE(SQL)

    2.
    set dbconnection=Server.CreateObject("ADODB.Connection")
    DBPath = Server.MapPath("customer.mdb")
    dbconnection.Open "provider=microsoft.jet.oledb.4.0;data source="&dbpath
    SQL="select * from auth where id="" & user_id &"""
    SET uplist=dbconnection.EXECUTE(SQL)

    3.
    DBPath = Server.MapPath("customer.mdb")
    set session("rs")=Server.CreateObject("ADODB.Recordset")
    " rs=Server.CreateObject("ADODB.Recordset")
    connstr="provider=microsoft.jet.oledb.4.0;data source="&dbpath
    SQL="select * from auth where id="" & user_id &"""
    session("rs").Open sql,connstr,1,3

    4.
    建odbc源xxx
    set conn=server.createobject("Adodb.connection")
    conn.open "DSN=xxx;UID=;PWD=;Database=customer"

  • (转)防范SQL注入式攻击

    2009-03-21 17:01:33

    防范SQL注入式攻击

    SQL注入式攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql命令以及进行其他方式的攻击动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。

    比如:
    如果你的查询语句是select * from admin where username="&user&" and password="&pwd&""

     那么,如果我的用户名是:1 or 1=1
     那么,你的查询语句将会变成:

     select * from admin where username=1 or 1=1 and password="&pwd&""

     这样你的查询语句就通过了,从而就可以进入你的管理界面。

    所以防范的时候需要对用户的输入进行检查。特别式一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤。

    需要过滤的特殊字符及字符串有:

       net user
       xp_cmdshell
       /add
       exec master.dbo.xp_cmdshell
       net localgroup administrators
       select
       count
       Asc
       char
       mid
      
       :
       "
       insert
       delete from
       drop table
       update
       truncate
       from
       %

    下面关于解决注入式攻击的防范代码,供大家学习参考!

    js版的防范SQL注入式攻击代码:

      
    <scrīpt language="javascrīpt">
    <!--
     var url = location.search;
     var re=/^\?(.*)(select%20|insert%20|delete%20from%20|count\(|drop%20table|update%20truncate%20|asc\(|mid\(|char\(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|\"|:|net%20user|\|%20or%20)(.*)$/gi;
     var e = re.test(url);
     if(e) {
      alert("地址中含有非法字符~");
      location.href="error.asp";
     }
    //-->
    <scrīpt>


    asp版的防范SQL注入式攻击代码~:

    [CODE START]
    <%
    On Error Resume Next
    Dim strTemp

    If LCase(Request.ServerVariables("HTTPS")) = "off" Then
     strTemp = "http://"
    Else
     strTemp = "https://"
    End If

    strTemp = strTemp & Request.ServerVariables("SERVER_NAME")
    If Request.ServerVariables("SERVER_PORT") <> 80 Then strTemp = strTemp & ":" & Request.ServerVariables("SERVER_PORT")

    strTemp = strTemp & Request.ServerVariables("URL")

    If Trim(Request.QueryString) <> "" Then strTemp = strTemp & "?" & Trim(Request.QueryString)

    strTemp = LCase(strTemp)

    If Instr(strTemp,"select%20") or Instr(strTemp,"insert%20") or Instr(strTemp,"delete%20from") or Instr(strTemp,"count(") or Instr(strTemp,"drop%20table") or Instr(strTemp,"update%20") or Instr(strTemp,"truncate%20") or Instr(strTemp,"asc(") or Instr(strTemp,"mid(") or Instr(strTemp,"char(") or Instr(strTemp,"xp_cmdshell") or Instr(strTemp,"exec%20master") or Instr(strTemp,"net%20localgroup%20administrators")  or Instr(strTemp,":") or Instr(strTemp,"net%20user") or Instr(strTemp,"") or Instr(strTemp,"%20or%20") then
     Response.Write "<scrīpt language=javascrīpt>"
     Response.Write "alert(非法地址!!);"
     Response.Write "location.href=error.asp;"
     Response.Write "<scrīpt>"
    End If
    %>
    [CODE END]





    C# 检查字符串,防SQL注入攻击
    这个例子里暂定为=号和号
    bool CheckParams(params object[] args)
    {
        string[] Lawlesses={"=",""};
        if(Lawlesses==null||Lawlesses.Length<=0)return true;
        //构造正则表达式,例:Lawlesses是=号和号,则正则表达式为 .*[=}].*  (正则表达式相关内容请见MSDN)
        //另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;

        string str_Regex=".*[";
        for(int i=0;i< Lawlesses.Length-1;i++)
            str_Regex+=Lawlesses[i]+"|";
        str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
        //
        foreach(object arg in args)
        {
            if(arg is string)//如果是字符串,直接检查
            {
                if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
                return false;
            }
            else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
            {
                foreach(object obj in (ICollection)arg)
                {
                    if(obj is string)
                    {
                        if(Regex.Matches(obj.ToString(),str_Regex).Count>0)
                        return false;
                    }
                }
            }
        }
        return true;
  • (转)SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)

    2009-01-21 10:20:58

    最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想~
    现在在这写写关于它们的作用
    假设有如下表:


    一个为投票主表,一个为投票者信息表~记录投票人IP及对应投票类型,左右连接实际说是我们联合查询的结果以哪个表为准~
    1:如右接连 right join 或 right outer join:

    我们以右边voter表为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存在时才会显示出来,如上图,左边中ID为3.4.5.6因为这些ID右表中没有相应记录,所以没有显示!
    2:因此我们自然能理解左连接 left join 或者 left outer join

    可见,现在右边中ID在中存在时才会显示,当右边中没有相应数据时则用NULL代替!
    3:全连接 full join 或者 full outer join,为二个表中的数据都出来,这里演示效果与上一样!
    4:内连接 inner join 或者 join;它为返回字段ID同时存在于表voteMaster 和 voter中的记录

    5:交叉连接(完全连接)cross join 不带 where 条件的
    没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生6*3=18条记录)

    等价select vm.id,vm.voteTitle,vt.ip from voteMaster as vm,voter as vt

    6:自连接。在这里我用我前段时间一个电力项目中的例子(改造过)
    如下表:

    这是一个部门表,里面存放了部门及其上级部门,但都放在同一张表中,我们假设现在需要用SQL查询出各部门及其上级部门!就如何做,
    当然,不用自连接也一样,可以如下:

    我们达到预期目的!在这个查询中使用了一个子查询完成对上级部门名的查询,如果使用自连接,那么结构上感觉会清晰很多。

    是不是也同样完成了功能呢,这里除了使用自连接外,还使用了左连接,因为省电力没有上级部门,他是老大,如果使用内连接,就会把这条记录过滤掉,因为没有和他匹配的上级部门。
    自连接用的比较多的就是对权形结构的查询!类似上表!
  • (转)面试中要懂的SQL语句

    2009-01-20 16:43:23

    面试必须要知道的SQL语法,语句
    前言:书里有的、书里没的,统统在此可以一浏。
    asc 按升序排列
    desc 按降序排列
    下列语句部分是Mssql语句,不可以在access中使用。
    SQL分类:
    DDL—数据定义语言(Create,Alter,Drop,DECLARE)
    DML—数据操纵语言(Select,Delete,Update,Insert)
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
    首先,简要介绍基础语句:
    1、说明:创建数据库
    Create DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表drop table tabname
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)
    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    B: EXCEPT 运算符
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。
    12、说明:使用外连接
    A、left outer join:
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    sql: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
    其次,大家来看一些不错的sql语句
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a
    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;
    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    7、说明:在线视图查询(表名1:a )
    select * from (Select a,b,c FROM a) T where t.a > 1;
    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2
    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
    12、说明:日程安排提前五分钟提醒
    sql: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    14、说明:前10条记录
    select top 10 * form. table1 where 范围
    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC) 17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1

    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize
    RNumber = Int(Rnd*499) +1
     
    While Not objRec.EOF
    If objRec("ID") = RNumber THEN
    ... 这里是执行脚本 ...
    end if
    objRec.MoveNext
    Wend
     
      这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize
    RNumber = Int(Rnd*499) + 1
     
    sql = "Select * FROM Customers Where ID = " & RNumber
     
    set ōbjRec = ObjConn.Execute(SQL)
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
    再谈随机数
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    sql = "Select * FROM Customers Where ID = " & RNumber & " or ID = " & RNumber2 & " or ID = " & RNumber3
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 Select 语句只显示一种可能(这里的ID 是自动生成的号码):
    sql = "Select * FROM Customers Where ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    随机读取若干条记录,测试过
    Access语法:Select top 10 * From 表名 orDER BY Rnd(id)
    sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:Select iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

    1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
      BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
Open Toolbar