# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  نکاتی در رابطه با ADO.Net

## Dariuosh

سلام 
میگم یه کلاس با این کد به پروژتون اضافه کنید 

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

سلام. ممنون از اینکه این توابع رو اینجا گذاشتی، من هم تقریبا یه همچین چیزایی رو توی یه کلاس به اسم 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

> نونه بازویه خودتونو بخورید


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

----------


## Dariuosh

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


1- ممنون از توجهتون 
2-آخه وقتی کد یه کلاس رو داشته باشی یعنی DLLاش رو هم داری دیگه 
3-منظور از جدول توضیح راجع به Propertyهاس ؟




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


قرار نیست کسی دات نت رو کنار بزاره یه مثال میزنم که منظورم رو بهتر برسونم
فرض کن تو یه پروژه مثلاً از 50تا TextBox مایکروسافت استفاده کردی حالا بعد از مدتی یه Control خیلی زیباتر و کارامدتر پیدا میکنی که میخوای جایگزین این TextBoxهای قدیمیت بکنی ؛ میتونی فکرش بکنی که چطوری میخوای دونه دونه تمامه این قدیمی هارو پاک کنی کداشونو از اول بنویسی اوووه کلی دردسر داره که من یکی که بیخیال میشم 
حالا اگه نونه بازوتو خورده بودی  :لبخند گشاده!:  و یه کلاس درست میکردی اینطوری 
PublicClass Mytextbox
Inherits TextBox
EndClass

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

----------


## VBExpress

سلام آقا داریوش




> PublicClass Mytextbox
> Inherits TextBox
> EndClass
> 
> و از این کنترلی که خودت درست کرده بودی




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

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

----------


## naeeme

آیا در وب هم میشه از این روش استفاده کرد؟؟

----------


## parsavb

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

----------


## Dariuosh

> آیا در وب هم میشه از این روش استفاده کرد؟؟


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

----------


## Dariuosh

در ادامه مطلب بالا ميخواستم بگم که شما از اين Class ميتونيد برايه ارتباط با 
هر ديتابيسي استفاده کنيد 
يعني فقط با يه تغيير کافيه که  برا ارتباط با Access و امثال اون

Imports System.Data.OleDb
PublicClass Connection
PrivateShared mvarConnectionString AsString
PrivateShared mvarCnt As OleDb.OleDbConnection
PrivateShared mvarCmd As OleDb.OleDbCommand
PrivateShared mvarDa As OleDb.OleDbDataAdapter


يا اوراکل

Imports System.Data.OracleClient
PublicClass Connection
PrivateShared mvarConnectionString AsString
PrivateShared mvarCnt As OracleConnection
PrivateShared mvarCmd As OracleCommand
PrivateShared mvarDa As OracleDataAdapter


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

----------


## naeeme

با اجازه!! 




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


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

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

----------


## Dariuosh

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


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

----------


## احمد سامعی

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


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

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

----------


## BAHAL_KEYHAN

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

----------


## shocraneh

اگر مقدور است يک پروژه که با کلاس ها کار شده,در حد یک ثبت ساده 
برام بگذاريدآخه من تعریف کلاس ها را فهميدم ولي شيوه دسترسی و  استفاده ي آن را نمي دانم
اگه ممکنه سریعتر  البته شاید دوستان نظرشان این باشدکه برنامه خودم را اشکال گیری کنند  ,  روی
.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

خواهشن اونایی که کار کردن یکی از برنامه هاشون رو بذارن

----------


## sh2007

با سلام
دوستان كسي نمي تونه يه كلاس ثبت رو بنويسه!!!

----------


## shahab2025

سلام
در پست اول یک کلاس نوشته میشه . چطوری میشه ازش استفاده کرد
مذسی

----------


## j_naroogha@yahoo.com

ممنون از شما

----------


## popo69

میشه دستورات *حذف و درج و جستجو* *و آپدیت* در بانک رو به شکل زیر بزارین؟
ببیندی همون راهی که گفتین *( با استفاده از 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");

----------

