VS.NET通过JDBC访问数据库

问题提出

看到这个题目,你可能有两个疑问:有必要吗?可能吗?

下面我来逐一解答:

1、目前为止纯Java数据库有不下10个,有商业的也有开源的,这是一个很大的数据来源,它们都提供了JDBC驱动,可以在Java中很容易的连接进行开发,对.NET的人员来说,这就是一个噩梦,它们没有ODBCOLEDBWindows下数据库驱动,也就不能连接这些数据库。还有些数据库的JDBC驱动比ODBC驱动使用更简单,如Oraclethin类型的JDBC驱动可以在没有安装oracle客户端的情况下使用。

2、用.NET直接调用JAVA程序是很难的,它们运行在不同的虚拟机里面。但它们之间可以通过网络来沟通,这样不仅与语言平台无关,也与操作系统平台无关。关键是要建立沟通的协议。

SQLHUB是一个纯Java开发分布式异构数据库,它使的异构的数据库之间可以透明的访问,它一直没有提供.NET可使用的数据库驱动,也导致不能在.NET中访问它。本来我是想开发一个针对它的专用ADO驱动,后来经过慎重考虑后,决定开发一个基于JDBC的共用ADO.NET驱动,这样不仅SQLHUB可用,其它Java数据库也可用了,关键是我可以专注于完善SQLHUBJDBC驱动了。

实现

需要开发的主要内容:

.NET端:

²        JdbcConnection:实现与JDBC服务器的连接

²        JdbcCommand:使用JdbcConnection来执行SQL命令,产生JdbcDataReader等结果

²        JdbcDataReader:读取数据库查询结果集

²        JdbcIO:实现与JDBC服务器的交互,包含命令打包和返回结果分析

JAVA

²        JdbcServerJDBC服务器,监听来自.NET端的连接请求,实现使用JDBC与目标数据库连接

²        JdbcConnJDBC数据库连接,用于处理来自.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

 

总结

从技术上讲,上面的实现不是很难,但却是很有意义的,JdbcADO驱动和Jdbc服务器可以到http://www.hgsql.com上下载。

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值