PDA

View Full Version : یه کلاس به درد به خور نوشتم برای ADO.Net2.0



niloufar
یک شنبه 16 بهمن 1384, 14:10 عصر
با سلام به همه دوستان
1- چند روزی بود که همه دنبال یه مثال برای ADO.Net 2.0 بودند.
2- چند تا pm برام اومد در همین رابطه
3- جناب مطهر در دو تاپیک خواسته بودند که یکی یه مثال بذاره
4- خودم هم تو کارام بالاخره باید یه کلاس می نوشتم (البته به درد الانم نمیخورد ولی برای آینده چرا)


این شد که یه کلاس نوشتم که کد اونو تو پست بعدی می ذارم و در پست های بعد از آن یه کم توضیحش میدم.

niloufar
یک شنبه 16 بهمن 1384, 14:13 عصر
' ************************************************** **********************************
' In the name of god
' This Class Help you to use ADO.Net 2.0
' Provider: Niloufar
' ************************************************** **********************************


Imports System
Imports System.Data

Public Class clsADO
'Public part

''' <summary>
''' This Constractor is for MsAccess DataBases
''' </summary>
''' <param name="strPathAndFileName">MsAccess DataBase full file name (Path\FileName)</param>
''' <remarks></remarks>
Public Sub New(ByVal strPathAndFileName As String)
DataBaseType = DataBaseTypes.MsAccess
strlocalPathAndFileName = strPathAndFileName
End Sub

''' <summary>
''' This constractor is for MsSqlServer DataBases
''' </summary>
''' <param name="strServerName">MsSqlServer Server Name</param>
''' <param name="strDataBaseName">DataBase Name</param>
''' <param name="strUserId">User Id</param>
''' <param name="strPassword">Password</param>
''' <remarks></remarks>
Public Sub New(ByVal strServerName As String, ByVal strDataBaseName As String, ByVal strUserId As String, ByVal strPassword As String)
DataBaseType = DataBaseTypes.MsSqlServer
strlocalServerName = strServerName
strlocalDataBaseName = strDataBaseName
strlocalUserId = strUserId
strlocalPassword = strPassword
End Sub

''' <summary>
''' This constractor is for Oracle DataBases
''' </summary>
''' <param name="strSID">Oracle System Identifier</param>
''' <param name="strUserId">User Id</param>
''' <param name="strPassword">Password</param>
''' <remarks></remarks>
Public Sub New(ByVal strSID As String, ByVal strUserId As String, ByVal strPassword As String)
DataBaseType = DataBaseTypes.Oracle
strlocalSID = strSID
strlocalUserId = strUserId
strlocalPassword = strPassword
End Sub

