PDA

View Full Version : نکاتی در رابطه با ADO.Net



Dariuosh
چهارشنبه 21 فروردین 1387, 23:47 عصر
سلام
میگم یه کلاس با این کد به پروژتون اضافه کنید

Imports System.Data.SqlClient
PublicClass DataBase
PrivateShared mvarConnectionString AsString
PrivateShared mvarCnt As SqlConnection
PrivateShared mvarCmd As SqlCommand
PrivateShared mvarDa As SqlDataAdapter
PublicSharedProperty ConnectionString() AsString
Get
Return mvarConnectionString
EndGet
Set(ByVal value AsString)
mvarConnectionString = value
EndSet
EndProperty
PublicSharedReadOnlyProperty Cnt() As SqlConnection
Get
If IsNothing(mvarCnt) Then
mvarCnt = New SqlConnection
EndIf
If mvarCnt.State <> ConnectionState.Open Then
With mvarCnt
.ConnectionString = mvarConnectionString
.Open()
EndWith
EndIf
Return mvarCnt
EndGet
EndProperty
PublicSharedReadOnlyProperty Cmd() As SqlCommand
Get
If IsNothing(mvarCmd) Then
mvarCmd = New SqlCommand
EndIf
mvarCmd.Connection = Cnt
Return mvarCmd
EndGet
EndProperty
PublicSharedReadOnlyProperty Da() As SqlDataAdapter
Get
If IsNothing(mvarDa) Then
mvarDa = New SqlDataAdapter
EndIf
mvarDa.SelectCommand = Cmd
Return mvarDa
EndGet
EndProperty
EndClass

حالا که چی ؟ :متفکر:
شاید اول باید میگفتم که هدف از این کار چیه ، خوب فرض کنید شما میخواید یه سری اطلاعات رو از بانکتون که SQL Server هست بخونید
یه راهش اینه از سیستمهای Rad خود مایکروسافت استفاده کنید یعنی ویزاردی DataSetو TableAdapterرو BindingSourecاو ادامه مراحل رو انجام بدید تا آخر
یه راهشم اینه که نونه بازویه خودتونو بخورید یعنی با استفاده از کد اول یه Connection تعریف کنید بعد یه Command و بعدشم یه DataAdapter وپس از ست کردن پارامتراشون Datatable مورد نظر رو پر کنید اینجوری

Private Cnt AsNew SqlClient.SqlConnection
Private Cmd AsNew SqlClient.SqlCommand
Private Da AsNew SqlClient.SqlDataAdapter
Private Dt AsNew DataTable
PrivateSub FillData()
With Cnt
.ConnectionString = " ...... "
.Open()
EndWith
With Cmd
.Connection = Cnt
.CommandText = ".......(Quary Morede Nazar)......"
EndWith
With Da
.SelectCommand = Cmd
.Fill(Dt)
EndWith
EndSub


نمیخوام روده دارازی کنم چون میدونم همتون بهتر از من این داستانارو بلدین

حسن این کلاس اینه که اول برنامه ConnectionString رو ست میکنین از اون به بعد شما هرجای برنامتون که احتیاج به ارتباط با DataBaseاتون داشته باشین فقط کافیه Quaryتون رو تو Cmd.CommandText بریزید و ازش استفاده کنید
دیگه نمیخواد هی Connection رو هی چک کنید که Open هست یا نه یا کارایه تکراری رو انجام بدین
چند تا مثال میزنم که بهتر منظورم رو برسونم

مثلاً یه Insert یا Update

With Cmd
.CommandText = ".......(Quary Morede Nazar)......"
.CommandType = CommandType.Text
.ExecuteNonQuery()
EndWith

یا پر کردن یه DataTable

Cmd.CommandText = ".......(Quary Morede Nazar)......"
Da.Fill(Dt)


راستی حسناش زیاده نمیشه همشو نوشت اگه استفاده کردین ضرر نمیکنین
از اینکه وقت گزارشتین ممنونم

reza6384
پنج شنبه 22 فروردین 1387, 00:22 صبح
سلام. ممنون از اینکه این توابع رو اینجا گذاشتی، من هم تقریبا یه همچین چیزایی رو توی یه کلاس به اسم BestFunctions برای خودم نوشتم که دفعات زیادی ازش استفاده می کنم ، مثل شما. مثلا :


Function IsEnter(ByVal e As System.Windows.Forms.KeyPressEventArgs) AsBoolean
If e.KeyChar = Chr(Keys.Return) Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction

