2010-11-24 14 views
6

SELECT sql कथन के लिए ExecuteNonQuery के बाद लौटाई गई कोई पंक्तियों की जांच कैसे करें कोई पंक्ति नहीं देता है ??SELECT sql कथन के लिए ExecuteNonQuery कोई पंक्तियां वापस नहीं

+2

क्या आप कुछ संदर्भ प्रदान कर सकते हैं? बेहतर अभी तक, कोड? क्या आपके 'कमांड' में पैरामीटर हैं? –

उत्तर

25

ExecuteNonQuery MethodINSERT, UPDATE या DELETE से प्रभावित पंक्तियों की संख्या देता है। इस विधि का उपयोग पहले बताए गए डीएमएल (डेटा मैनिपुलेशन भाषा) कथन करने के लिए किया जाना है।

ExecuteReader MethodSELECT के परिणाम सेट को वापस कर देगा। इस विधि का उपयोग तब किया जाना चाहिए जब आप परिणामों के समूह के लिए पूछताछ कर रहे हों, जैसे तालिका से पंक्तियां, देखें, जो कुछ भी हो।

ExecuteScalar Method पहली पंक्ति में एक एकल मान लौटाएगा, SELECT कथन से पहला कॉलम। इस विधि का उपयोग तब किया जाना चाहिए जब आप क्वेरी से केवल एक मान वापस लौटाएंगे।

संक्षेप में, यह सामान्य है कि कथन से ExecuteNonQuery विधि का उपयोग करते समय आपके पास कोई परिणाम नहीं है। इसके बजाय ExecuteReader का उपयोग करें। ExecuteReader विधि का उपयोग करके, यह पता चल जाएगा कि SqlDataReader ऑब्जेक्ट लौटाए गए उदाहरण के माध्यम से कितनी पंक्तियां लौटा दी गईं।

int rows = 0; 

if (reader.HasRows) 
    while (reader.Read()) 
     rows++; 

return rows; // Returns the number of rows read from the reader. 
6

मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है। select count(*) where के साथ ExecuteScalar का उपयोग करें ... अपनी मूल चयन क्वेरी के मानदंडों से मेल खाने वाली पंक्तियों की गणना करने के लिए। उदाहरण नीचे, here से दूसरे शब्दों में बयान:

using (SqlCommand thisCommand = 
    new SqlCommand("SELECT COUNT(*) FROM Employee", thisConnection)) 
{ 
    Console.WriteLine("Number of Employees is: {0}", 
     thisCommand.ExecuteScalar()); 
} 

आप के रूप में अच्छी पंक्तियों की जरूरत है, आप पहले से ही ExecuteReader का उपयोग कर हो सकता है, मुझे लगता है।

+0

मैं एसक्यूएल क्वेरी को इसकी गतिशील रूप से निर्मित – Lyle

3

इसके बजाय ExecuteReader विधि का उपयोग करें। यह SqlDataReader देता है, जिसमें HasRows संपत्ति है।

ExecuteNonQuerySELECT कथन के लिए उपयोग नहीं किया जाना चाहिए।

1

यह देर हो चुकी है, लेकिन मैंने हाल ही में इस समस्या में भाग लिया और सोचा कि यह बाद में आने वाले अन्य लोगों के लिए उपयोगी होगा (जैसे मेरे) एक ही समस्या के साथ मदद चाहते हैं। वैसे भी, मेरा मानना ​​है कि आप वास्तव में ExecuteNonQuery का उपयोग कर सकते हैं जिस तरह से आप कोशिश कर रहे हैं। लेकिन ... आपको अपनी अंतर्निहित चयन क्वेरी को संग्रहीत प्रक्रिया में समायोजित करना होगा जिसके बजाय चयन क्वेरी और आउटपुट पैरामीटर है जो पंक्ति गणना के बराबर सेट है।

के रूप में MSDN दस्तावेज में कहा गया है:

हालांकि ExecuteNonQuery कोई भी पंक्ति, किसी भी उत्पादन मानकों रिटर्न या वापसी मानकों को मैप किया मूल्यों डेटा के साथ भर जाते हैं।

यह देखते हुए, मैंने यह कैसे किया है। वैसे, अगर इसमें कोई दोष है तो मुझे विशेषज्ञों से फीडबैक पसंद आएगा, लेकिन ऐसा लगता है कि यह मेरे लिए काम करता है।

पहले, अपने संग्रहीत प्रक्रिया दो SELECT स्टेटमेंट्स होना चाहिए: आपके डेटासेट वापस जाने के लिए और दूसरा एक आउटपुट पैरामीटर से बंधा रिकॉर्ड गिनती वापस जाने के लिए:

CREATE PROCEDURE spMyStoredProcedure 
(
    @TotalRows int output 
) 
AS 
BEGIN 
    SELECT * FROM MyTable; //see extra note about this line below. 
    SELECT @TotalRows COUNT(*) FROM MyTable; 
END 

दूसरा, इस कोड (जोड़ने vb में।नेट, एसक्यूएल कॉमांड आदि का उपयोग ..)।

Dim cn As SqlConnection, cm As SqlCommand, dr As SqlDataReader 
Dim myCount As Int32 

cn = New SqlConnection("MyConnectionString") 
cn.Open() //I open my connection beforehand, but a lot of people open it right before executing the queries. Not sure if it matters. 