''' <summary>
''' Dispose this class
''' </summary>
''' <param name="Disposing">Set to TRUE if you want to dispose any objects used in this class and set them to nothing</param>
''' <remarks></remarks>
Public Overloads Sub Dispose(ByVal Disposing As Boolean)
If Not Me.Disposed Then
If Disposing Then
If Not objConnection Is Nothing Then
If objConnection.State <> ConnectionState.Closed Then
objConnection.Close()
End If
objConnection.Dispose()
objConnection = Nothing
End If
If Not objCommand Is Nothing Then
objCommand.Dispose()
objCommand = Nothing
End If
If Not objDataAdapter Is Nothing Then
objDataAdapter.Dispose()
objDataAdapter = Nothing
End If
Me.Disposed = True
End If
End If
End Sub

''' <summary>
''' Get a DataTable object by a text query
''' </summary>
''' <param name="strQuery">SELECT query that you want to fill DataTable by this query</param>
''' <returns>DataTable object filled by entered query</returns>
''' <remarks></remarks>
Public Function GetDataTableByQuery(ByVal strQuery As String) As DataTable
Select Case DataBaseType
Case DataBaseTypes.MsAccess
Call OpenMsAccessConnection(strlocalPathAndFileName)
Case DataBaseTypes.MsSqlServer
Call OpenMsSqlServerConnection(strlocalServerName, strlocalDataBaseName, strlocalUserId, strlocalPassword)
Case DataBaseTypes.Oracle
Call OpenOracleConnection(strlocalSID, strlocalUserId, strlocalPassword)
End Select
CommandType = Data.CommandType.Text
InitializeCommand(strQuery)
Try
objDataAdapter = New OleDb.OleDbDataAdapter(objCommand)
Dim objDataTable As New DataTable
objDataAdapter.Fill(objDataTable)
Return (objDataTable)
Catch ex As OleDb.OleDbException
Throw New System.Exception(ex.Message, ex.InnerException)
End Try
End Function

''' <summary>
''' Execute any text query (Select, Insert, Update, Delete) and return the number of rows affected by this query
''' </summary>
''' <param name="strQuery">Text query that you want to execute it</param>
''' <returns>The number of rows affected by entered query</returns>
''' <remarks></remarks>
Public Function ExecuteQuery(ByVal strQuery As String) As Integer
Select Case DataBaseType
Case DataBaseTypes.MsAccess
Call OpenMsAccessConnection(strlocalPathAndFileName)
Case DataBaseTypes.MsSqlServer
Call OpenMsSqlServerConnection(strlocalServerName, strlocalDataBaseName, strlocalUserId, strlocalPassword)
Case DataBaseTypes.Oracle
Call OpenOracleConnection(strlocalSID, strlocalUserId, strlocalPassword)
End Select
CommandType = Data.CommandType.Text
InitializeCommand(strQuery)
Try
ExecuteQuery = objCommand.ExecuteNonQuery
Catch ex As OleDb.OleDbException
Throw New System.Exception(ex.Message, ex.InnerException)
End Try
End Function

''' <summary>
''' You should call this sub befor getting DataTable or execute StoredProecedure for adding parameters of StoredProcedure
''' </summary>
''' <param name="SPName">StoredProcedure Name that you want Execute it</param>
''' <remarks></remarks>
Public Sub InitializeStoredProcedure(ByVal SPName As String)
Select Case DataBaseType
Case DataBaseTypes.MsAccess
Call OpenMsAccessConnection(strlocalPathAndFileName)
Case DataBaseTypes.MsSqlServer
Call OpenMsSqlServerConnection(strlocalServerName, strlocalDataBaseName, strlocalUserId, strlocalPassword)
Case DataBaseTypes.Oracle
Call OpenOracleConnection(strlocalSID, strlocalUserId, strlocalPassword)
End Select
CommandType = Data.CommandType.StoredProcedure
InitializeCommand(SPName)
End Sub

''' <summary>
''' Add a Parameter of StoredProcedure. Note: you should call the InitializeStoredProcedure sub befor using this sub
''' </summary>
''' <param name="Name">Parameter name</param>
''' <param name="Type">Parameter type</param>
''' <param name="Size">Parameter size</param>
''' <param name="Value">Parameter value</param>
''' <remarks></remarks>
Public Sub AddParameter(ByVal Name As String, ByVal Type As OleDb.OleDbType, ByVal Size As Integer, ByVal Value As Object)
Try
objCommand.Parameters.Add(Name, Type, Size).Value = Value
Catch ex As OleDb.OleDbException
Throw New System.Exception(ex.Message, ex.InnerException)
End Try
End Sub

''' <summary>
''' Get DataTable Object by Execute the StoredProcedure that you enter it in the InitializeStoredProcedure sub. Note: you should call the InitializeStoredProcedure sub befor using this function
''' </summary>
''' <returns>DataTable object filled by entered StoredProcedure</returns>
''' <remarks></remarks>
Public Function GetDataTableByStoredProcedure() As DataTable
Try
objDataAdapter = New OleDb.OleDbDataAdapter(objCommand)
Dim objDataTable As New DataTable
objDataAdapter.Fill(objDataTable)
Return (objDataTable)
Catch ex As OleDb.OleDbException
Throw New System.Exception(ex.Message, ex.InnerException)
End Try
End Function

''' <summary>
''' Execute the StoredProcedure that you enter it in the InitializeStoredProcedure sub. Note: you should call the InitializeStoredProcedure sub befor using this function
''' </summary>
''' <returns>The number of rows affected by entered StoredProcedure</returns>
''' <remarks></remarks>
Public Function ExecuteStoredProcedure() As Integer
Try
ExecuteStoredProcedure = objCommand.ExecuteNonQuery
Catch ex As OleDb.OleDbException
Throw New System.Exception(ex.Message, ex.InnerException)
End Try
End Function