که این تابع رو 1000 بار توی برنامه ام Call می کنم و یه سری از این چیزا.

فکر می کنم نکته مفیدی که اینجا باید بهش اشاره کرد اینه که با استفاده از این نوع کلاس ها که بارها توی برناممون به کار میاد هم Reusability رو بالا می بریم، هم حجم کد کمتر می شه، هم خوانا تر و خلوت تر و قابل فهم تر می شه و هم اینکه کد ساختار یافته تر می شه.

یه نظر هم دارم، وقتی میایم و این کلاس ها رو معرفی می کنیم، اول اون ها رو کامل تست کنیم، دوم اینکه Dll بسازیم و یک جدول هم درست کنیم که Property ها و متدهای کلاس رو با توضیحاتش نمایش بده. اینجوری خیلی بهتره تا اینکه کاربر از روی کد متوجه بشه که کدوم تابع چه کاری انجام میده.

VBExpress
پنج شنبه 22 فروردین 1387, 12:24 عصر
نونه بازویه خودتونو بخورید


اگر اینجوریه پس باید VB.Net رو کنار بذاریم ...

Dariuosh
جمعه 23 فروردین 1387, 11:33 صبح
یه نظر هم دارم، وقتی میایم و این کلاس ها رو معرفی می کنیم، اول اون ها رو کامل تست کنیم، دوم اینکه Dll بسازیم و یک جدول هم درست کنیم که Property ها و متدهای کلاس رو با توضیحاتش نمایش بده. اینجوری خیلی بهتره تا اینکه کاربر از روی کد متوجه بشه که کدوم تابع چه کاری انجام میده.
1- ممنون از توجهتون
2-آخه وقتی کد یه کلاس رو داشته باشی یعنی DLLاش رو هم داری دیگه
3-منظور از جدول توضیح راجع به Propertyهاس ؟


اگر اینجوریه پس باید VB.Net رو کنار بذاریم ...
قرار نیست کسی دات نت رو کنار بزاره یه مثال میزنم که منظورم رو بهتر برسونم
فرض کن تو یه پروژه مثلاً از 50تا TextBox مایکروسافت استفاده کردی حالا بعد از مدتی یه Control خیلی زیباتر و کارامدتر پیدا میکنی که میخوای جایگزین این TextBoxهای قدیمیت بکنی ؛ میتونی فکرش بکنی که چطوری میخوای دونه دونه تمامه این قدیمی هارو پاک کنی کداشونو از اول بنویسی اوووه کلی دردسر داره که من یکی که بیخیال میشم
حالا اگه نونه بازوتو خورده بودی :لبخند: و یه کلاس درست میکردی اینطوری

PublicClass Mytextbox
Inherits TextBox
EndClass

و از این کنترلی که خودت درست کرده بودی جایه اون TextBoxها استفاده میکزدی ، فقط کافی بود که یه خط کد رو تو پروژت عوض کنی ، تا کله TextBoxهای قدیمیت عوض شه، بی درده سر
و کلی محسنات دیگه :لبخندساده:

VBExpress
جمعه 23 فروردین 1387, 11:50 صبح
سلام آقا داریوش



PublicClass Mytextbox
Inherits TextBox
EndClass

و از این کنترلی که خودت درست کرده بودی


کاملا موافقم و همین کار رو هم میکنم ... ولی گفتم هیچوقت نمیشه گفت برنامه نویس نون بازویه خودشو میخوره !!! مگر اینکه زبان های سطح بالا رو کنار بگذارید !!! ( که تقریبا غیر ممکن هست !!!)

همین مثالی که شما خودت این بالا زدی ... اینجا شما بازم نون textbox میکروسافت رو خوردی !!!!

naeeme
دوشنبه 13 خرداد 1387, 15:02 عصر
آیا در وب هم میشه از این روش استفاده کرد؟؟

parsavb
دوشنبه 13 خرداد 1387, 16:53 عصر
دوستان من بهتر نیست به کفته حضرت علی کم بگوئیم و...........
به نظر این حقیر، بهتره که بزرگترها این همه غرور رو بذارن کنار و دست ما کوچیکترها رو بگیرن شاید ما هم تونستیم تو این حرفه به جائی برسیم
فکر نمی کنم جای این گلایه اینجا باشه ولی این روزها دیگه هیچ سوالی حل نمیشه بلکه فقط روزانه سوالهای زیادی بدون جواب می مونه ،البته بگذریم از بسیاری مطالب اضافی و بی مورد که یک هو به ذهن امثال من می رسه و عشقمون می کشه برای این فکر بی ارزش که شاید به خاطر اینکه مدتها دنبال اون بودیم ویک هو پیدا ش کردیم یک تاپیک ایجاد کنیم .
تاپیکها رو پر بار کنیم تا همه پیشرفت رو ببینیم ،
بیائید همه با هم برای همه تلاش کنیم تا هممون رو به جلو قدم برداریم نه اینکه دانسته هامون رو دلمون نیاد در اختیار دیگران بگذاریم
شرمنده زیادی فک ول کردم

