اتصال اندروید به SQL Server
بصورت پیشفرض در اندروید برای ذخیره سازی داده از سه روش ذیل استفاده می شود:
۱- Shared Preferences
۲- File System(internal and external storage)
۳- SQL Lite
هریک از این روش ها در در جای خود می تواند بسیار کاربردی و مفیدتر از دیگر روش ها باشد. اما ذخیره سازی سازمان یافته در اندروید از طریق SQLite که یک نسخه بانک اطلاعاتی ساده اما بسیار قدرتمند است (در scale خود) ، صورت می پذیرد.
موضوع بحث ما اما روش های مرسوم ذخیره سازی اطلاعات در اندروید نیست، بلکه اتصال به بانک اطلاعاتی قدرتمند SQL Server می باشد. (اتصال اندروید به SQL Server)
به دو روش می توان اتصال اندروید به SQL Server را انجام داد :
۱- پیاده سازی Web Service مبتنی بر تکنولوژی هایی که بصورت بومی به SQL Server دسترسی دارند مثل Web Api در دات نت.
۲- اتصال مستقیم با استفاده از Connection String.
پیاده سازی وب سرویس ها جهت بهره برداری از اطلاعات بانک اطلاعاتی SQL Server
وب سرویس ها معمولا به سه سبک مختلف پیاده سازی می شوند: RPC، Service-oriented و REST.
در این بین REST یا همان Representational state transfer ساده ترین رابط و بیشترین طرفدار را دارد. در این سبک با ایجاد افعال شناخته شده ای مثل DELETE، PUT، POST و GET بر روی Http ، کار با داده های ارائه شده توسط سرویس بسیار راحت و سریع خواهد بود.
استفاده از وب سرویس ها در اندروید هم با استفاده از متدهای بومی قابل پیاده سازی و هم بواسطه استفاده از کتابخانه های ارائه شد (بیشترین کتابخانه های ارائه شده برای اندروید بصورت Open Source هستند و قابلیت بسط دارند).
برای مثال یک نمونه بهره برداری از وب سرویس REST را با استفاه از کتابخانه Android Asynchronous Http Client بررسی می کنیم.
فرض کنید وب سرویس داریم که آدرس آن http://192.168.2.2:9999/useraccount/login/dologin است و از بانک SQL Server استفاده می کند و سرویس ارائه شده توسط آن نام کاربری (ایمیل) و کلمه عبور را دریافت کرده و سپس عملیات لاگین را انجام می دهد. ابتدا می بایست با استفاده از یک شی RequestParams پارامترهای خود را درج کنیم:
1 2 3 |
RequestParams params = new RequestParams(); params.put("username", email); params.put("password", password); |
سپس تابع مربوط به ارسال درخواست را فراخوانی کنیم.
1 |
nvokeWS(params) |
این تابع به شرح ذیل می باشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public void invokeWS(RequestParams params){ AsyncHttpClient client = new AsyncHttpClient(); client.get("http://192.168.2.2:9999/useraccount/login/dologin",params ,new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) { JSONObject obj = new JSONObject(response); if(obj.getBoolean("status")){ Toast.makeText(getApplicationContext(), "You are successfully logged in!", Toast.LENGTH_LONG).show(); } else{ errorMsg.setText(obj.getString("error_msg")); Toast.makeText(getApplicationContext(), obj.getString("error_msg"), Toast.LENGTH_LONG).show(); } } @Override public void onFailure(int statusCode, Throwable error, String content) { if(statusCode == 404){ Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show(); } else if(statusCode == 500){ Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show(); } // When Http response code other than 404, 500 else{ Toast.makeText(getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet]", Toast.LENGTH_LONG).show(); } } }); } |
در این تابع می بینیم که یک وهله از AsyncHttpClient ایجاد شده سپس با فراخوانی متد get این شی و ارائه پارامترهای لازم پاسخ از سرور دریافت می شود. که در صورت انجام عملیات بصورت موفقیت آمیز انجام شود در صورت صحت اطلاعات ارسالی پیام You are successfully logged in و در غیر اینصورت پیام خطا با نام error_msg نمایش داده می شود.
اما اگر به هر صورت اگر فرآیند این درخواست به درستی صورت نگیرد، در حالی که کد پاسخ از سرور ۴۰۴ باشد پیام Requested resource not found و اگر کد پاسخ ۵۰۰ باشد Something went wrong at server end و در غیر اینصورت
Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running] نمایش داده می شود.
اتصال مستقیم با استفاده از Connection String
می دانیم که برای برنامه نویسی بومی اندروید از زبان برنامه نویسی جاوا استفاده می شود. در جاوا برای اتصال به بانک های اطلاعاتی از JDBC بهره گرفته می شود. ابتدا می بایست یک کتابخانه JDBC برای SQL Serverداشته باشیم. اطلاع دارید که اندروید بصورت بومی فقط از SQLite پشتیبانی می کند.
پس ابتدا کتابخانه کد باز http://jtds.sourceforge.net را دریافت می کنیم.
حال که این کتابخانه را وارد برنامه خود کردید کافیست از کد زیر جهت اتصال به SQL Server کمک بگیرید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
</pre> <pre>import java.sql.Connection;</pre> <pre>import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import net.sourceforge.jtds.jdbc.*; public void testQuery() { Connection conn = null; try { String driver = "net.sourceforge.jtds.jdbc.Driver"; Class.forName(driver).newInstance(); String connString = "jdbc:jtds:sqlserver://server_ip_address:1433/DBNAME;encrypt=fasle;user=xxxxxxxxx; password=xxxxxxxx;instance=SQLEXPRESS;"; String username = "xxxxxx"; String password = "xxxxxxxxxx"; conn = DriverManager.getConnection(connString,username,password); Log.w("Connection","open"); Statement stmt = conn.createStatement(); ResultSet reset = stmt.executeQuery("select * from TableName"); while(reset.next()){ Log.w("Data:",reset.getString(3)); } conn.close(); } catch (Exception e) { Log.w("Error connection","" + e.getMessage()); } } |
در کد بالا بعد از برقراری اتصال ،کوئری select * from TableName اجرا می شود و سپس ستون چهارم هر رکورد در Logcat نمایش داده می شود.
شاید مواردی زیادی نباشد که در آن نیاز به اتصال مستقیم از اندروید به SQL Server داشته باشیم. اما دانستن امکان این اتصال شاید قسمتی از طراحی چارت سیستمی مارا دچار دگرگونی کند.