استفاده از JDBC در Net.

JDBC یک API بر پایه زبان جاوا می باشد ، و از کلاس ها و توابعی برای ارتباط با پایگاه داده های رابطه ای (Relational Database) تشکیل شده است .در اصل با عنوان Java Database Connectivity API شناخته می شود .

استفاده از JDBC در Net.

امروزه بانک های اطلاعاتی مانند Access, SQL Server,MySQL و غیره ... از جمله ارکان مهم یک نرم افزار کامپیوتری محسوب می شود .برنامه نویسان قدیمی و با تجربه به خوبی یاد دارند که در چند دهه گذشته , خود برنامه نویس علاوه بر نوشتن سناریو و کد های برنامه , می بایست بستر ذخیره سازی دیتا را از پایه بنا نهاده و تمامی اطلاعات را ظبط و مدیریت می نمود . اما با گذشت زمان و کثرت اطلاعات و اهمیت پردازش داده ها ] وظیفه خطیر مدیریت Data به طور تخصصی به نرم افزار های این حیطه واگذار شد .در زبان های برنامه نویسی مدرن امروزی , برنامه نویس تنها به کار برنامه نویسی پرداخته و فقط با یک پل ارتباطی مانند JDBC,ODBC و امثال آن . بدون کوچکترین دانشی از طریقه عملکرد درونی یک بانک اطلاعاتی , با آن ارتباط برقرار میکند .برنامه نویسان جاوا برای ارتباط با بانک اطلاعاتی از پل ارتباطی JDBC استفاده می کنند .به همین جهت در این مقاله به بررسی این پل خواهیم پرداخت .

JDBC چیست ؟

JDBC در حقیقت یک رابط برنامه سازی کاربردی(API) است که به برنامه های جاوا اجازه اتصال و تبادل اطلاعات با بانک اطلاعاتی را می دهد , از آنحایی که با وجود JDBC نیازی به نوشتن برنامه های جداگانه برای ارتباط با بانک اطلاعاتی مختلف نیست .بنابراین نباید نگران تفاوت Data Base ها و ساختار آنها بود .در واقع JDBC تفاوتی بین Oracle و MySQL وجود نداشته و تنها با یک روش مشخص به آنها متصل می گردد , به همین حهت حتی در صورت تغییر نوع بانک اطلاعاتی یا حتی نوع برنامه (به عنوان مثال از تحت ویندوز به تحت وب ) در آینده , مشکلی در کدها ده وجود نخواهد آمد .

وظایف JDBC :

JDBC بطور کلی وظایف زیر را در ارتباط بین یک برنامه نوشته شده با جاوا و بانک اطلاعاتی بر عهده دارد :

_ برقراری ارتباط با بانک اطلاعاتی

_ ارسال دستورات SQL به بانک

_ پردازش و دریافت نتایج برگشتی از بانک

_ قطع ارتباط با بانک اطلاعاتی

JDBC APL

JDBC توسط مجموعه غنی APL , تمامی وظایف خود اعم از اجرای دستورات SQL و گرفتن نتایج از بانک را انجام می دهد .در ضمن این APL ها به شکل رابط ها و کلاسهای طراحی شده , به منظور اجرای انتقال , دستورات روی پایگاه داده رابطه ای تعبیه شده اند .

JDBC و ODBC

تکنولوژی ODBC یکی دیگر از روش های دسترسی به بانک های اطلاعاتی مختلف بوده و امکان دسترسی به بیشتر آنها در محیط های مختلف فراهم می کند .در صورت تمایل به استفاده از ODBC در جاوا , می توان از اوسط ODBC-JDBC استفاده نمود .

JDBC URL

درایو JDBC , برای شناسایی و برقراری ارتباط با بانک اطلاعات از JDBC URL استفاده می کند .ضمناَ هر کدام از DataBase های موجود در دنیا , یک URL مختص به خود دارند .

نرم افزار NET. از فرایند اتصال ایجاد شده استفاده می کند . در ادامه می توانیم به یک نمونه از دستورات استفاده از این تکنولوژی را مشاهده نماییم .

