VBA
ADO के साथ काम करना
खोज…
टिप्पणियों
इस विषय में दिखाए गए उदाहरण स्पष्टता के लिए शुरुआती बाइंडिंग का उपयोग करते हैं, और इसके लिए Microsoft ActiveX डेटा ऑब्जेक्ट xx लाइब्रेरी के संदर्भ की आवश्यकता होती है। उन्हें Object
साथ दृढ़ता से टाइप किए गए संदर्भों को बदलकर और उचित के साथ CreateObject
साथ New
का उपयोग करके ऑब्जेक्ट निर्माण को बदलने के द्वारा देर से बाध्यकारी में परिवर्तित किया जा सकता है।
डेटा स्रोत से संबंध बनाना
ADO के माध्यम से डेटा स्रोत तक पहुँचने का पहला चरण ADO Connection
ऑब्जेक्ट बना रहा है। यह आमतौर पर डेटा स्रोत मापदंडों को निर्दिष्ट करने के लिए एक कनेक्शन स्ट्रिंग का उपयोग करके किया जाता है, हालांकि डीएसएन, उपयोगकर्ता आईडी और पासवर्ड को .Open
विधि से पारित करके DSN कनेक्शन खोलना भी संभव है।
ध्यान दें कि ADO के माध्यम से एक डेटा स्रोत से कनेक्ट करने के लिए एक DSN की आवश्यकता नहीं है - किसी भी डेटा स्रोत जिसमें ODBC प्रदाता है, को उचित कनेक्शन स्ट्रिंग के साथ जोड़ा जा सकता है। जबकि अलग-अलग प्रदाताओं के लिए विशिष्ट कनेक्शन स्ट्रिंग इस विषय के दायरे से बाहर हैं, आपके प्रदाता के लिए उपयुक्त स्ट्रिंग खोजने के लिए ConnectionStrings.com एक उत्कृष्ट संदर्भ है।
Const SomeDSN As String = "DSN=SomeDSN;Uid=UserName;Pwd=MyPassword;"
Public Sub Example()
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
'... Do work.
database.Close 'Make sure to close all database connections.
End If
End Sub
Public Function OpenDatabaseConnection(ConnString As String) As ADODB.Connection
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = New ADODB.Connection
With database
.ConnectionString = ConnString
.ConnectionTimeout = 10 'Value is given in seconds.
.Open
End With
OpenDatabaseConnection = database
Exit Function
Handler:
Debug.Print "Database connection failed. Check your connection string."
End Function
ध्यान दें कि डेटाबेस पासवर्ड केवल स्पष्टता के लिए ऊपर दिए गए उदाहरण में कनेक्शन स्ट्रिंग में शामिल है। सर्वोत्तम प्रथाएँ कोड में डेटाबेस के पासवर्ड को संग्रहीत नहीं करने का निर्देश देगी। यह उपयोगकर्ता इनपुट के माध्यम से पासवर्ड लेने या विंडोज प्रमाणीकरण का उपयोग करके पूरा किया जा सकता है।
किसी क्वेरी के साथ रिकॉर्ड पुनर्प्राप्त करना
क्वेरी को दो तरीकों से किया जा सकता है, दोनों एक ADO Recordset
ऑब्जेक्ट लौटाते हैं जो लौटे पंक्तियों का एक संग्रह है। ध्यान दें कि दोनों उदाहरण नीचे दिए गए OpenDatabaseConnection
फ़ंक्शन को डेटा स्रोत उदाहरण से संबंध बनाने के लिए संक्षिप्तता के उद्देश्य से उपयोग करते हैं। याद रखें कि डेटा स्रोत को दिए गए SQL का सिंटैक्स प्रदाता विशिष्ट है।
पहला तरीका SQL स्टेटमेंट को सीधे कनेक्शन ऑब्जेक्ट पर पास करना है, और सरल क्वेरी को निष्पादित करने के लिए सबसे आसान तरीका है:
Public Sub DisplayDistinctItems()
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
Dim records As ADODB.Recordset
Set records = database.Execute("SELECT DISTINCT Item FROM Table")
'Loop through the returned Recordset.
Do While Not records.EOF 'EOF is false when there are more records.
'Individual fields are indexed either by name or 0 based ordinal.
'Note that this is using the default .Fields member of the Recordset.
Debug.Print records("Item")
'Move to the next record.
records.MoveNext
Loop
End If
CleanExit:
If Not records Is Nothing Then records.Close
If Not database Is Nothing And database.State = adStateOpen Then
database.Close
End If
Exit Sub
Handler:
Debug.Print "Error " & Err.Number & ": " & Err.Description
Resume CleanExit
End Sub
दूसरी विधि उस क्वेरी के लिए ADO Command
ऑब्जेक्ट बनाना है जिसे आप निष्पादित करना चाहते हैं। इसके लिए थोड़े अधिक कोड की आवश्यकता होती है, लेकिन पैराड्राइज्ड प्रश्नों का उपयोग करने के लिए यह आवश्यक है:
Public Sub DisplayDistinctItems()
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
Dim query As ADODB.Command
Set query = New ADODB.Command
'Build the command to pass to the data source.
With query
.ActiveConnection = database
.CommandText = "SELECT DISTINCT Item FROM Table"
.CommandType = adCmdText
End With
Dim records As ADODB.Recordset
'Execute the command to retrieve the recordset.
Set records = query.Execute()
Do While Not records.EOF
Debug.Print records("Item")
records.MoveNext
Loop
End If
CleanExit:
If Not records Is Nothing Then records.Close
If Not database Is Nothing And database.State = adStateOpen Then
database.Close
End If
Exit Sub
Handler:
Debug.Print "Error " & Err.Number & ": " & Err.Description
Resume CleanExit
End Sub
ध्यान दें कि डेटा स्रोत पर भेजी गई कमांड्स SQL इंजेक्शन के लिए असुरक्षित हैं, या तो जानबूझकर या अनजाने में। सामान्य तौर पर, किसी भी प्रकार के उपयोगकर्ता इनपुट को संक्षिप्त करके क्वेरी नहीं बनाई जानी चाहिए। इसके बजाय, उन्हें परिमाणित किया जाना चाहिए (देखें मानकीकृत कमांड बनाना )।
गैर-स्केलर कार्यों को निष्पादित करना
ADO कनेक्शन का उपयोग किसी भी डेटाबेस फ़ंक्शन के लिए किया जा सकता है जो प्रदाता SQL के माध्यम से समर्थन करता है। इस मामले में हमेशा Execute
फ़ंक्शन द्वारा दिए गए Recordset
का उपयोग करना आवश्यक नहीं होता है, हालांकि यह @@ पहचान या इसी तरह के SQL कमांड के साथ INSERT के बयानों के बाद महत्वपूर्ण असाइनमेंट प्राप्त करने के लिए उपयोगी हो सकता है। ध्यान दें कि नीचे दिया गया उदाहरण OpenDatabaseConnection
फ़ंक्शन को डेटा स्रोत उदाहरण से संबंध बनाने के लिए संक्षिप्तता के उद्देश्य से उपयोग करता है।
Public Sub UpdateTheFoos()
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
Dim update As ADODB.Command
Set update = New ADODB.Command
'Build the command to pass to the data source.
With update
.ActiveConnection = database
.CommandText = "UPDATE Table SET Foo = 42 WHERE Bar IS NULL"
.CommandType = adCmdText
.Execute 'We don't need the return from the DB, so ignore it.
End With
End If
CleanExit:
If Not database Is Nothing And database.State = adStateOpen Then
database.Close
End If
Exit Sub
Handler:
Debug.Print "Error " & Err.Number & ": " & Err.Description
Resume CleanExit
End Sub
ध्यान दें कि डेटा स्रोत पर भेजी गई कमांड्स SQL इंजेक्शन के लिए असुरक्षित हैं, या तो जानबूझकर या अनजाने में। सामान्य तौर पर, एसक्यूएल बयान किसी भी तरह के उपयोगकर्ता इनपुट को बदलते हुए नहीं बनाया जाना चाहिए। इसके बजाय, उन्हें परिमाणित किया जाना चाहिए (देखें मानकीकृत कमांड बनाना )।
पैरामीटरयुक्त कमांड बनाना
किसी भी समय SQL को ADO कनेक्शन के माध्यम से निष्पादित करने के लिए उपयोगकर्ता इनपुट शामिल करने की आवश्यकता होती है, SQL इंजेक्शन की संभावना को कम करने के लिए इसे पैरामीटर करने के लिए सबसे अच्छा अभ्यास माना जाता है। यह विधि लंबी सहमति से भी अधिक पठनीय है और अधिक मजबूत और बनाए रखने योग्य कोड की सुविधा प्रदान करती है (यानी एक फ़ंक्शन का उपयोग करके जो Parameter
की एक सरणी लौटाती है)।
मानक ODBC सिंटैक्स में, पैरामीटर दिए गए हैं ?
क्वेरी पाठ में "प्लेसहोल्डर", और फिर Command
को उसी क्रम में जोड़ा जाता है, जिस क्रम में वे क्वेरी में दिखाई देते हैं।
ध्यान दें कि नीचे दिए गए उदाहरण में OpenDatabaseConnection
फ़ंक्शन का उपयोग संक्षिप्तता के लिए डेटा स्रोत से कनेक्शन बनाने से किया गया है।
Public Sub UpdateTheFoos()
On Error GoTo Handler
Dim database As ADODB.Connection
Set database = OpenDatabaseConnection(SomeDSN)
If Not database Is Nothing Then
Dim update As ADODB.Command
Set update = New ADODB.Command
'Build the command to pass to the data source.
With update
.ActiveConnection = database
.CommandText = "UPDATE Table SET Foo = ? WHERE Bar = ?"
.CommandType = adCmdText
'Create the parameters.
Dim fooValue As ADODB.Parameter
Set fooValue = .CreateParameter("FooValue", adNumeric, adParamInput)
fooValue.Value = 42
Dim condition As ADODB.Parameter
Set condition = .CreateParameter("Condition", adBSTR, adParamInput)
condition.Value = "Bar"
'Add the parameters to the Command
.Parameters.Append fooValue
.Parameters.Append condition
.Execute
End With
End If
CleanExit:
If Not database Is Nothing And database.State = adStateOpen Then
database.Close
End If
Exit Sub
Handler:
Debug.Print "Error " & Err.Number & ": " & Err.Description
Resume CleanExit
End Sub
नोट: ऊपर दिया गया उदाहरण एक पैरामीटर अद्यतन विवरण प्रदर्शित करता है, लेकिन किसी भी SQL कथन को पैरामीटर दिया जा सकता है।