Symfoware NATIVE系
【共通】
应用程序开发环境
开发语言 操作数据库方法
C SQL嵌套
C++ ODBC
C# .NET Framework
COBOL SQL嵌套、ODBC、.NET Framework
Java Java
Visual Basic ODBC
Visual Basic .NET .NET Framework、ODBC
Windows系统中使用以下平台,新手也容易理解程序开发。
Interstage Studio
- COBOL(SQL嵌套、ODBC)
- Java(Java)
Visual Studio
- C(SQL嵌套)
- C++(ODBC)
- C#(.NET Framework)
- COBOL(.NET Framework)
- Visual Basic(ODBC)
- Visual Basic .NET(ODBC、.NET Framework)
数据检索
SELECT DISTINCT name, num INTO :PRODUCT, :WHCODE
FROM db1.table1 WHERE num < 120
注意:
:PRODUCT表示PRODUCT变量,
INTO :PRODUCT表示将name赋值给PRODUCT(这种方式只能在嵌入SQL中使用)。
使用cursor操作
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
参考:http://blog.csdn.net/fw0124/article/details/6626370
【嵌入SQL】
嵌入式SQL(英文: Embedded SQL)是一种将SQL语句直接写入C语言,COBOL,FORTRAN, Ada等编程语言的源代码中的方法。借此方法,可使得应用程序拥有了访问数据以及处理数据的能力。在这一方法中,将SQL文嵌入的目标源码的语言称为宿主语言。
1、C语言中嵌入SQL
编码形式:
EXEC SQL SQL文 ;
示例
1、申明:EXEC SQL BEGIN DECLARE SECTION ;
2、FETCH:EXEC SQL FETCH CU1 INTO :GNO, :GOOD, :QOH ;
include和表申明
示例:
HOSTVAR文件内容
char SQLSTATE[6];
long STOCK;
嵌入式SQL
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL INCLUDE HOSTVAR;
EXEC SQL END DECLARE SECTION;
main(){
EXEC SQL DECLARE repositor TABLE ON SCH1;
EXEC SQL SELECT num INTO :STOCK FROM repositor WHERE goodsnum = 240;
printf("%d\n",STOCK);
}
指定host变量
示例:
EXEC SQL SELECT repositorysum,repositorynum
INTO :STOCK INDICATOR :QFLAG,
:HOUSE INDICATOR :WFLAG
FROM repository WHERE repositorynum = 110;
QFLAG为STOCK标志变量,变量需要使用“:”
SQL文以外C代码使用变量,变量不需要“:”
EXEC SQL FETCH CU1 INTO :STOCK INDICATOR :QFLAG;
if( QFLAG == -1) goto p_null ;
if( STOCK == 0) goto p_loop ;
连接和断开数据库
EXEC SQL CONNECT TO 'SV1' AS 'C1' USER 'U/PW';
此时,动作环境配置文件:
SERVER_SPEC=(RDB2_TCP,SV1,DB01,H1,26511)
或
EXEC SQL CONNECT TO DEFAULT;
此时,动作环境配置文件:
SERVER_SPEC=(RDB2_TCP,SV1,DB01,H1,26511)
DEFAULT_CONNECTION=(SV1,U,PW)
参考:
http://www.cnblogs.com/lyhabc/archive/2013/12/04/3458487.html(推荐)
http://blog.csdn.net/angelseyes/article/details/3962133
http://baike.baidu.com/link?url=x2WE1ZJeA_ot4VifRhLDkpKAtVQxDQlUCyBbvc1a4u2ds-7yYh8rcETMLDdfpAXxTicLo02hNJPkCjFPb22oj-v0Js8_TYipk0Ef2Gi2Vhm
【JDBC】
package API 概要
javax.sql DataSource interface 使用data source
java.sql DriverManager class 使用url直接指定
推荐使用DataSource方式连接
示例:
Hashtable env = new Hashtable(); (1)
env.put(Context.INITIAL_CONTEXT_FACTORY
"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory"); (1)
env.put(Context.PROVIDER_URL,"SYM://myhost:10326"); (1)
InitialContext ctx = new InitialContext(env); (1)
DataSource ds = (DataSource)ctx.lookup("jdbc/ds1"); (2)
Connection con = ds.getConnection(); (3)
:
con.setAutoCommit(false); (4)
:
con.commit(); (5)
con.close(); (6)
(1) JNDI环境指定;
(2) 获得JDBC Data source;
(3) 连接数据库;
(4) 自动commit无效化;
(5) 事务commit;
(6) 切断连接。
事务
设置事务连接模式
Connection cnct = DataSource.getConnection();
cnct.setAutoCommit(false);
cnct.setReadOnly(true);
:
cnct.commit();
设置事务独立性
Connection cnct = DataSource.getConnection();
cnct.setAutoCommit(false);
cnct.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_UNCOMMITTED);
:
cnct.commit();
Statement、PreparedStatement和CallableStatement
1、Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement;
2、Statement接口提供了执行语句和获取结果的基本方法、PreparedStatement接口添加了处理IN参数的方法、CallableStatement接口添加了处理OUT参数的方法;
3、PreparedStatement:
由DBMS预编译并缓存在cache中,所以执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
安全性更好,有效防止sql注入问题。
执行的SQL语句中是可以带参数的,并支持批量执行SQL。
参考:http://langgufu.iteye.com/blog/1559386
示例:
PreparedStatement pstmt = con.prepareStatement(
"SELECT ID,NAME FROM
GENERAL.EMPLOYEE WHERE ID=?"); (1)
pstmt.setInt(1, 1); (2)
ResultSet rs = pstmt.executeQuery(); (3)
int iID = 0; (3)
String sName = null; (3)
while (rs.next()) (4)
{ (4)
iID = rs.getInt(1); (5)
sName = rs.getString(2); (5)
System.out.println("ID = " + iID); (5)
System.out.println("NAME = " + sName); (5)
} (5)
rs.close(); (6)
pstmt.close(); (6)
con.commit();(7)
(1) SQL文准备;
(2) 设定参数,第一个1表示第一个参数;
(3) ResultSet 对象生成;
(4) 基于cusor的位置;
(5) 从ResultSet对象中获得;
(6) 关闭对象;
(7) 事务提交。
execute、executeQuery和executeUpdate
1、executeQuery:返回结果集(ResultSet);
2、executeUpdate: 执行给定SQL语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,
或者不返回任何内容的SQL语句(如 SQL DDL 语句);
3、execute: 可用于执行任何SQL语句。
参考:http://kanghao126.iteye.com/blog/134697
二进制文件检索
示例:
Statement stmt = con.createStatement(); (1)
ResultSet rs = stmt.executeQuery(
"SELECT COL_BLOB FROM BLOBTBL WHERE COL_INT = 1"); (2)
while (rs.next()) (3)
{
InputStream oIS = rs.getBinaryStream(1); (4)
FileOutputStream fs = new FileOutputStream("文件名"); (4)
byte[] bTmp = new byte[oIS.available()]; (5)
oIS.read(bTmp); (5)
fs.write(bTmp); (5)
int iBData=0; (6)
while ((iBData=oIS.read()) != -1) (6)
{
fs.write(iBData); (6)
}
oIS.close(); (7)
fs.close(); (7)
}
rs.close(); (8)
stmt.close(); (8)
con.commit(); (9)
(1) 为了执行SQL文,生成Statement对象;
(2) 生成ResultSet对象;
(3) 基于cusor位置;
(4) 从ResultSet对象中获得;
(5) 从流中读入(byte数组);
(6) 从流中读入(1位);
(7) 关闭流;
(8) 关闭对象;
(9) 事务提交。
二进制文件更新
PreparedStatement pstmt = con.prepareStatement(
"INSERT INTO BLOBTBL VALUES(1, ?)"); (1)
FileInputStream oFIS = new FileInputStream("文件名"); (1)
pstmt.setBinaryStream(1, oFIS, oFIS.available()); (2)
pstmt.executeUpdate(); (3)
oFIS.close(); (3)
pstmt.close(); (4)
con.commit(); (5)
(1) SQL文准备;
(2) 设置参数;
(3) 执行SQL;
(4) 关闭对象;
(5) 事务提交。
【ODBC】
ODBC(Open Database Connectivity)美国微软Microsoft公司提倡的Windows程序连接的标准接口。
ODBC应用--ODBC驱动管理--ODBC驱动(ODOS)--symfoware DB
可以使用ODBC的应用程序Access、Excel、Visual Basic、Visual Basic.NET、IIS、Visual C++、富士通NetCOBOL/PowerCOBOL97、Macromedia ColdFusion。
一、应用设计
接口API:RDO(推荐)、ADO、ADO.NET;
连接数据库:
API名 对象名 方法名
RDO rdoEnvironment OpenConnection
ADO Connection Open
ADO.NET OdbcConnection Open
需要设置以下参数
DSN(数据源Num)=DSN01;UID=USER01;PWD=PASS01;
断开数据库:
API名 对象名 方法名
RDO rdoEnvironment Close
ADO Connection Close
ADO.NET OdbcConnection Close
ODBC连接池技术
1、CPTimeout值
CPTimeout超时后连接自动释放。初始化为60秒。指定为0时,连接池无效。
2、Retry Wait值
Retry Wait等待重试时间,初始化为120秒。
3、ODBC数据源管理
1)Windows(R)控制面板,执行ODBC;
2)选择【连接池】类型;
3)连接池技能使用确认页面,performance选项:有效;
4)如果要更改Retry Wait值,以秒为单位设置:重试等待时间;
5)连接池超时选项,双击Symfoware ODOS或Symfoware ODOS(UniCode);
6)选择连接池连接这个驱动;
7)设置CPTimeout;
8)OK。
确认连接池状态
performance监控器启动状态下,追加[ODBC Connection Pooling]
Connections Currently Active:正在使用的连接数;
Connections Currently Free:未使用的连接数;
Connections Sec/Hard:每秒来自datasource连接数;
Connections Sec/Soft:每秒来自连接池的连接数;
Disconnections Sec/Hard:每秒断开datasource连接数;
Disconnections Sec/Soft:每秒断开连接池的连接数。
二、设置环境
注册数据源
两种ODOS对应编码:
Symfoware ODOS
Symfoware/RDB可以在shift_jis或者euc编码下使用;
Symfoware ODOS(UniCode)
Symfoware/RDB可以在UNICODE编码下使用。
注册ODBC数据源手顺:
1、管理页面启动ODBC数据源(或者直接找到exe文件C:\WINDOWS\SysWOW64\odbcad32.exe);
2、根据使用数据源的用户选择【用户数据源】或者【系统数据源】;
3、点击【追加】按钮;
4、数据源新规页面选择Symfoware ODOS或者Symfoware ODOS(UniCode),然后点击【完了】按钮;
5、Symfoware ODOS setup页面填入必要信息,点击【OK】按钮(必要信息参照:Symfoware Server Enterprise Edition V10.1.0)。
三、应用程序作成和执行
与Office联合(主要包括Access和Excel);
与Visual Basic.Net联合(使用平台Visual Studio 2005。);
有以下连接方式:RDO、ADO、ADO.NET、DAO,其中ADO.NET依赖于ODBC.NET Data Provider
和.NET Framework SDK。
应用程序作成准备
1)ODBC数据源作成;
2)启动Visual Studio;
3)创建新的Visual Basic项目:【Windows应用程序】--【OK】;
4)Visual Studio菜单栏【project】-[追加参照];
5)【追加参照】页面选择适当的项目,点击【OK】
- Visual Basic.NET的RDO场合、【COM】Tab选择【Microsoft Remote Data Object 2.0】;
- Visual Basic.NET的ADO场合、【COM】Tab选择【Microsoft ActiveX Data Objects 2.7 Library】。
作成和执行
1、在form上添加两个button按钮(连接和切断);
2、切换到【Text】,这只连接和切断;
3、菜单的【表示】-【code】选择,然后在【code】画面下拉菜单选择全部;
4、移动游标,设置以下代码
外部可能使用的变量声明
Private rdoEV As RDO.rdoEnvironment
Private rdoCN As RDO.rdoConnection
Private rdoEN As New RDO.rdoEngine
画面表示时不可以点击切断按钮设定
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs)
Handles MyBase.Load
Button2.Enabled = False
End Sub
5、页面上点击【连接】按钮,游标移动到以下代码
On Error GoTo ErrorProc
rdoEV = rdoEN.rdoCreateEnvironment("", "", "")
rdoEV.CursorDriver = RDO.CursorDriverConstants.rdUseOdbc
rdoCN = rdoEV.OpenConnection("", RDO.PromptConstants.rdDriverPrompt, "ODBC;")
MsgBox("可以连接", MsgBoxStyle.OkOnly, "连接成功")
Button2.Enabled = True
Button1.Enabled = False
Exit Sub
ErrorProc:
Dim msg As String
Dim i As Integer
For i = 0 To rdoEN.rdoErrors.Count - 1
If rdoEN.rdoErrors.Count > 0 Then
msg = rdoEN.rdoErrors(i).Description
Else
msg = Err.Description
End If
MsgBox(msg, MsgBoxStyle.OkOnly, "Error")
Next
rdoCN = Nothing
rdoEV = Nothing
End Sub
6、form页面点击切断按钮,游标移动到以下代码
rdoCN.Close()
rdoEV.Close()
rdoEV = Nothing
rdoCN = Nothing
Hide()
Close()
与IIS联合
需安装以下产品:ODBC.NET Data Provider、.NET Framework SDK。
环境设置:
1、创建仓库文件;
2、设置IIS;
3、注册ODBC数据源。
应用程序作成
ASP应用程序:
示例:
<%@ language="vbscript" %>
<!-- #include file = "adovbs.inc" -->
<html>
<head>
<title>数据展示</title>
</head>
<body bgcolor="White">
<b>数据展示</b>
<hr>
<%
consrc = "DSN=DSN01;UID=USER01;PWD=PASS01"
sqlsrc = "SELECT KEY_C,DEC_C FROM SAMPLE1.TESTTBL"
' 获取错误,当错误发生是不能中断程序
On Error Resume Next
'0. Connection对象的生成和设置
Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.ConnectionString = consrc
Response.Write "1.connection连接<br>"
OBJdbConnection.Open
'错误处理
If OBJdbConnection.Errors.Count > 0 Then
Response.Write "Description = " & _
OBJdbConnection.Errors(0).Description & "<br>"
Response.Write "NativeError = " & _
OBJdbConnection.Errors(0).NativeError & "<br>"
Response.Write "Number = " & _
OBJdbConnection.Errors(0).Number & "<br>"
Response.Write "Source = " & _
OBJdbConnection.Errors(0).Source & "<br>"
Response.Write "SQLState = " & _
OBJdbConnection.Errors(0).SQLState & "<br>"
End If
Response.Write "2.Recordset对象生成<br>"
Set RecordSetObj = Server.CreateObject("ADODB.Recordset")
Response.Write "3.Recordset对象打开く<br>"
RecordSetObj.Open sqlsrc,OBJdbConnection,adOpenForwardOnly, _
adLockReadOnly,adCmdText
'错误处理
If OBJdbConnection.Errors.Count > 0 Then
Response.Write "Description = " & _
OBJdbConnection.Errors(0).Description & "<br>"
Response.Write "NativeError = " & _
OBJdbConnection.Errors(0).NativeError & "<br>"
Response.Write "Number = " & _
OBJdbConnection.Errors(0).Number & "<br>"
Response.Write "Source = " & _
OBJdbConnection.Errors(0).Source & "<br>"
Response.Write "SQLState = " & _
OBJdbConnection.Errors(0).SQLState & "<br>"
Else
Response.Write "4.获得数据<br>"
Response.Write "KEY_C,DEC_C<br>"
Do While Not RecordSetObj.EOF
For i = 0 To RecordSetObj.Fields.Count - 1
'获得数据
Response.Write CStr(RecordSetObj.Fields(i)) + ","
Next
Response.Write "<br>"
RecordSetObj.MoveNext
Loop
End If
Response.Write "5.Recordset对象关闭<br>"
RecordSetObj.Close()
Response.Write "6.connection切断<br>"
OBJdbConnection.Close
%>
<hr>
</body>
</html>
ASP.NET应用程序:
1、启动Visual Studio .NET;
2、新建ASP.NET应用程序;
3、Visual Basic .NET菜单选择【project】--【追加参照】--【.NET】Tab选择【Microsoft.Data.ODBC.dll】;
4、编辑Form,添加执行按钮;
在design页面html的body页面:
<body>
<form id="Form1" method="post" runat="server">
<FONT face="MS UI Gothic">
<asp:button id="Button1" runat="server" Text="执行" Width="68px"></asp:button>
<HR width="100%" SIZE="1">
<asp:label id="Label1" runat="server"></asp:label>
<HR width="100%" SIZE="1">
</FONT>
</form>
</body>
5、点击form页面【执行】按钮,游标移动到以下代码
Dim con As Microsoft.Data.Odbc.OdbcConnection
Dim com As Microsoft.Data.Odbc.OdbcCommand
Dim drd As Microsoft.Data.Odbc.OdbcDataReader
Dim i As Integer
Dim msgstr As String
Dim constr As String = "DSN=DSN01;UID=USER01;PWD=PASS01"
Dim sqlstr As String = "SELECT KEY_C,DEC_C FROM SAMPLE1.TESTTBL"
Try
Label1.Text = "1.connection连接<br>"
con = New Microsoft.Data.Odbc.OdbcConnection(constr)
con.Open()
Label1.Text &= "2. OdbcCommand对象生成<br>"
com = New Microsoft.Data.Odbc.OdbcCommand(sqlstr, con)
Label1.Text &= "3. OdbcDataReader对象生成<br>"
drd = com.ExecuteReader
Label1.Text &= "4. 取得数据<br>"
Label1.Text &= "KEY_C,DEC_C<br>"
While drd.Read()
For i = 0 To drd.FieldCount - 1
Label1.Text &= drd.GetValue(i) & ","
Next
Label1.Text &= "<br>"
End While
Label1.Text &= "5. OdbcDataReader对象关闭<br>"
drd.Close()
Label1.Text &= "6. connection切断<br>"
con.Close()
con.Dispose()
com.Dispose()
'Error处理
Catch ex As Microsoft.Data.Odbc.OdbcException
For i = 0 To ex.Errors.Count - 1
msgstr &= ex.Errors(i).Message & "<br>"
msgstr &= "SQLSTATE: " & ex.Errors(i).SQLState & "<br>"
Next
Label1.Text = "ODBC Error Message<br>" & msgstr
Catch ex As Exception
msgstr = ex.Message
Label1.Text = "Error Message<br>" & msgstr
End Try
6、运行程序,在浏览器中输入http://localhost/ASPSamp/TestWebApl/WebForm1.aspx访问(具体路径依程序而定)。
【Symfoware .NET Data Provider】
动作环境:
1、.NET Framework 2.0、.NET Framework 3.0、.NET Framework 3.5或.NET Framework 4
2、Visual Studio 2005、Visual Studio 2008或Visual Studio 2010
开发语言
C#
Visual Basic .NET
COBOL
应用程序作成
Symfoware .NET Data Provider setup
1、Windows程序【project】--【追加参考】,Web程序【web site】--【追加参照】;
2、【.NET】Tab选择【Fujitsu.Symfoware】,点击【OK】;
数据操作的自动生成
Symfoware.NET Data Provider数据操作,VisualStudio生成可能的数据操作标准的代码(ODBC桥代码)的基础,SNDP代码生成工具自动生成。
1、project作成;
2、Symfoware .NET Data Provider 的setup;
3、用户界面作成;
4、ODBC数据源连接的作成;
5、ODBC桥代码自动生成;
6、Symfoware .NET Data Provider(SNDP)代码生成,SNDP使用shell,从自动生成的ODBC桥代码中自动生成;
7、应用程序逻辑代码,调用自动生成的代码,connection作成。
调用自动生成代码以及创建connection示例:
1)C#
private void Form1_Load(object sender, EventArgs e)
{
this.SNDP_InitializeComponent();
this.SNDP_odbcConnection1.ConnectionString = "DATA SOURCE=127.0.0.1;PORT=26551;" +
"INITIAL CATALOG=TEST;USER ID=root;PASSWORD=PASS01";
}
2)Visual Basic .NET
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.SNDP_InitializeComponent()
Me.SNDP_OdbcConnection1.ConnectionString = "DATA SOURCE=127.0.0.1;PORT=26551;" _
& "INITIAL CATALOG=TEST;USER ID=root;PASSWORD=PASS01"
End Sub
【connection manager】
Connection Manager和应用程序运行在同一台机器上,并且有一部分功能内嵌在客户端API驱动(JDBC,ODBC等)里。应用程序通过API驱动透明地向Connection Manager请求一个虚拟的服务器,ConnectionManager将这个虚拟服务器名翻译成一组节点的IP和端口号,并根据节点的运行状况(生死,负载,Log Group偏在)选择一个最合适的节点返回给应用,通过这种方式还可以达到负载均衡的目的。
环境设定
数据库Server环境设定
1、编辑动作环境文件;
MAX_CONNECT_TCP = (连接数):可用最大连接数
RDB_KEEPALIVE = ({ON|OFF}):设置KEEPALIVE功能是否可用
2、设置环境变量;
设置使用APC command、rdbprtmsg command或man command必要的环境变量
示例(linux):
$ LANG= ja_JP.UTF-8 ; export LANG
$ PATH=/opt/FJSVapccm/bin:$PATH ; export PATH
$ LD_LIBRARY_PATH=/opt/FJSVapccm/lib:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH
$ RDBNAME=rdbsys1 ; export RDBNAME
$ MANPATH=/opt/FJSVapccm/man:$MANPATH ; export MANPATH
3、设置端口号
通信使用端口号以及down监控端口号
Solaris/Linux:/etc/services
windows:C:\WINDOWS\system32\drivers\etc\services
示例:
rdbsys1 26551/tcp
rdbsys1-spv 26700/tcp
4、设置系统日志环境变量。
应用程序环境设置
Solaris/Linux:
kernel编辑
APC动作环境文件编辑
系统日志环境设置
环境变量设置
windows:
APC动作环境文件编辑
环境变量设置
APC动作环境文件编辑
Solaris/Linux:
/opt/FJSVapccm/etc/apcsysconfig
windows:
安装目录下\CM\ETC内文本文件,apcsysconfig.sam、apcsysconfig同名文件夹复制作成。
服务端启动停止
服务端启动:rdbstart 此时应用程序才可以启动
服务端停止:rdbstop 停止时应用程序无法执行启动,应用程序启动时,服务端无法停止
应用程序启动命令apcstart,查看状态命令apcnet
示例1:(服务器运行中)
$ apcstart
$ apcnet
apcnet DATE:2007/01/10 TIME:10/30/55
System Host Status Cause
rdbsys1 host1 online -
(rdbsys1) host3 online -
rdbsys2 host2 online -
(rdbsys2) host3 online -
示例2:(服务停止器运行)
$ apcstart
$ apcnet
apcnet DATE:2007/01/10 TIME:10/30/55
System Host Status Cause
rdbsys1 - offline CON
rdbsys2 - offline CON
应用程序停止命令:apcstop
监控进程启动(Solaris/Linux)
$ rdbstart
$ rdbcrbf -f /home/rdbcrbf_file
$ rdbconbf -f /home/rdbconbf_file
$ rdbresident -mon -f /home/rdbresident_file
$ apcspv
监控进程停止(没有停止命令,停止Server,监控进程自动停止)
应用程序作成示例(java)
import java.sql.*;
import java.util.Hashtable;
import java.net.URL;
import javax.sql.DataSource;
import javax.naming.*;
/*
* JdbcSample1.java
* 内容:使用JDBC API示例程序
*/
class JdbcSample1
{
/*** main ***/
public static void main(String args[]){
try{
int result = -1;
/* CONNECT */
DBAccess dbAccess = new DBAccess();
/* PREPARE */
dbAccess.createObj();
while (result == -1)
{
/* EXECUTE */
result = dbAccess.exec();
// SQLState为40003,40703,71410的情况、再次执行exec()。
if(result == -2 | result == -3)
{
result = -1;
}
// 正常结束、其他错误出现,程序终止
else{
break;
}
}
/* DISCONNECT */
dbAccess.close();
}
catch(Exception e)
{
/* 异常处理 */
e.printStackTrace();
}
}
}
/*
* 数据库access处理
*/
class DBAccess
{
private Connection con = null;
private PreparedStatement pstmt = null;
private int iRollback = 0;
/* 连接数据库 */
DBAccess(){
try{
Hashtable env = null;
DataSource ds = null;
Context ctx = null;
String sDataSourceName = "DS1";
String sProviderName = "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory";
String sProviderURL = "SYM://localhost:26600";
env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, sProviderName);
env.put(Context.PROVIDER_URL, sProviderURL);
ctx = new InitialContext(env);
String key_ = "jdbc/" + sDataSourceName;
ds = (DataSource)ctx.lookup(key_);
/* 连接数据库 */
con = ds.getConnection();
/*设置为手动commit */
con.setAutoCommit(false);
}
catch (SQLException e){
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
e.printStackTrace();
}
catch (NamingException e){
e.printStackTrace();
}
}
/*
* statement作成
*/
public void createObj()
{
String sSQLInsert = "INSERT INTO SCM1.CATEGORY1 VALUES(?, 'NAME')";
try{
/* PreparedStatement作成 */
pstmt = con.prepareStatement(sSQLInsert);
}
catch (SQLException e)
{
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
e.printStackTrace();
}
}
/*
* SQL文执行
*/
public int exec()
{
int result = -1;
try
{
// SQLSTATE为71410的时候、rollback。
if(iRollback == 1)
{
con.rollback();
pstmt.close();
createObj();
iRollback = 0;
}
/* 插入5条数据 */
for (int i = 1; i <= 5; i++)
{
pstmt.setInt(1, i);
result = pstmt.executeUpdate();
}
/* PreparedStatement关闭 */
pstmt.close();
/*事务提交 */
con.commit();
}
catch (SQLException e)
{
String sErr1 = "40003";
String sErr2 = "40703";
String sErr3 = "71410";
String sErr4 = "71003";
String prefix = e.getSQLState();
// SQLSTATE为40003或40703的时候、再次执行。
if (prefix.equals(sErr1) || prefix.equals(sErr2))
{
result = -2;
}
// SQLSTATE为71410或71003的时候、再次执行。
// 设置rollback flag 。
else if (prefix.equals(sErr3) || prefix.equals(sErr4))
{
result = -3;
iRollback = 1;
}
// 其他错误场合,返回错误。
else
{
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
result = 1;
}
}
return result;
}
/*
* 对象回收处理
*/
public void close()
{
try
{
// Connection关闭
con.close();
}
catch (SQLException e)
{
System.out.println(e.getMessage());
System.out.println("SQLState = <" + e.getSQLState()
+ ">, Code = <"+ e.getErrorCode() + ">");
e.printStackTrace();
}
}
}