问题提出
看到这个题目,你可能有两个疑问:有必要吗?可能吗?
下面我来逐一解答:
1、目前为止纯Java数据库有不下10个,有商业的也有开源的,这是一个很大的数据来源,它们都提供了JDBC驱动,可以在Java中很容易的连接进行开发,对.NET的人员来说,这就是一个噩梦,它们没有ODBC、OLEDB等Windows下数据库驱动,也就不能连接这些数据库。还有些数据库的JDBC驱动比ODBC驱动使用更简单,如Oracle的thin类型的JDBC驱动可以在没有安装oracle客户端的情况下使用。
2、用.NET直接调用JAVA程序是很难的,它们运行在不同的虚拟机里面。但它们之间可以通过网络来沟通,这样不仅与语言平台无关,也与操作系统平台无关。关键是要建立沟通的协议。
SQLHUB是一个纯Java开发分布式异构数据库,它使的异构的数据库之间可以透明的访问,它一直没有提供.NET可使用的数据库驱动,也导致不能在.NET中访问它。本来我是想开发一个针对它的专用ADO驱动,后来经过慎重考虑后,决定开发一个基于JDBC的共用ADO.NET驱动,这样不仅SQLHUB可用,其它Java数据库也可用了,关键是我可以专注于完善SQLHUB的JDBC驱动了。
实现
需要开发的主要内容:
.NET端:
² JdbcConnection:实现与JDBC服务器的连接
² JdbcCommand:使用JdbcConnection来执行SQL命令,产生JdbcDataReader等结果
² JdbcDataReader:读取数据库查询结果集
² JdbcIO:实现与JDBC服务器的交互,包含命令打包和返回结果分析
JAVA端
² JdbcServer:JDBC服务器,监听来自.NET端的连接请求,实现使用JDBC与目标数据库连接
² JdbcConn:JDBC数据库连接,用于处理来自.NET端的SQL命令执行
² JdbcIO:实现与.NET端的交互,包含命令分析和返回结果打包
应用示例
启动JDBC服务器
在SQLHUB系统目录下找到JdbcServer.bat运行
可以点击加载Java程序库加载Jdbc驱动。
.NET端程序开发
引入程序库Hgsql.dll,可以在SQLHUB的程序目录下的ado中找到
编写如下C#测试代码:
using System;
using System.Data;
using Hgsql.Data;
/// <summary>
/// JDBC驱动测试
/// </summary>
public class JdbcTest
{
public JdbcTest()
{
}
static void Main ()
{
try
{
JdbcConnection conn = new JdbcConnection();
conn.ConnectionString =
"driver={oracle.jdbc.driver.OracleDriver}" //JDBC驱动名称
+ ";url={jdbc:oracle:thin:@localhost:1521:ora}" //JDBC数据库连接URL
+ ";user=scott" //数据库用户名
+ ";password=tiger" //数据库用户口令
+ ";host=localhost" //JDBC服务器
+ ";port=2007"; //JDBC服务器服务端口
Console.WriteLine("连接串:" + conn.ConnectionString);
//打开连接
conn.Open();
IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from emp";
Console.WriteLine("查询:" + cmd.CommandText);
IDataReader reader = cmd.ExecuteReader();
//显示字段
for (int i = 0; i < reader.FieldCount; i++)
{
if (i > 0) Console.Write("/t");
Console.Write(reader.GetName(i));
}
Console.Write("/n");
//显示查询结果
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (i > 0) Console.Write("/t");
Console.Write(reader.GetString(i));
}
Console.Write("/n");
}
reader.Close();
cmd.CommandText = "update emp set ename = ename";
Console.WriteLine("修改:" + cmd.CommandText);
Console.WriteLine(cmd.ExecuteNonQuery());
cmd.CommandText = "select sum(sal) from emp";
Console.WriteLine("统计:" + cmd.CommandText);
Console.WriteLine(cmd.ExecuteScalar());
conn.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.Read();
}
}
输出结果
连接串:driver={oracle.jdbc.driver.OracleDriver};url={jdbc:oracle:thin:@localhost
:1521:ora};user=scott;password=tiger;host=localhost;port=2007
查询:select * from emp
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980-12-17 0:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 0:00:00 1600 300
30
7521 WARD SALESMAN 7698 1981-02-22 0:00:00 1250 500
30
7566 JONES MANAGER 7839 1981-04-02 0:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 0:00:00 1250 1400
30
7698 BLAKE MANAGER 7839 1981-05-01 0:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 0:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 0:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 0:00:00 5000
10
7844 TURNER SALESMAN 7698 1981-09-08 0:00:00 1500 0
30
7876 ADAMS CLERK 7788 1987-05-23 0:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 0:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 0:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 0:00:00 1300 10
修改:update emp set ename = ename
14
统计:select sum(sal) from emp
29025
在SQLHUB的发行包下面还带了一个ADO.NET for JDBC测试程序ado/Hgsql.exe
总结
从技术上讲,上面的实现不是很难,但却是很有意义的,Jdbc的ADO驱动和Jdbc服务器可以到http://www.hgsql.com上下载。