'Private part

Private Enum DataBaseTypes As Byte
MsAccess = 1
MsSqlServer = 2
Oracle = 3
End Enum

Private CommandType As CommandType = CommandType.Text

Private Disposed As Boolean
Private DataBaseType As DataBaseTypes
Private strlocalPathAndFileName As String
Private strlocalServerName As String
Private strlocalDataBaseName As String
Private strlocalSID As String
Private strlocalUserId As String
Private strlocalPassword As String

Private objConnection As OleDb.OleDbConnection
Private objCommand As OleDb.OleDbCommand
Private objDataAdapter As OleDb.OleDbDataAdapter

Private Sub OpenMsAccessConnection(ByVal strPathAndFileName As String)
objConnection = New OleDb.OleDbConnection
objConnection.ConnectionString = "Provider=Microsoft.Jet.Oledb.4.0;" & _
"Data Source=" & strPathAndFileName & ";"
Try
objConnection.Open()
Catch ex As OleDb.OleDbException 'Connection-Level Exceptions
Throw New Exception(ex.Message, ex.InnerException)
Catch ex As InvalidOperationException 'Trying to open a connection that is already opened
Throw New Exception(ex.Message, ex.InnerException)
End Try
End Sub

Private Sub OpenMsSqlServerConnection(ByVal strServerName As String, ByVal strDataBaseName As String, ByVal strUserId As String, ByVal strPassword As String)
objConnection = New OleDb.OleDbConnection
objConnection.ConnectionString = "Provider=SQLOLEDB;" & _
"Data Source=" & strServerName & ";" & _
"DataBase=" & strDataBaseName & ";" & _
"User ID=" & strUserId & ";" & _
"Password=" & strPassword & ";"
Try
objConnection.Open()
Catch ex As OleDb.OleDbException 'Connection-Level Exceptions
Throw New Exception(ex.Message, ex.InnerException)
Catch ex As InvalidOperationException 'Trying to open a connection that is already opened
Throw New Exception(ex.Message, ex.InnerException)
End Try
End Sub

Private Sub OpenOracleConnection(ByVal strSID As String, ByVal strUserId As String, ByVal strPassword As String)
objConnection = New OleDb.OleDbConnection
objConnection.ConnectionString = "Provider=MSDAORA;" & _
"Data Source=" & strSID & ";" & _
"User ID=" & strUserId & ";" & _
"Password=" & strPassword & ";"
Try
objConnection.Open()
Catch ex As OleDb.OleDbException 'Connection-Level Exceptions
Throw New Exception(ex.Message, ex.InnerException)
Catch ex As InvalidOperationException 'Trying to open a connection that is already opened
Throw New Exception(ex.Message, ex.InnerException)
End Try
End Sub

Private Sub InitializeCommand(ByVal strQueryOrSPName As String)
Try
objCommand = New OleDb.OleDbCommand(strQueryOrSPName, objConnection)
objCommand.CommandType = CommandType
Catch ex As Exception
Throw New System.Exception(ex.Message, ex.InnerException)
End Try
End Sub
End Class

niloufar
یک شنبه 16 بهمن 1384, 14:17 عصر
اول خواستم Dll کنم که استفادش راحت بشه ولی کد گذاشتم تا دو گروه بتونن ازش استفاده کنند:
1- کسانی که می خواستند ADO.Net 2.0 را یاد بگیرند اونم شسته رفته (که در این صورت باید به متن کدها نگاه کنند)
2- کسانی که میخوان از ADO.Net 2.0 استفاده کنند بدون اینکه با کد نویسی اون بخوان کار کنند و از نقص ویزاردها هم خسته شده اند (که در اینصورت فقط باید با نحوه کار با این کلاس که تو پست های بعدی میگم آشنا بشن)

