2010-11-30 32 views
5

başlık muhtemelen kafa karıştırıcı, ama temelde ben bu çizgisinde bir şey yapmak istiyorum,C# sql sorguları null() else() sonuçlarına göre null?

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 
} 

besbelli cmd) "boş değil" gerçek değil, ama siz gelin almak düşünüyorum. Eğer var result = cmd.ExecuteScalar(); yapmak ve daha sonra if (result == DBNull.Value) karşılaştırmak istediğiniz gibi

+0

Neden bir sonuç beklemeden bir seçim yürütmek istiyorsunuz? – flq

+2

Hayır, anlamıyorum. – RPM1984

+0

i mevcut değeri + Bu durumda metin dosyası –

cevap

2

görünüyor.

+0

yap "ExecuteScalar" yöntemi, sorgu tarafından etkilenen kayıtların sayısını döndürür. Dönüş türü "int", bu yüzden hiçbir zaman DBNull olamaz. – Guffa

+0

Evet, bu şekilde verildiği şekilde yok ... –

0

bu deneyin:

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' yöntemi, etkilenen kayıtların sayısını döndürür ve bu her zaman bu sorgu ile bir olur. (Benim downvote BTW değil.) – Guffa

+0

Oops, 'ExecuteScalar' kullanmak niyetinde. Güncellenmiş. – cdhowie

+0

Nesne DBNull'dan başka türlere dönüştürülemiyor. –

3

Herhangi bir eşleşen kayıtları olup olmadığını kontrol etmek istiyorsanız, bunları sayabilirsiniz:

:

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

Eğer ExecuteScalar yöntemi kullanmak sonuç almak için

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

Nesne DBNull'dan başka türlere dönüştürülemiyor. –

+0

@Mike: Kayıtları saymanın sonucu asla boş değil, her zaman bir sayıdır. – Guffa

+0

Anladığım kadarıyla size sadece –

1

ExecuteNonQuery bir şekilde (belli seçenekler seçilir değilse) etkilenen satır sayısını verir n tamsayı. Bu nedenle, sayımın bazı başarı koşullarına eşit veya daha büyük olduğunu doğrulayabilir veya skaler uygulayabilir ve başarınızı göstermek için sorgunuzdan bir değer döndürürsünüz.

7

herkes söz konusu sorgu bir SELECT ifadesi olduğunda ExecuteNonQuery veya ExecuteScalar kullanmaya çalışıyor neden anlamıyorum. Bir değerin varlığına dayalı olarak INSERT ve UPDATE mantığını dikkate alan saklı yordam çağrısı olsaydı, saklı bir yordamdan istediğiniz herhangi bir değeri döndürmek için ExecuteScalar mantıklı olur.

Ancak, söz konusu yapıya verilen Ben cevap olarak bu doğru eğilim.

// 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(); 
     } 
    } 
} 

Sen tam eşleşmeleri geri akışı için istemiyorsanız sorgu WHERE EXISTS kullanmayı değiştirebilirsiniz, ancak bunun seslerden, yalnızca zaten en fazla 1 maç olurdu.

+0

, mevcut verilere göre değişiklik gösterir, bunu sabah saatlerinde vereceğim ancak reader.hasrows seçeneğini beğeniyorum. Teşekkürler, yarın bilmene izin vereceğim mantıklı geliyor. –

+0

HasRows sütunu –

+0

null değerinde olsa bile yine de true değerini döndürür. Ardından sorgunuzu şu şekilde değiştirin: SELECT dataset1 FROM dbo.ste WHERE project = 'her ne ise AND date =' 2010-11-30 'AND dataset1 NOT NULL – bitxwise