استفاده از 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 تشکر