PDA

View Full Version : آموزش: ASP.NET و پايگاه داده



baran_mehr
سه شنبه 02 شهریور 1389, 22:56 عصر
سلام به همه دوستان عزیز:قلب:
در اين مقاله شما در مورد کار با با پايگاه داده در ASP.NET آشنا خواهيد شد. بدين معنا که در صدد هستيم تا رويه ای کلی از مفاهيم، روشها وابزارهای مورد استفاده در ASP.NET جهت برقراری ارتباط با پايگاه داده، نشان دادن داده ها، دستکاری داده ها، بهنگام سازی و... توسط اشيايی چون مهيا کننده های بانک های اطلاعاتی، DataSetها XML، و ... معرفی می شود.

اگر تا بحال با پايگاه داده کار نکرده ايد شايد provider يک پايگاه داده برای شما نامفهوم باشـد. بطور خلاصه راهی را که بايد طی کرد تا به پايگاه داده متصل شده، آنرا باز کرده و داده ها را دستکاری کرده و دستورات را اجرا نمود، بوسيله يک تهيه کننده اطلاعات مشخص می شود. در ASP.NET معمولا از دو روش برای اين کار استفاده می شود. روش اول اينکه اگر پايگاه داده شما از نوع SQL Server باشد بايستی با مدل SQLClient کار کرد و اگر پايگاه داده شما غير از SQL Server باشد (در حال حاضر) بايد از روش ديگر يعنی مدل OleDb استفاده نمود. بعنوان مثال اگر پايگاه داده شما Oracle ،Sybase و يا Access باشد بايد از روش OleDb استفاده کنيد.

روش کار بدين صورت است که ابتدا بايستی فضانام زير را در صفحاتی که از بانک اطلاعاتی استفاده می شود فراخوانی کرد:


<% @ Import NameSpace="System.Data" %>
<% @ Import NameSpace="System.Data.OleDb" %>

برای برقراری ارتباط با پايگاه معمولا از عبارت زير استفاده می شود:


Dim ObjConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; DataSource=e:\db\users.mdb")

که قسمت DataSource آدرس فايل پايگاه داده است که در اينجا يک بانک Access است. همانگونه که ملاحظه می کنيد از رشته ارتباطی يا Connection String بعنوان پارامتر استفاده شده است و بوسيله متد Open ارتباط باز می شود:


objConn.Open()

لازم به توضيح است که در پايان کار بوسيله متد Close ارتباط را خاتمه می دهيم.

بمحض ارتباط با پايگاه داده می توان دستورات را به آن فرستاد. اين کار معمولا بوسيله شی OleDbCommand انجام می شود. جهت انجام اين کار می توان يک دستور SQL يا نام يک روال ذخيره شده (Stored Procedure) را مشخص نمود و بنا به مقتضيات می توان اعمال مختلفی را روی پايگاه پياده نمود:


Dim objCommand As New OleDbCommand ( "Select * From users", objConn )

ملاحظه می کنيد که کلاس Command از دو پارامتر رشته SQL و نام رشته ارتباطی برای فرستادن دستورات به پايگاه داده استفاده می کند. برای مثال آنچه را که در عبارت فوق ديديد می توان به بخشهای کوچکتر زير تقسيم کرد.

ابتدا تعريف شي:


Dim objCommand As New OleDbCommand()

سپس نسبت دادن آن به رشته ارتباطی جهت برقراری ارتباط پايگاه:


objCommand.Connection= objConn
مشخص کردن عمليات مورد نظر بوسيله دستورات SQL:


objCommand.CommandText="Select * From Users"
حتی می توانيد عمليات فوق را بصورت ذيل انجام دهيد:


Dim objCommand As New OleDbCommand( SQL string, Connection string )روشهای فوق دقيقا يک کار مشابه را انجام می دهند با اين اوصاف که در عبارت آخر بجای شئ ارتباطی از يک رشته ارتباطی استفاده شده است. تا اين مرحله هنوز عبارات فوق را به اجرا در نياورده ايم. برای اين کار راه های متفاوتی وجود دارد:

- از ExecuteNonQuery زمانی استفاده می شود که قصد برگرداندن داده ها از پايگاه مورد نظر نباشد مثلا در مواقعی که از دستورات SQL جهت درج (Insert) و بهنگام سازی (Update) استفاده شود.


objCommand.ExecuteNonQuery
- از ExecuteReader برای خواندن و برگرداندن اطلاعات از پايگاه استفاده می کنيم.


