2010-11-30 17 views
5

शीर्षक शायद भ्रामक है, लेकिन मूल रूप से मैं इस की तर्ज पर कुछ करना चाहता हूँ,सी # एसक्यूएल क्वेरी अगर() और() परिणाम नल के आधार पर?

string sql = "select dataset1 from dbo.ste where project = 'whatever' and date = '11/30/10'"; 
     SqlConnection con = new SqlConnection("Data Source= Watchmen ;Initial Catalog= doeLegalTrending;Integrated Security= SSPI"); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand(sql, con); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 

if(cmd "is not null") 
{ 
//do this string 
} 
else 
{ 

//do this one 
} 

जाहिर cmd "रिक्त नहीं है") असली नहीं है, लेकिन मुझे लगता है कि तुम लोग बिंदु मिल सकता है।

+0

आप किसी भी परिणाम की अपेक्षा किए बिना चयन निष्पादित क्यों करना चाहते हैं? – flq

+2

नहीं, मुझे बिंदु नहीं मिलता है। – RPM1984

+0

क्योंकि यदि कोई परिणाम सेट नहीं है, तो मुझे एक टेक्स्ट फ़ाइल से एक मान अपडेट करना होगा, यदि कोई परिणाम सेट है तो मुझे मौजूदा मान को अपडेट करना होगा + टेक्स्ट फ़ाइल –

उत्तर

2

ऐसा लगता है कि आप var result = cmd.ExecuteScalar(); करना चाहते हैं और फिर if (result == DBNull.Value) की तुलना करें।

+0

करें 'ExecuteScalar' विधि क्वेरी द्वारा प्रभावित रिकॉर्ड्स की संख्या देता है। वापसी का प्रकार 'int' है, ताकि कभी डीबीएनयूएल न हो। – Guffa

+0

हाँ यह जिस तरह से दिया गया था उसे पैन नहीं करता है ... –

0

इस प्रयास करें:

string sql = "select COUNT(dataset1) from dbo.ste where project = 'whatever' and date = '11/30/10'"; 
SqlConnection con = new SqlConnection("Data Source= Watchmen ;Initial Catalog= doeLegalTrending;Integrated Security= SSPI"); 
con.Open(); 
SqlCommand cmd = new SqlCommand(sql, con); 
int count = Convert.ToInt32(cmd.ExecuteScalar()); 
con.Close(); 

if(count != 0) 
{ 
//do this string 
} 
else 
{ 

//do this one 
} 
+0

'ExecuteNonQuery' विधि प्रभावित रिकॉर्ड्स की संख्या देता है, और वह हमेशा उस क्वेरी के साथ होगा। (मेरा डाउनवोट बीटीडब्लू नहीं।) – Guffa

+0

ओह, 'एक्जिक्यूटस्कर' का उपयोग करने के लिए। अपडेट किया गया। – cdhowie

+0

ऑब्जेक्ट को डीबीएनयूएल से अन्य प्रकारों में नहीं डाला जा सकता है। –

3

आप यदि कोई मिलान रिकॉर्ड है वहाँ जाँच करना चाहते हैं, तो आप उन्हें भरोसा कर सकते हैं:

string sql = "select count(*) from dbo.ste where project = 'whatever' and date = '11/30/10'"; 

परिणाम प्राप्त करने के लिए आप ExecuteScalar विधि का उपयोग करें:

int cnt = Convert.ToInt32(cmd.ExecuteScalar()); 
+0

ऑब्जेक्ट को डीबीएनयूएल से अन्य प्रकारों में नहीं डाला जा सकता है। –

+0

@ माइक: रिकॉर्ड गिनने का परिणाम कभी शून्य नहीं होता है, यह हमेशा एक संख्या है। – Guffa

+0

मैं समझता हूं कि मैं सिर्फ आपको एक्सपेक्शन देता हूं जो इसे –

1

ExecuteNonQuery प्रभावित पंक्तियों की संख्या लौटाता है (यदि कुछ विकल्प नहीं चुने गए हैं) एन पूर्णांक इसलिए, आप या तो गिनती को सत्यापित कर सकते हैं कि कुछ सफलता की स्थिति (या उससे अधिक) कुछ सफलता की स्थिति के बराबर है या स्केलर निष्पादित करें और सफलता को इंगित करने के लिए अपनी क्वेरी से एक मूल्य वापस कर दें।

7

मुझे समझ में नहीं आ रहा है कि क्यों हर कोई ExecuteNonQuery या ExecuteScalar का उपयोग करने का प्रयास कर रहा है जब प्रश्न में क्वेरी एक चयन कथन है। यदि यह एक संग्रहीत प्रक्रिया कॉल था जिसने मूल्य के अस्तित्व के आधार पर अद्यतन के विरुद्ध INSERT बनाम तर्क का ख्याल रखा, तो ExecuteScalar समझ में आएगा क्योंकि आप संग्रहीत प्रक्रिया से जो भी वैल्यू चाहते हैं उसे वापस कर सकते हैं।

हालांकि, प्रश्न की संरचना को देखते हुए, मैं इसके जवाब के रूप में झुका रहा हूं।

// Automatically dispose the connection when done 
using(SqlConnection connection = new SqlConnection(sqlConnection.ConnectionString)) { 
    try { 
     connection.Open(); 

     // query to check whether value exists 
     string sql = @"SELECT dataset1 
         FROM dbo.ste 
         WHERE project = 'whatever' 
           AND date = '2010-11-30'"; 

     // create the command object 
     using(SqlCommand command = new SqlCommand(sql, connection)) { 
      using(SqlDataReader reader = command.ExecuteReader()) { 
       // if the result set is not NULL 
       if(reader.HasRows) { 
        // update the existing value + the value from the text file 
       } 
       else { 
        // insert a value from a text file 
       } 
      } 
     } 
    } 
    finally { 
     // always close connection when done 
     if(connection.State != ConnectionState.Closed) { 
      connection.Close(); 
     } 
    } 
} 

आप क्वेरी WHERE EXISTS उपयोग करने के लिए यदि आप पूर्ण मैचों वापस स्ट्रीम करने के लिए नहीं करना चाहते हैं बदल सकते हैं, लेकिन यह की आवाज़ से, आप केवल वैसे भी ज्यादा से ज्यादा 1 मैच होगा।

+0

मौजूद डेटा पर निर्भर करता है, मैं इसे सुबह में जाने दूंगा लेकिन मुझे reader.hasrows विकल्प पसंद है। धन्यवाद, तार्किक लगता है मैं कल आपको बता दूंगा। –

+0

कॉलम शून्य है –

+0

तो हैशर अभी भी सत्य का मान देता है, फिर अपनी क्वेरी को बदलने के लिए: dडेट.ste से चुनें डेटासेट 1 जहां परियोजना = 'जो भी' और दिनांक = '2010-11-30' और डेटासेट 1 न्यूल नहीं है – bitxwise

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