niloufar
یک شنبه 16 بهمن 1384, 14:22 عصر
چند نکته:
1- این کلاس واسه خودمه و اصلا از قوانین کپی رایت خوشش نمیاد بنابراین راحت باشید
2- این کلاس رو هنوز خودم کامل تست نکردم بنابراین ممکنه یه باگهایی داشته باشه. اگه کسی چیزی به ذهنش رسید بگه
3- اونو خیلی تند تند نوشتم، بنابراین اگه توی توضیحاتی چیزیش غلط نگارشی بود یا کدنویسی خیلی بهینه ای نداشت، به بزرگواری خودتون ببخشید
4- در حال حاضر این کلاس برای MsAccess و MsSqlServer و Oracle کار میکنه ولی برای هر سه تاش از OleDB استفاده کردم (برای راحتی کاربرانی که تازه آشنا شده اند تا تعداد متدها به حداقل برسه) ولی به راحتی خودتون میتونید از کلاسهایی مثل SqlClient استفاده کنید و اونو تغییر بدید

niloufar
یک شنبه 16 بهمن 1384, 14:28 عصر
جهت استفاده کافی است این کلاس رو که در این پست attach شده رو به پروژه تون اضافه کنید

niloufar
یک شنبه 16 بهمن 1384, 14:34 عصر
سپس مانند مثال attach شده در این پست عمل کنید

niloufar
یک شنبه 16 بهمن 1384, 14:36 عصر
اگر هم بعد از مشاهده و استفاده دیدید اصلا هم به درد به خور نبود، به بزرگواری خودتون ببخشید.

با عذر خواهی مجدد
برنامه نویسی کوچک میان برنامه نویسان

بابک زواری
یک شنبه 16 بهمن 1384, 15:53 عصر
ممنون از زحماتتون

بابک زواری
یک شنبه 16 بهمن 1384, 16:09 عصر
اگر هم بعد از مشاهده و استفاده دیدید اصلا هم به درد به خور نبود، به بزرگواری خودتون ببخشید.

نه خیر اینطورها هم نیست ؛ اگر هم مشکلی داشت اونقدر میگیم که درستش کنی و به درد بخور کنی و بدی ما استفاده کنیم :شیطان:
حالا که ما رو معتاد این کلاس کردی نمیتونی بذاری در بری باید کلاس ما رو تامین کنی :تشویق:

Behrouz_Rad
یک شنبه 16 بهمن 1384, 22:31 عصر
خوب نوشته شده...:تشویق:
تبریک میگم.
می تونید بهترش کنید.
بر خلاف تصور! خانم ها رو نباید در برنامه نویسی دست کم گرفت!
موفق باشید.:چشمک:

niloufar
دوشنبه 17 بهمن 1384, 10:23 صبح
نه خیر اینطورها هم نیست ؛ اگر هم مشکلی داشت اونقدر میگیم که درستش کنی و به درد بخور کنی و بدی ما استفاده کنیم :شیطان:
حالا که ما رو معتاد این کلاس کردی نمیتونی بذاری در بری باید کلاس ما رو تامین کنی :تشویق:
سلام
1- از ابراز لطف شما و آقای راد (که هر دوی شما را به عنوان دوتن از برنامه نویسان بزرگ ایران قبول دارم) ممنونم
2- به روی چشم. هر کمکی که از دستم بربیاد انجام میدم.
3- هر یک از دوستان هر نظری برای توسعه یا رفع باگهای احتمالی داره همینجا بیان کنه تا در حد توان، خودم یا دوستان اونو کامل کنیم تا یه کلاس واقعا به درد به خور (و نه صرفا در حد حرف) در بیاد تا همه دوستان (علی الخصوص دوستانی که شاید تجربه کمتری در دیتابیس داشته باشند) ازش استفاده کنند.

مطهر
دوشنبه 17 بهمن 1384, 18:52 عصر
با سپاس
کلاس جالبیه ان شاءالله توسعش می دیم

niloufar
دوشنبه 24 بهمن 1384, 10:58 صبح
ان شاء الله

Ghalandari
دوشنبه 25 اردیبهشت 1385, 05:53 صبح
ساختار جالبی داره دست شما درد نکنه

bahman.net
سه شنبه 26 اردیبهشت 1385, 23:32 عصر
دستتون درد نکنه خیلی خوبه
موفق باشین