using System;  
using Codemesh.JuggerNET;  
using Java.Lang;  
using Java.Sql;  
using Java.Util;  
  
  
public class Application  
{  
    public static void  Main( string[] args )  
    {  
        //the database filename  
        string  db_file_name_prefix = args.Length > 0 && !"-info".Equals( args[ 0 ].ToLower() ) ? args[ 0 ] : "test_db";  
  
        //for now just terminate if we're invoked with the -info option  
        if( args.Length > 0 && "-info".Equals( args[ 0 ].ToLower() ) )   
            return;  
  
        //the database connection  
        Connection      conn = null;  
  
        try  
        {  
            IJvmLoader  loader = JvmLoader.GetJvmLoader( true, true, TraceFacility.TraceJvm, TraceLevel.TraceErrors );  
  
            // put the hsqldb classes (driver) on the bootclasspath to work around a   
            // limitation in the DriverManager when invoked from .NET  
            loader.AppendBootClassPath = "../lib/hsqldb.jar;../../lib/hsqldb.jar";  
  
            // make the JDBC driver available by preloading it  
            Class.ForName("org.hsqldb.jdbcDriver");  
  
            // connect to the database.   This will load the db files and start the  
            // database if it is not alread running.  
            // db_file_name_prefix is used to open or create files that hold the state  
            // of the db.  
            // It can contain directory names relative to the  
            // current working directory  
            conn = DriverManager.GetConnection( "jdbc:hsqldb:" + db_file_name_prefix,  
                                                "sa",                     // username  
                                                "");                      // password  
  
            // create a table and insert some entries  
            // this will only worl the first time and throw an exception every following time  
            // because the table already exists   
            try  
            {  
                Update( conn, "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)");  
  
                // add some rows - will create duplicates if run more then once  
                // the id column is automatically generated  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Ford', 100)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Toyota', 200)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Honda', 300)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('GM', 400)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('BMW', 80)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Mercedes-Benz', 60)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('VW', 800)");  
            }  
            catch( SQLException sqle )  
            {  
                Console.WriteLine( sqle.Message );  
            }  
            catch( Throwable it )  
            {  
                Console.WriteLine( it.StackTrace );  
            }  
            catch( System.Exception ie )  
            {  
                Console.WriteLine( ie.ToString() );  
            }  
  
            try  
            {  
                Console.WriteLine( "---------------" );  
  
                // do a query  
                Query( conn, "SELECT * FROM sample_table WHERE num_col < 250");  
  
                Console.WriteLine( "---------------" );  
  
                // do another query  
                Query( conn, "SELECT str_col FROM sample_table WHERE num_col >= 100");  
  
                Console.WriteLine( "---------------" );  
  
                conn.Close();  
            }  
            catch( Throwable t )  
            {  
                Console.WriteLine( "Caught throwable of type {0}", t.GetClass().GetName() );  
                Console.WriteLine( t.ToString() );  
                return;  
            }  
            catch( JuggerNETFrameworkException jnfe )  
            {  
                Console.WriteLine( "Caught framework exception" );  
                Console.WriteLine( jnfe.Message );  
                Console.WriteLine( jnfe.StackTrace );  
                return;  
            }  
  
            return;  
        }  
        catch( System.Exception se )  
        {  
            Console.WriteLine( se.ToString() );  
        }  
    }  
  
    public static void  Dump( ResultSet rs )  
    {  
        // the order of the rows in a cursor  
        // are implementation dependent unless you use the SQL ORDER statement  
        ResultSetMetaData meta   = rs.GetMetaData();  
        int               colmax = meta.GetColumnCount();  
        int               i;  
        object            o = null;  
  
        // the result set is a cursor into the data.  You can only  
        // point to one row at a time  
        // assume we are pointing to BEFORE the first row  
        // rs.next() points to next row and returns true  
        // or false if there is no next row, which breaks the loop  
        for (; rs.Next(); )   
        {  
            for (i = 0; i < colmax; ++i)   
            {  
                o = rs.GetObject(i + 1);    // Is SQL the first column is indexed  
  
                // with 1 not 0  
                Console.Write( "{0} ", o.ToString() );  
            }  
  
            Console.WriteLine( "" );  
        }  
    }  
  
  
    public static void Update( Connection conn, String expression)  
    {  
        Statement st = null;  
  
        st = conn.CreateStatement();    // statements  
  
        int i = st.ExecuteUpdate(expression);    // run the query  
  
        if (i == -1)   
        {  
            Console.WriteLine( "db error : {0}", expression );  
        }  
  
        st.Close();  
    }  
  
  
    public static void      Query( Connection conn, String expression )  
    {  
        Statement st = null;  
        ResultSet rs = null;  
  
        st = conn.CreateStatement();         // statement objects can be reused with  
  
        // repeated calls to execute but we  
        // choose to make a new one each time  
        rs = st.ExecuteQuery(expression);    // run the query  
  
        // do something with the result set.  
        Dump(rs);  
        st.Close();      
        // NOTE!! if you close a statement the associated ResultSet is closed   
        // too so you should copy the contents to some other object.  
        // the result set is invalidated also  if you recycle an Statement  
        // and try to execute some other query before the result set has been  
        // completely examined.  
    }  
}