Dariuosh
سه شنبه 14 خرداد 1387, 15:54 عصر
آیا در وب هم میشه از این روش استفاده کرد؟؟

حقيقتاً من از وب زياد اطلاعاتي ندارم اميدوارم بچه هاي وب کار جوابتون رو بدن

Dariuosh
سه شنبه 14 خرداد 1387, 16:07 عصر
در ادامه مطلب بالا ميخواستم بگم که شما از اين Class ميتونيد برايه ارتباط با
هر ديتابيسي استفاده کنيد
يعني فقط با يه تغيير کافيه که برا ارتباط با Access و امثال اون


Imports System.Data.OleDb
Public Class Connection
Private Shared mvarConnectionString As String
Private Shared mvarCnt As OleDb.OleDbConnection
Private Shared mvarCmd As OleDb.OleDbCommand
Private Shared mvarDa As OleDb.OleDbDataAdapter


يا اوراکل


Imports System.Data.OracleClient
Public Class Connection
Private Shared mvarConnectionString As String
Private Shared mvarCnt As OracleConnection
Private Shared mvarCmd As OracleCommand
Private Shared mvarDa As OracleDataAdapter


قابل استفاده بشه

naeeme
سه شنبه 14 خرداد 1387, 22:54 عصر
با اجازه!!


حقيقتاً من از وب زياد اطلاعاتي ندارم اميدوارم بچه هاي وب کار جوابتون رو بدن
اول، مرسی که جوابم رو دادید. فکر کنم توی وب هم بشه استفاده کرد. حداقل تا حالا که برنامه من خطانداده!! اگه وقتی Upload کردم خطا بده، دیگه نمی دونم!!

دوم، یه متد این کدتون کم داره. متدی که connection رو refresh کنه. خیلی وقتها به هر دلیلی امکان قطع ارتباط وجود داره که نیاز هست یه متد برای به روز رسانی نوشته بشه. (البته من این رو برای یاد آوری به سایر دوستان نوشتم)

Dariuosh
چهارشنبه 15 خرداد 1387, 06:09 صبح
دوم، یه متد این کدتون کم داره. متدی که connection رو refresh کنه. خیلی وقتها به هر دلیلی امکان قطع ارتباط وجود داره که نیاز هست یه متد برای به روز رسانی نوشته بشه. (البته من این رو برای یاد آوری به سایر دوستان نوشتم)


If mvarCnt.State <> ConnectionState.Open Then
With mvarCnt
.ConnectionString = mvarConnectionString
.Open()
EndWith
خوب اين قسمتش همين کارو ميکنه ديگه !
در حقيقت با هر بار فراخواني يه بار وضعيت ارتباط چک ميشه اگه برقرار بود که هيچ وگرنه دوباره Open ميکنه

احمد سامعی
پنج شنبه 08 اسفند 1387, 17:24 عصر
سلام
حسن این کلاس اینه که اول برنامه ConnectionString رو ست میکنین از اون به بعد شما هرجای برنامتون که احتیاج به ارتباط با DataBaseاتون داشته باشین فقط کافیه Quaryتون رو تو Cmd.CommandText بریزید و ازش استفاده کنید
دیگه نمیخواد هی Connection رو هی چک کنید که Open هست یا نه یا کارایه تکراری رو انجام بدین


سؤال:
1. در برنامه هاي چند لايه چطور مي شه ؟

2. مي شه يكي از دوستان اين كد به #C بده !!؟

BAHAL_KEYHAN
دوشنبه 12 اسفند 1387, 09:02 صبح
با عرض سلام و خسته نباشید خدمت همه ی دوستان
ببخشید می خواسنم بدونم این کلاس با کلاس خود data set vb یکی میدونید.اگه جوابتون آره است که باید بگم اطلاعاتتون در این زمینه ناکافیه
dataset vb این امکان بهتون میده که دیگه با command های sql در گیر نشید البته این یه مثالش بود.اگه اطلاعات بیشتری خواستین توصیه میکنم کتابای ado.net رو بخونید

