استفاده از JDBC در Net.
پنجشنبه 31 اردیبهشت 1394JDBC یک API بر پایه زبان جاوا می باشد ، و از کلاس ها و توابعی برای ارتباط با پایگاه داده های رابطه ای (Relational Database) تشکیل شده است .در اصل با عنوان Java Database Connectivity API شناخته می شود .
امروزه بانک های اطلاعاتی مانند 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.
}
}
- ASP.net
- 2k بازدید
- 1 تشکر