Dim ObjRead As OleDbDataReader
objRead=objCommand.ExecuteReader
- برای دستکاری يک تک مقدار مشخص و مورد نظر از متد ExecuteScalar استفاده می شود.

برای خواندن داده ها معمولا از کلاس DataReader استفاده می شود -برای خواندن نه برای اضافه کردن يا بروز کردن- اين شئ بصورت مستقيم به پايگاه داده دسترسی دارد و فقط خواندنی (Read Only) است. البته اين خاصيت محدوديتی برای آن است اما برای خواندن ساده داده روشی کامل بشمار می رود.



Dim objReadaer As OleDbDataReader
objReader=objCommand.ExecuteReader
Whlie objReader.Read
Response.write(objReader.GetString(0)& " <br> " )
End While

عبارت فوق جهت نمايش و چاپ داده ها بکار می رود. متد Read خواندن را تا زمانيکه به پايان نتايج نرسد ادامه می دهد و عبارت objReader.GetString(0) برای برگرداندن نسخه رشته ای ستونهای رکورد کاربرد دارد. در ليست زير چند متد ديگر برای برگرداندن مقادير داده ای متغيرها آمده است:

GetBoolean(x) مقدار منطقی را بر می گرداند.
GetChar(x) مقدار کاراکتری را برمی گرداند.
Get DataTypeColumn(x) نوع داده را در ستون برميگرداند.
GetString(x) مقداررشته ای را برمی گرداند.
و...

در اين بخش شما به دانسته های بخش اول نياز داريد. شئ بعدی که مورد بحث قرار می گيرد کلاس Data Adapter است. OleDBDataAdapter اطلاعات را می گيرد و يک ارتباط منطقی بين داده ها و کلاس Dataset ايجاد ميکند. بطور کلی ميتوان گفت Data Adapter در نظر اول معادل Data Command می باشد. روش استفاده از Data Adapter ها بطور معمول بصورت زير تعريف می شود:



Dim objAdapter As New OleDBDataAdapter("Select * From Users",objConn)


ملاحظه می کنيد که شئ Adapter از دو پارامتر- يکی رشته دستورات SQL و ديگری رشته ارتباطی - برای فرستادن دستورات به پايگاه داده استفاده می کند. بطور معمول DataAdapter برای پرکردن DataSetها و بروز کردن پايگاه بوسيله يک DataSet و اجرا کردن دستورات بکار می رود. اکنون نمای کلی از کاربرد فوق را در زير می بينيد:



Dim ds As DataSet = New DataSet()
objAdapter.Fill(ds,"Users")


متد Fill جهت اجرای دستور تنظيم شده در Data Adapter بکار می رود. بعبارت ديگر اطلاعات واکشی شده از پايگاه داده در يک جدول با نامی که ما تعيين می کنيم (Users) ذخيره می شود.
نکته ضروری اينست که تکنيک Mappings در اکثر مواقع کارساز است. Mappings عبارت است از ساختن يک نام مستعار (Alias) برای نام جداول در يک Dataset. اين aliasها هيچگونه تاثيری در منبع داده ندارد و وقتی که بوسيله DataAdapter فرستاده می شود بصورت خودکار بنام پيش فرض تبديل ميشود. اين تکنيک باعث خوانايی کد و راهنمايی برنامه نويس در ارجاع های بعدی وتشخيص جداول فراخوانی شده ميشود.



objAdapter.TableMappings.Add("adbtable","Users")
with objAdapter.tableMapping(0).ColumnMappings
.Add("PID","ID")
.Add("LAstName","Lname")
.Add("StreetAddress","Addy")
End with
objAdapter.Fill(ds)


در تکنيک فوق بجای استفاده از عبارت ds.Tables("adbtable") ميتوانيم Ds.Tables("Users") را بکار ببريم. در بخشهای آينده ديگر فوايد استفاده از Mappings آمده است. همچنين کلاس CommandBuilder برای بهنگام کردن يک بانک که بوسيله Dataset صورت گرفته يک شيوه صحيح بشمار ميرود:



Dim cmdBLD As New OleDBCommandBuilder(objAdapter)


که در عبارت فوق شئ objAdapter بعنوان پارامتر به دستور CommandBuilder فرستاده شده و سپس بوسيله متد Update منبع داده بهنگام می شود:



objAdapter.Update(ds,"Users")