oracle_2007
دوشنبه 01 خرداد 1385, 09:17 صبح
دستت در نکنه واقعا خوب بود ...

niloufar
سه شنبه 02 خرداد 1385, 11:10 صبح
سلام
از لطفتون ممنون. بعد از اون هم یه سری تغییر توش دادم ولی چون استقبال نشد، update نکردم.

Bithiah
چهارشنبه 03 خرداد 1385, 08:52 صبح
سلام نیلوفر جان،
چطوریه که می گی استقبال نشد؟! یعنی این همه تشکر رو نادیده گرفتی؟:متفکر:
من یکی منتظر نسخه update شده اش هستم، ما رو بی نصیب نذار دختر خوب.:چشمک:

mahdihg
چهارشنبه 03 خرداد 1385, 09:25 صبح
اولا باید ماهیت آن مشخص شود که در کدام لایه از 5 لایه
1- DataAccess
2- Business Facade
3- Bussiness Rules
4- Commn
5- Application
در ضمن نحوه عملکرد آن پیچیدگی زیادی دارد .... نحوه هک کردن آن هم با Enjection بسیار راحت است ....
دوست عزیز

محمد میرمصطفی
چهارشنبه 03 خرداد 1385, 22:23 عصر
این کلاس در حد اکابر هم نیست!!!!
گر تو بهتر میزنی بستان بزن.

Hamid.Moradian
شنبه 06 خرداد 1385, 17:24 عصر
من زیاد از کلاس سر در نمی آورم ،(همچنین از بفیه چیزها)
فقط داشتم از اینجا رد می شدم
میخواستم بگم که فقط وجود همین چیزهاست که باعث شده تا حالا خودمو نفله نکنم

تو دات نت نویس و در وب انداز
که ایزدو صفا سیتی سرندی پیتی

خراب مهربونیهای بی دلیل

با تشکر
(بشر گراز قرن 21)

niloufar
یک شنبه 07 خرداد 1385, 12:47 عصر
اولا باید ماهیت آن مشخص شود که در کدام لایه از 5 لایه
1- DataAccess
2- Business Facade
3- Bussiness Rules
4- Commn
5- Application
در ضمن نحوه عملکرد آن پیچیدگی زیادی دارد .... نحوه هک کردن آن هم با Enjection بسیار راحت است ....
دوست عزیز
سلام

ما که نفهمیدیم این جمله عارفانه آقای میرمصطفی یعنی چی اما ظاهرا در جواب شما نوشته اند و باز ظاهرا به نفع ماست پس ما هم می نویسیم:
"گر تو بهتر میزنی بستان بزن." تفسیرش با خود ایشان!!

به هر حال جواب خودم:
بنده یه نیمچه برنامه نویسم که خودمم خودم رو قبول ندارم چه رسد به دیگران. این کلاسم نوشتیم "فی لقاء الله" که کسایی که میخوان، ازش استفاده کنن (برای یادگیری و برای استفاده). بعدا هم کاملترش کردم. کسی هم ظاهرا به دردش نخورد و هیچ سوال و جوابی نشد، بنده هم وقتی تغییرش دادم دیگه آپلود نکردم (مسلما نیاز به تشکر ندارم که بگوییم استقبال یعنی تشکر!! وگرنه هیچ تشویقی بهتر از تشویق آقایان راد و زواری نبود که انجام شد ولی استفاده داشتن انگیزه ادامه است نه تشویق)
به هر حال از همه دوستان ممنونم.
از پست آقای مرادیان هم چیزی سر در نیاوردم که بخوام در موردش بنویسم وگرنه حمل بر بی توجهی نشود

parsdarab
چهارشنبه 17 فروردین 1390, 16:17 عصر
منون از این کدتون
اگه وقت شو داری یک کلاس برای کار با نخ ها بنویسید

khosro_68
چهارشنبه 12 تیر 1392, 11:45 صبح
مرسی از زحمتی که کشیدید . من که به شخصه بسیار استفاده کردم ازش.
اگه میشه لطف کنید نسخه آپدیت شدش رو هم بزارید.