怎么查看数据库?
USE pubs
在没有再次使用USE语句来改变当前数据库以前,后面的每一行操作语句都将针对pubs数据库执行。使用系统存储过程sp_helpdb可以查看当前服务器上所有数据库的信息,如果指定了数据库的名字则返回指定数据库的信息。
使用系统存储过程sp_databases可以查看当前服务器上所有可以使用的数据库。
使用系统存储过程sp_helpfile可以查看当前数据库上所有文件(包括数据文件和日志文件)的信息。如果指定了文件的名字,则返回该文件的信息。
使用系统存储过程sp_helpfilegroup可以查看当前数据库上所有文件组,包括Primary文件组和User_defined文件组的信息。如果指定了文件组的名字,则返回该文件组的信息。
可以使用企业管理器来查看更详细的有关数据库的信息,方法是:
(1) 选中要查看的数据库。
(2) 从操作菜单或快捷菜单中选择属性命令,弹出如图34所示的对话框。从中可以查看或者修改数据文件、日志文件、文件组及使用权限等属性。
图34 数据库的属性查看
34 管理数据库
创建好数据库,也许使用一段时间之后,发现此数据库的文件容量不敷使用、此数据库已经有一段时间不用了等相关事情发生时,就必须要针对数据库来进行管理。
341 修改数据库大小
SQL Server 2000的数据文件可以自动扩充长度,所以数据库的大小也会自动增加。但是如果设置了最大文件长度,则数据库的扩充依然是有必要进行的操作。修改数据库的大小实质上是修改数据文件和日志文件的长度,或者增加/删除操作系统文件。这种操作可以通过下面的语法来实现:
ALTER DATABASE database
{ ADD FILE <filespec> [,n] [TO FILEGROUP filegroup_name]
| ADD LOG FILE <filespec> [,n]
| REMOVE FILE logical_file_name
| ADD FILEGROUP filegroup_name
| REMOVE FILEGROUP filegroup_name
| MODIFY FILE <filespec>
| MODIFY FILEGROUP filegroup_name filegroup_property
}
<filespec> ::=
(NAME = logical_file_name
[, FILENAME = 'os_file_name' ]
[, SIZE = size]
[, MAXSIZE = { max_size | UNLIMITED } ]
[, FILEGROWTH = growth_increment] )
下面的例子在Company数据库的默认文件组Primary文件组里,增加了一个数据文件。
ALTER DATABASE Company
ADD FILE
(
NAME = Test1dat2,
FILENAME = 'e:\program files\Microsoft sql server\mssql\data\t1dat2ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
GO
下面的例子在Company数据库的ComGroup1文件组里增加了两个数据文件,并将该文件组设置为默认文件组。
ALTER DATABASE Company
ADD FILE
( NAME = test1dat3,
FILENAME ='e:\program files\Microsoft sql server\mssql\data\t1dat3ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB),
( NAME = test1dat4,
FILENAME = 'e:\program files\Microsoft sql server\mssql\data\t1dat4ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB)
TO FILEGROUP ComGroup1
ALTER DATABASE Company
MODIFY FILEGROUP ComGroup1 DEFAULT
GO
下面的例子将Company数据库中test1dat3数据文件的长度改变为20MB。
ALTER DATABASE Company
MODIFY FILE
(NAME = test1dat3,
SIZE = 20MB)
GO
同样的操作可以在企业管理器中进行,方法如下。
(1) 选中要查看的数据库。
(2) 从主菜单或快捷菜单中选择属性命令,弹出如图34 所示对话框。
(3) 在数据文件选项卡中增删数据文件或对其属性进行修改。
(4) 在事务日志选项卡上增删日志文件或对其属性进行修改。
342 收缩数据库
SQL Server 2000数据库在长时间使用后数据文件和日志文件会非常庞大,同时删除了大量的数据后,数据文件的大小并没有自动变小。SQL Server 2000提供了手段来缩小过于庞大的数据库,以回收没有使用的数据页。可以用手动的方法单独缩小某一个数据文件,也可以缩小整个文件组的长度。还可以设置数据库在达到一定大小之前自动执行缩小操作。
使用企业管理器完成缩小数据库的方法如下。
(1) 从指定服务器上展开数据库节点,选中要执行缩小操作的数据库。
(2) 从快捷菜单中选择所有任务|收缩数据库命令,弹出如图35所示的对话框。
图35 缩小数据库
选择执行数据库缩小操作的方式:
l 收缩后文件中的最大可用空间微调框 在进行过数据库收缩后,文件中还可以利用的空间。
l 在收缩前将页移到文件起始位置复选框 把含有数据的数据页都移动到文件的开头。
l 收缩文件选项组 为了进行更精确的文件大小控制,针对每个单独的数据库文件进行收缩,具体方法是:单击文件按钮,弹出如图36所示的对话框。
图36 针对文件进行收缩
可以在这个对话框中选择针对文件执行收缩操作的不同方式,也可以设置执行收缩操作的时间,把执行数据库收缩的时间安排在数据库存取不那么频繁的时段。
343 备份数据库
数据对于用户来说是非常宝贵的资产。数据是存放在计算机上的,但是即使是最可靠的硬件和软件,也会出现系统故障或产品故障。所以,应该在意外发生之前做好充分的准备工作,以便在意外发生之后有相应的措施能快速地恢复数据库的运行,并使丢失的数据量减少到最小。
通过企业管理器来备份数据库的操作如下:
(1) 选中指定的数据库,选择工具|备份数据库命令,弹出如图37所示的对话框。
图37 进行数据库备份
(2) 在该对话框可以更换需要备份的数据库,输入备份的名字和对备份的描述,选择备份的类型。
(3) 单击添加按钮选择要备份的设备,如图38所示。
图38 选择备份设备
在这个对话框中可以创建新的备份设备。用户可以一次选择多个设备,将数据库备份到多个设备上。也可以将数据库备份到指定的文件。
(4) 在图37所示的对话框的重写选项组里,选择在设备上进行操作的方式,可以选择追加到媒体单选按钮,将新的备份添加到备份设备中以前备份的后面(不影响原来的备份);也可以选择重写现有媒体单选按钮,用新的备份覆盖原来的备份。
(5) 选中调度复选框,用户可以拟订自动进行备份操作的时间,单击右边的按钮用户可以自主设计自动进行备份操作的时间,如图39所示。完成设置后单击确定按钮,回到数据库备份界面。
图39 设置自动备份
(6) 单击确定按钮,完成备份操作。
344 恢复数据库
使用SQL Server 2000可以很方便地实现数据库的恢复,步骤如下。
(1) 选中指定的数据库,选择工具|还原数据库命令,弹出对话框如图310所示的对话框。
图310 还原数据库
(2) 可以选择要进行还原的数据库。在参数选项组中,用户可以选择利用哪个数据库备份来执行数据库的恢复操作。如果是利用事务日志来进行恢复,还可以选择恢复数据库到某一指定时刻的状态。如果是从设备(文件)恢复数据库,可以在还原选项中选择从设备单选按钮,如图311所示。
图311 从设备还原数据库
单击选择设备按钮,如图312所示。单击添加按钮可以选择还原的文件名称。完成后单击确定按钮。
图312 选择设备
(3) 单击确定按钮完成数据库的恢复。
1数据库可以和网页文件放在一起,也可以放在db文件夹里
2如果放在DB文件夹里,那么在创建数据库链接的时候改一下数据库路径,比如"\DB\XXXmdb"
3能否被人下载就要看你程序的安全性了
什么是数据库?
数据库是以某种文件结构存储的一系列信息表,这种文件结构使您能够访问这些表、选择表中的列、对表进行排序以及根据各种标准选择行。数据库通常有多个 索引与这些表中的许多列相关联,所以我们能尽可能快地访问这些表。
以员工记录为例,您可以设想一个含有员工姓名、地址、工资、扣税以及津贴等内容的表。让我们考虑一下这些内容可能如何组织在一起。您可以设想一个表包含员工姓名、地址和电话号码。您希望保存的其它信息可能包括工资、工资范围、上次加薪时间、下次加薪时间、员工业绩评定等内容。
这些内容是否应保存在一个表格中?几乎可以肯定不应该如此。不同类别的员工的工资范围可能没有区别;这样,您可以仅将员工类型储存在员工记录表中,而将工资范围储存在另一个表中,通过类型编号与这个表关联。考虑以下情况:
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,00000 $45,00000
Johnson $30,00000 $45,00000
Wolff $45,00000 $60,00000
Adams $45,00000 $60,00000
Smyth $60,00000 $75,00000
我们发现,获得这些表的查询形式如下所示
SELECT DISTINCTROW EmployeesName, SalaryRangesMin,
SalaryRangesMax FROM Employees INNER JOIN SalaryRanges ON EmployeesSalaryKey = SalaryRangesSalaryKey
ORDER BY SalaryRangesMin;
这种语言称为结构化查询语言,即 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 的类都被归到 javasql 包中,在安装 Java JDK 14时会自动安装。然而,如果您想使用 JDBC-ODBC 桥。JDBC-ODBC 驱动程序可从 Sun 的 Java 网站 (http://javasuncom/) 轻松地找到并下载。在您扩充并安装了这个驱动程序后,必须执行下列步骤:
将 \jdbc-odbc\classes; 路径添加到您的 PATH 环境变量中。
将 \jdbc-odbc\classes; 路径添加到您的 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 注册您的数据库
连接数据库
所有与数据库有关的对象和方法都在 javasql 包中,因此在使用 JDBC 的程序中必须加入 "import javasql "。 JDBC 要连接 ODBC 数据库,您必须首先加载 JDBC-ODBC 桥驱动程序
ClassforName("sunjdbcodbcJdbcOdbcDriver");
该语句加载驱动程序,并创建该类的一个实例。然后,要连接一个特定的数据库,您必须创建 Connect 类的一个实例,并使用 URL 语法连接数据库。
String url = "jdbc:odbc:Northwind";
Connection con = DriverManagergetConnection(url);
请注意,您使用的数据库名是您在 ODBC 设置面板中输入的“数据源”名称。
URL 语法可能因数据库类型的不同而变化极大。
jdbc:subprotocol:subname
第一组字符代表连接协议,并且始终是 jdbc。还可能有一个子协议,在此处,子协议被指定为 odbc。它规定了一类数据库的连通性机制。如果您要连接其它机器上的数据库服务器,可能也要指定该机器和一个子目录:
jdbc:bark//doggie/elliott
最后,您可能要指定用户名和口令,作为连接字符串的一部分:
jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof
访问MSSQL Server方法:(驱动程序需要:msutiljar,msbasejar,mssqlServerjar)
DBDriver=commicrosoftjdbcsqlserverSQLServerDriver
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 = DbOgetConnection();
//类代码(不含连接工厂实现)
package skydevmodulesdata;
public final class SqlServerConnectionFactory
extends ConnectionFactory {
private final String dbDriver =
"commicrosoftjdbcsqlserverSQLServerDriver";
private String host;
private int port;
private String databaseName;
public SqlServerConnectionFactory() {
supersetDriverName(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) {
thissetHost(host);
thissetPort(port);
thissetDatabaseName(databaseName);
thissetUserName(userName);
thissetPassword(password);
init();
}
private void init() {
supersetDriverName(dbDriver);
supersetUrl("jdbc:microsoft:sqlserver://" + hosttrim() + ":" +
new Integer(port)toString() + ";DatabaseName=" +
databaseNametrim());
//supersetUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo");
}
……
//------------------------------------------------------------------------------------
访问MySQL的方法:
DBDriver=commysqljdbcDriver
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 = resultsgetMetaData();
numCols = rsmdgetColumnCount();
当您获得一个 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 =dmagetTables(catalog, schema, tablemask, types[]);
其中参数的意义是:
Catalog 要在其中查找表名的目录名。对于 JDBC-ODBC 数据库以及许多其他数据库而言,可将其设置为 null。这些数据库的目录项实际上是它在文件系统中的绝对路径名称。
Schema 要包括的数据库“方案”。许多数据库不支持方案,而对另一些数据库而言,它代表数据库所有者的用户名。一般将它设置为 null。
Tablemask 一个掩码,用来描述您要检索的表的名称。如果您希望检索所有表名,则将其设为通配符 %。请注意,SQL 中的通配符是 % 符号,而不是一般 PC 用户的 符号。
types[] 这是描述您要检索的表的类型的 String 数组。数据库中通常包括许多用于内部处理的表,而对作为用户的您没什么价值。如果它是空值,则您会得到所有这些表。如果您将其设为包含字符串“TABLES”的单元素数组,您将仅获得对用户有用的表格。
一个简单的 JDBC 程序
我们已经学习了 JDBC 的所有基本功能,现在我们可以编写一个简单的程序,该程序打开数据库,打印它的表名以及某一表列的内容,然后对该数据库执行查询。此程序如下所示:
package skydevkit;
import javasql;
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 桥驱动程序
ClassforName("sunjdbcodbcJdbcOdbcDriver");
con = DriverManagergetConnection(url);//连接数据库
dma = congetMetaData();//获取数据库的元数据
Systemoutprintln("Connected to:" + dmagetURL());
Systemoutprintln("Driver " + dmagetDriverName());
} catch (Exception e) {
Systemoutprintln(e);
}
try {
Statement stmt = concreateStatement();
results = stmtexecuteQuery("select from 客户;");
ResultSetMetaData resultMetaData = resultsgetMetaData();
int cols = resultMetaDatagetColumnCount();
String resultRow = "";
for (int i = 1; i < cols; i++) {
resultRow += resultMetaDatagetColumnName(i) + ";";
}
Systemoutprintln(resultRow);
while (resultsnext()) {
resultRow = "";
for (int i = 1; i < cols; i++) {
try {
resultRow += resultsgetString(i) + ";";
} catch (NullPointerException e) {
Systemoutprintln(egetMessage());
}
}
Systemoutprintln(resultRow);
}
} catch (Exception e) {
Systemoutprintln("query exception");
} finally {
resultsclose();
}
}
}
补充高级内容
关于调用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 = DbOgetConnection();
CallableStatement pstmt = null;
Systemoutprintln("TestDB1()");
/ try {
pstmt = conprepareCall("{call sp_getStudentById()}");
pstmtsetInt(1, 1);
}/
try {
pstmt = conprepareCall("{call sp_getStudentByName()}"); //注意参数如何传递
pstmtsetString(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 = conprepareCall("{call sp_insertStudent(,,)}");
pstmtsetString(1, "zengqingsong");
pstmtsetInt(2, 22);
pstmtregisterOutParameter(3, TypesINTEGER);
pstmtexecuteUpdate();
int id = pstmtgetInt(3);
Systemoutprintln(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 = conprepareCall("{=call sp_insertStudent(,,)}");
pstmtsetString(2, "zengqingsong");
pstmtsetInt(3, 22);
pstmtregisterOutParameter(4, TypesINTEGER);
pstmtregisterOutParameter(1, TypesINTEGER);
int ret = pstmtexecuteUpdate(); //执行影响的行数
int ret2 = pstmtgetInt(1); //返回参数(输出参数)
int id = pstmtgetInt(4); //输出参数
Systemoutprintln(ret);
Systemoutprintln(ret2);
Systemoutprintln(id);
参考资料:
首先,本地连接是不会保存原来的IP地址的。
如果三个电脑,原来一样情况,那么按照其它电脑设置(除了IP的最后一位),最后一位一般连续,可以尝试上一个或者下一个。
看哪台机器安装的服务端SQLSERVER(如果不是本机参照上一条),如果是本机,打开企业管理器,在左侧服务器栏右键连接属性,这里可能是IP可能是个(local)
一般固定了ip地址的,可以在MS
SQLSERVER的服务管理器和客户端(client)管理器找到,不过这些都不一定设置(因为太灵活了,好多方法)
最后,还可以看看你这个软件的配置文件,ini之类的有没有,其实这个是肯定有的,但是不熟悉不知道放在哪里。
0条评论