cm = New SqlCommand("spMyStoredProcedure", cn) 
cm.CommandType = CommandType.StoredProcedure 
cm.Parameters.Add("@TotalRows", SqlDbType.Int).Direction = ParameterDirection.Output 
cm.ExecuteNonQuery() 

myCount = CType(cm.Parameters("@TotalRows").Value, Integer) 
If myCount > 0 Then 
    //Do something. 
End If 

dr = cm.ExecuteReader() 
If dr.HasRows Then 
    //Return the actual query results using the stored procedure's 1st SELECT statement 
End If 
dr.Close() 
cn.Close() 
dr = Nothing 
cm = Nothing 
cn = Nothing 

यही है।

अतिरिक्त नोट। मुझे लगता है कि आप "MyCount" राशि को यह निर्धारित करने के अलावा कुछ और करने के लिए चाहते हैं कि आप लौट रहे हैं या नहीं। इसका कारण यह है कि इस विधि के साथ, आपको वास्तव में ऐसा करने की ज़रूरत नहीं है। चूंकि मैं गिनती प्राप्त करने के बाद "ExecuteReader" विधि का उपयोग कर रहा हूं, इसलिए मैं निर्धारित कर सकता हूं कि डेटा रीडर की "हैसरो" संपत्ति का उपयोग करके इच्छित डेटा सेट को वापस रखना जारी रखना है या नहीं। डेटा सेट को वापस करने के लिए, आपको एक SELECT स्टेटमेंट चाहिए जो डेटा सेट देता है, इसलिए मेरी संग्रहीत प्रक्रिया में मेरे पहले चयन कथन का कारण।

वैसे, "ExecuteNonQuery" पद्धति का उपयोग करके की इस पद्धति के बारे में अच्छी बात यह है कि आप DataReader, बंद करने से पहले इसका इस्तेमाल कुल पंक्ति से पहले गिनती DataReader बंद करने पाने के लिए कर सकते हैं (आप उत्पादन मानकों नहीं पढ़ सकते है जो यही वह है जो मैं करने की कोशिश कर रहा था, यह विधि उस के आसपास हो जाती है)। मुझे यकीन नहीं है कि इस मुद्दे को पाने के लिए ऐसा करने में प्रदर्शन प्रदर्शन या कोई दोष है, लेकिन जैसा कि मैंने कहा ... यह मेरे लिए काम करता है। = डी

+0

हां नहीं बदल सकता हां, एसक्यूएल कॉमांड में एसक्यूएल को दो बार निष्पादित करने के कारण प्रदर्शन प्रदर्शन हुआ है। और यदि डीएमएल कथन हैं, तो वे दो बार निष्पादित होंगे। साथ ही, SqlCommand निष्पादित करने से पहले कनेक्शन खोलने का कोई कारण नहीं है; इसका मतलब है कि आप कनेक्शन को लंबे समय तक खोल रहे हैं। आप पैरामीटर घोषणा के बाद इसे स्थानांतरित कर सकते हैं। और अंतिम "एंड अगर" के माध्यम से कनेक्शन। ओपन() एक कोशिश/पकड़ में होना चाहिए ताकि एक अपवाद होने पर रीडर और कनेक्शन को अंत में ब्लॉक में ठीक से बंद किया जा सके। –

+0

कनेक्शन कहां रखना है, इस पर इनपुट के लिए धन्यवाद। ओपन। समझ में आता है। प्रदर्शन के हिट के लिए, मैं समझता हूं कि SqlCommand 2x चलाने के लिए कुछ हद तक "हिट" होगा। हालांकि, पहले निष्पादन न्यूनतम नहीं होगा क्योंकि ExecuteNonQuery पंक्तियों को वापस नहीं करता है? मैंने माना कि पहला तेज होगा क्योंकि यह पूरे डेटा सेट को नहीं खींच रहा है। इसलिए, पहली एसक्लोकॉमैंड्स के लिए प्रदर्शन हिट न्यूनतम है (भले ही वहां 1 एम अंतर्निहित रिकॉर्ड हों)। अगर मैं गलत हूं तो कृपया मेरी समझ को सही करें। परीक्षण नहीं किया है - बस माना जाता है कि यह परिभाषाओं के अनुसार कैसे काम करता है। – ptownbro

+0

परिणामों को वापस खींचने का मतलब यह नहीं है कि SQL सर्वर को उन्हें ढूंढने की आवश्यकता नहीं है। यदि आप कोई क्वेरी सबमिट करते हैं, तो SQL सर्वर को 1) इसे पार्स करना है, 2) निष्पादन योजना संकलित करें, 3) इसे निष्पादित करें, और वैकल्पिक रूप से 4) परिणाम लौटाएं। पहले 3 चरण तब भी होते हैं जब आप परिणाम सेट पर पॉइंटर को त्याग देते हैं। हां, आप डेटा को स्थानांतरित करने के लिए कितना समय लेते हैं, जो कुछ है, लेकिन ज्यादा नहीं। निष्पादन योजनाओं और डेटा पृष्ठों पर किए गए कैशिंग को देखते हुए, पहला रन आम तौर पर लंबा होता है। सरल प्रश्न (कोई सॉर्टिंग/ग्रुपिंग) ठीक नहीं हो सकता है, लेकिन अधिकांश भाग के लिए, यह एक महंगा दृष्टिकोण है। –

संबंधित मुद्दे