در ادامه، مثال زير بعنوان جمع بندی مطالب قبلی آمده است. توجه داشته باشيد در مثال زير نتيجه ای بعنوان خروجی در مرورگر نمايش داده نمی شود و فقط از منبع داده ای اطلاعات خوانده شده و يک شئ Dataset پر می شود:



<%@ Import NameSpace="System.data" %>
<%@ Import NameSpace="System.Data.OleDB" %>

<Script Language="VB" Runat="Server">

Sub Page_Load( Sender As Object, E As EventArgs)
Dim objConn As New OleDBConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=e:\db\users.mdb")

objConn.Open()
Dim ds As DataSet=New DataSet
Dim objAdapter As New OleDBDataAdapter("Select * From Users",objConn)
Dim objcmdBLD As New OleDBCommandBuilder(objAdapter)
Obj.Adapter.Fill(ds,"Users")
End Sub

</Script>

HABIB_TANHA
دوشنبه 01 آذر 1389, 11:21 صبح
بابت همه اين توضيحات ممنونم
مشکل من اينه که ميخوام يک فيلد خاص رو روي يک label نمايش بدم مثلا هر کاربري که وارد صفحه شد وقتي کد کاربري خودش رو وارد کرد بالاي صفحه بوسيله يک label اسمش رو چاپ کنيم و خوش آمد بگيم

baran_mehr
دوشنبه 01 آذر 1389, 15:25 عصر
مشکل من اينه که ميخوام يک فيلد خاص رو روي يک label نمايش بدم مثلا هر کاربري که وارد صفحه شد وقتي کد کاربري خودش رو وارد کرد بالاي صفحه بوسيله يک label اسمش رو چاپ کنيم و خوش آمد بگيم
خوب این کار به این بستگی داره که از چه سیستمی برای ورود استفاده میکنید.
اگر از خود سیستم asp استفاده میکنید که یک شئ برای این کار وجود داره
اگر هم دستی این کار رو انجام میدید میتونید بعد از login کردن کاربر با استفاده از سشن و یا کوکی و یا ... اسم و فامیلی کاربر رو بین صفحات ارسال کنید.
یعنی بعد از لوگین کردن کاربر ، در صورتی که کاربر وجود داشت نام و نام خانوادگی رو واکشی کنید و به سشن و یا ... بدید

behesht.royaha
جمعه 15 بهمن 1389, 19:40 عصر
با سلام و تشكر از مطالب بسيار عالي كه قرار داده ايد.
مشكل من با asp اينه كه ميخوام داده ها رو مستقيم از بانك اطلاعتي بر روي textbox و يا label ببينم.
نه اينكه بره داخل datagrid و datalist . آيا راهي داره كه من مثلا داده رو داخل textbox وارد كنم داخل بانك اطلاعاتي ذخيره بشه و بعد اون داده و يا داده هاي كه جستجو ميكنم داخل تكست باكس براي ويراش لود كنم. اگه بشه يك مثال هم بزاريد خيلي ممنون ميشم.
لطفا منو راهنمايي كنيد.هر جايي كتابي ، مثلايي گير ميارم همه با استفاده از datagrid كار ميكنن.لطفاا كمكم كنيد

baran_mehr
جمعه 15 بهمن 1389, 22:08 عصر
خوب وقتی داده ها رو واکشی کردید ،درون datatable بریزید و از datatable اطلاعات رو به textbox بدهید
اگر هم از dataset استفاده میکنید همین کار رو با dataset انجام دهید

behesht.royaha
جمعه 15 بهمن 1389, 23:28 عصر
با تشكر از شما baran_mehr جان.
ميشه لطف كني يه مثال با mysql برام بزاري.مثلا يك فيلد به نام id را با1 textbox پر كنيم و اطلاعات ذخيره شده را به وسيله يه تكست باكس به نام textbox2 واكشي كنيم.
با تشكر

baran_mehr
شنبه 16 بهمن 1389, 14:13 عصر
یک تیکه کد میزارم خودتون بقیشو انجام بدید تا باهاش اشنا بشید و اگر نتونستید بگید

Dim cmd As New OleDbCommand
Dim cnt As New OleDbConnection
Dim dt As New Data.DataTable
Dim da As New OleDbDataAdapter
برای واکشی اطلاعات و ریختن در datatable