shocraneh
پنج شنبه 14 خرداد 1388, 22:35 عصر
اگر مقدور است يک پروژه که با کلاس ها کار شده,در حد یک ثبت ساده
برام بگذاريدآخه من تعریف کلاس ها را فهميدم ولي شيوه دسترسی و استفاده ي آن را نمي دانم
اگه ممکنه سریعتر البته شاید دوستان نظرشان این باشدکه برنامه خودم را اشکال گیری کنند , روی
.ExecuteNonQuery()
بعد از اجرا می ایستدو خطای زیر را میدهد البته می دانم دلیل به خاطر عدم اتصال با بانک است
Connection property has not been initialized.
با تشکرنکته دیگه اینکه بعد از نوشتن این کدها صفحه ی design از بین می رود
///////////////////////////////////////////////////////////////////
Imports System.Data.SqlClient
Public Class DataBase
Private Shared mvarConnectionString As String
Private Shared mvarCnt As SqlConnection
Private Shared mvarCmd As SqlCommand
Public Shared Property ConnectionString() As String
Get
Return mvarConnectionString
End Get
Set(ByVal ByValvalue As String)
mvarConnectionString = "server=(local);database=a;integrated security=true"
End Set
End Property
Public Shared ReadOnly Property Cnt() As SqlConnection
Get
If IsNothing(mvarCnt) Then
mvarCnt = New SqlConnection
End If
If mvarCnt.State <> ConnectionState.Open Then
With mvarCnt
.ConnectionString = mvarConnectionString
.Open()
End With
End If
Return mvarCnt
End Get
End Property
Public Shared ReadOnly Property Cmd() As SqlCommand
Get
If IsNothing(mvarCmd) Then
mvarCmd = New SqlCommand
End If
mvarCmd.Connection = Cnt
Return mvarCmd
End Get
End Property
End Class
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Cnt As New SqlClient.SqlConnection
Dim Cmd As New SqlClient.SqlCommand
With Cnt
.ConnectionString = "server=(local);database=a;integrated security=true"
.Open()
End With
With Cmd
.CommandText = "insert into b values (11,'jj','ii')"
.CommandType = CommandType.Text
.ExecuteNonQuery()
End With
End Sub
End Class

shocraneh
چهارشنبه 27 خرداد 1388, 08:49 صبح
خواهشن اونایی که کار کردن یکی از برنامه هاشون رو بذارن

sh2007
چهارشنبه 15 مهر 1388, 13:36 عصر
با سلام
دوستان كسي نمي تونه يه كلاس ثبت رو بنويسه!!!

shahab2025
پنج شنبه 14 آبان 1388, 01:09 صبح
سلام
در پست اول یک کلاس نوشته میشه . چطوری میشه ازش استفاده کرد
مذسی

j_naroogha@yahoo.com
چهارشنبه 02 دی 1388, 12:35 عصر
ممنون از شما

popo69
پنج شنبه 02 دی 1389, 00:06 صبح
میشه دستورات حذف و درج و جستجو و آپدیت در بانک رو به شکل زیر بزارین؟
ببیندی همون راهی که گفتین ( با استفاده از dataset - oledbAdabpter -oledbConnection و ... که توی toolbox هست ) تورو خدا دستوراتشو به این شکل بنویسید- خسته شدم مخم پوکیید

این دستور درج اطلاعاته :




DataRow dr = bank1DataSet1.Student.NewRow();
dr["S"] = txtsh.Text;
dr["shmeli"] = txtshmeli.Text;
dr["fname"] = txtfname.Text;
dr["lname"] = txtlname.Text;
dr["mozo"] = txtmozo.Text;
dr["maghta"] = cboxmaghta.Text;
dr["reshte"] = cboxreshte.Text;
dr["ostadname"] = cboxostad.Text;
dr["city"] = cboxcity.Text;

string temp1 = cboxtsyear.Text.ToString() + "/" + cboxtsmonth.Text.ToString() + "/" + cboxtsday.Text.ToString();
dr["tarikhs"] = temp1;
string temp2 = cboxttyear.Text.ToString() + "/" + cboxttmonth.Text.ToString() + "/" + cboxttday.Text.ToString();
dr["tarikht"] = temp2;


dr["nomre"] = txtnomre.Text;
dr["address"] = txtaddress.Text;

bank1DataSet1.Student.Rows.Add(dr);
oleDbDataAdapter1.Update(bank1DataSet1);
studentBindingSource.EndEdit();

MessageBox.Show("etelaat sabt shod");