2009-07-29 10 views
6

में "SELECT SCOPE_IDENTITY()" का उपयोग Excel में एक VBA स्क्रिप्ट का उपयोग करके, मैं एक तालिका में एक नई पंक्ति डालने की कोशिश कर रहा हूं और फिर उस पंक्ति का पहचान मान वापस प्राप्त कर रहा हूं। यदि मैं चलाता हूं:एडीओडीबी रिकॉर्ड्स

INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); 
SELECT SCOPE_IDENTITY() 

प्रबंधन स्टूडियो में, पंक्ति डाली गई है और यह मुझे अपेक्षित रूप से वापस लौटा पहचान मूल्य देता है। हालांकि, जब मैं वीबीए में एडीओडीबी रिकॉर्डसेट के माध्यम से सटीक वही क्वेरी चलाता हूं, तो मुझे परेशानी हो रही है। पंक्ति वास्तव में डाली गई है, लेकिन मैं पहचान मान तक नहीं पहुंच सकता। रिकॉर्डसेट 0 फ़ील्ड सूचीबद्ध करता है और वास्तव में भी बंद कर दिया गया है। मैंने अर्धविराम के साथ और उसके बिना प्रयास किया है, और मैंने क्वेरी को एक ही लेनदेन के रूप में चलाने की भी कोशिश की। वही सौदा, कोई पासा नहीं। कोई अंदाज़ा है कि क्या चल रहा है?

यहाँ मेरी VBA है:

Dim rs As ADODB.Recordset 
Dim cn As Connection 
Dim SQLStr As String 
Dim serverName As String 
Dim databaseName As String 

serverName = "MSSQLServer" 
databaseName = "QA" 
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";" 

SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()" 
Set cn = New ADODB.Connection 
cn.Open cxnStr 
Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
MsgBox (rs.Fields(0).Value) 

और संदेश बॉक्स प्रदर्शित करने के लिए क्योंकि rs.Fields(0).Value रिटर्न नल विफल रहता है। मैंने आरएस के लिए एक घड़ी जोड़ा, और, जैसे मैंने कहा, क्वेरी के बाद 0 फ़ील्ड दिखाता है और यह भी बंद होता है (राज्य = 0)।

उत्तर

8

जब आप ADODB का उपयोग कर आदेशों का एक बैच चलाने की कोशिश करें, मेरा मानना ​​है कि यह हर एक को अलग से चलाता है।

Set rs = rs.NextRecordset() 

निम्नलिखित को अपनी दिनचर्या के अंत बदलने चाल करना चाहिए::

Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
Set rs = rs.NextRecordset 
MsgBox (rs.Fields(0).Value) 
+0

सुंदर! पूरी तरह से काम करता है, धन्यवाद! – JoeCool

0

देखें कि जब आप adOpenKeySet को हटाते हैं तो क्या होता है और adLockOptimistic मान उन्हें अपने डिफ़ॉल्ट पर छोड़ देते हैं।

1

अपने rs.Open में इस

rs.Open SQLStr, cn, adCmdText

3

तुम इतनी यदि आप दो कथन को क्रियान्वित कर रहे हैं चलाने के लिए अगले आदेश के लिए मजबूर करने के लिए, आप निम्नलिखित का उपयोग करने के लिए है दो परिणाम वापस मिलेगा। रिकॉर्डसेट ऑब्जेक्ट केवल एक परिणाम को एक समय में पकड़ सकता है - अन्य परिणाम प्राप्त करने के लिए आपको NextRecordset विधि का उपयोग करने की आवश्यकता है।

Set rs = rs.NextRecordset 
संबंधित मुद्दे