cnt.ConnectionString ="ConnectionString"
cnt.Open()
cmd.Connection = cnt
cmd.CommandText = "Select * from table where id='"& TextBox1.text &"'"
dt.Clear()
da.SelectCommand = cmd
da.Fill(dt)

خوب حالا میتونید مقادیر درون dt (دیتا تیبل) رو استفاده کنید

behesht.royaha
یک شنبه 17 بهمن 1389, 18:29 عصر
با تشكر از شما دوست عزيزي كه پاسخگوي ما مبتدي ها هستيد.
واقعا عالي بود دستت درد نكنه.
من با زبان #c كار ميكنم ميشه لطف كنيد كه از اين زبان مثال بزاريد.
خواستم اينم بپرسم ببينم چرا وقتي اطلاعات رو با كد بالا داخل بانك اينسرت ميكنم چند تا كاراكتر خالي هم باهاش ذخيره ميشه مثلا اينجوري : . sajad يا . amir فاصله بين متن تا نقطه فرضي رو خالي ميندازه.
خيلي ممنون.

راستي اينم سايت منه اگه افتخاري داديد مهندس سري بزنيد من تو كار مايا هستم ولي علاقه زيادي هم به asp دارم.
http://mayalearn.gigfa.com/

baran_mehr
یک شنبه 17 بهمن 1389, 22:34 عصر
با تشكر از شما دوست عزيزي كه پاسخگوي ما مبتدي ها هستيد.
من خودم هم هنوز مبتدی هستم

راستي اينم سايت منه اگه افتخاري داديد مهندس سري بزنيد من تو كار مايا هستم ولي علاقه زيادي هم به asp دارم.
http://mayalearn.gigfa.com/
سایتتون رو دیدم سایت خیلی خوبیه

و اما واکشی و ریختن مقدار در textbox

objConnection.Open();
objCommand.Connection = objConnection;
objCommand.CommandText = "SELECT id FROM [table]";
dt.Clear();
da.SelectCommand = objCommand;
da.Fill(dt);
if( dt.Rows.Count != 0)
TextBo2.Text = dt.Rows[0][0].ToString();
objConnection.Close();
da همون شی DataAdapter هست

OleDbDataAdapter da = new SqlDataAdapter ();

behesht.royaha
دوشنبه 18 بهمن 1389, 17:11 عصر
با سلام ممنون از شما.
يه سوال كه پيش اومده اينه كه چطور ميتونم به پايگاه داده mysql كانكت بشم و از اون استفاده كنم ؟؟

baran_mehr
دوشنبه 18 بهمن 1389, 22:18 عصر
يه سوال كه پيش اومده اينه كه چطور ميتونم به پايگاه داده mysql كانكت بشم و از اون استفاده كنم ؟؟
سلام
متاسفانه در این مورد چیزی نمیدونم و تا به حال به mysql وصل نشدم. شاید بقیه دوستان بتونن کمک کنن

behesht.royaha
شنبه 23 بهمن 1389, 19:27 عصر
با سلام دوست عزيز.
ممنون بابت پاسخگويي سريعت.سوالي كه داشتم اينه كه چطور ميشه از focus استفاده كرد.ميخوام وقتي كه در تكست باكس يك هستم با زدن كليد اينتر برم تكست باكس 2. قبلا با ويژوال بيسيك مينوشتم اما اينجا بكلي فرق داره.
ممنون

baran_mehr
شنبه 23 بهمن 1389, 23:29 عصر
چطور ميشه از focus استفاده كرد.ميخوام وقتي كه در تكست باكس يك هستم با زدن كليد اينتر برم تكست باكس 2. قبلا با ويژوال بيسيك مينوشتم اما اينجا بكلي فرق داره.
دوست عزیز سوالتون رو در یک پست جدید مطرح کنید چون این سوال مربوط به بحث دیتابیس نیست و با مطرح کردن در پست جدید کار قوانین سایت رو هم رعایت میکنید
افرادی که وارد این پست میشن دنبال مطالبی مربوط به عنوان همین پست هستن ولی با پست هایی روبه رو میشن که با موضوع مرتبط نیست
لطفا سوالتون رو در یک پست جدید مطرح کنید بنده پاسخ سوالتون رو در همون پست خواهم گذاشت
موفق و پیروز باشید

mamaligh67
سه شنبه 06 آبان 1393, 09:20 صبح
سلام میشه به زبان C# هم آموزش بدید؟؟ در ضمن نحوه ارتباط با دیتابیس از طریق کلاس هم بگین.