2010-11-30 6 views
5

Der Titel ist wahrscheinlich verwirrend, aber im Grunde will ich etwas entlang der Linien von, dies zu tun,C# sql Abfrage if() else() basierend auf Ergebnissen 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 
} 

offensichtlich cmd „nicht null ist“) ist nicht real, aber ich denke, ihr vielleicht den Punkt.

+0

Warum möchten Sie eine Auswahl ausführen, ohne Ergebnismenge zu erwarten? – flq

+2

Nein, ich verstehe den Punkt nicht. – RPM1984

+0

weil, wenn es keine Ergebnismenge gibt, ich einen Wert von einer Textdatei aktualisieren muss, wenn es eine Ergebnismenge gibt, muss ich den vorhandenen Wert + den Wert von der Textdatei –

Antwort

2

Es sieht so aus, als ob Sie var result = cmd.ExecuteScalar(); tun und dann if (result == DBNull.Value) vergleichen möchten.

+0

Die 'ExecuteScalar' Methode gibt die Anzahl der Datensätze zurück, die von der Abfrage betroffen sind. Der Rückgabetyp ist "int", so dass es niemals DBNull sein kann. – Guffa

+0

yeah es tut nicht die Art und Weise, wie es gegeben wurde ... –

0

Try this:

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

Die 'ExecuteNonQuery' Methode gibt die Anzahl der betroffenen Datensätze zurück, und das wäre immer eins mit dieser Abfrage. (Nicht mein Downvote BTW.) – Guffa

+0

Hoppla, soll 'ExecuteScalar' verwenden. Aktualisiert. – cdhowie

+0

Objekt kann nicht von DBNull in andere Typen umgewandelt werden. –

3

Wenn Sie überprüfen wollen, ob es passende Datensätze gibt, können Sie sie zählen:

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

Um das Ergebnis zu erhalten, verwenden Sie die ExecuteScalar Methode:

+0

Objekt kann nicht von DBNull in andere Typen umgewandelt werden. –

+0

@Mike: Das Ergebnis des Zählens der Datensätze ist nie null, es ist immer eine Zahl. – Guffa

+0

Ich verstehe, ich gebe Ihnen nur die Erwartung, die es wirft –

1

ExecuteNonQuery gibt die Anzahl der betroffenen Zeilen zurück (wenn bestimmte Optionen nicht ausgewählt sind) als a n Ganzzahl So können Sie entweder überprüfen, ob die Anzahl gleich oder größer als eine Erfolgsbedingung ist, oder einen Skalar ausführen und einen Wert aus Ihrer Abfrage zurückgeben, um den Erfolg anzuzeigen.

7

Ich verstehe nicht, warum jeder versucht, ExecuteNonQuery oder ExecuteScalar zu verwenden, wenn die Abfrage in der Frage eine SELECT-Anweisung ist. Wenn es sich um einen Aufruf einer gespeicherten Prozedur handelte, der die Logik von INSERT versus UPDATE basierend auf dem Vorhandensein eines Werts berücksichtigte, würde das ExecuteScalar sinnvoll sein, da Sie den gewünschten einzelnen Wert aus einer gespeicherten Prozedur zurückgeben können.

Allerdings, angesichts der Struktur der Frage, lehne ich als Antwort darauf hin.

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

können Sie die Abfrage ändern WHERE EXISTS zu verwenden, wenn Sie wollen volle Matches nicht streamen zurück, sondern von den Klängen der es, würden Sie nur sowieso höchstens 1 Ursache haben.

+0

hängt von den Daten ab, ich gebe es morgens, aber ich mag den Leser.Hasrows Option. Danke, klingt logisch, ich werde es morgen wissen lassen. –

+0

HasRows gibt immer noch den Wert true zurück, auch wenn die Spalte null ist –

+0

Also ändern Sie Ihre Abfrage so: SELECT Datensatz1 FROM dbo.ste WHERE Projekt = 'was auch immer' UND Datum = '2010-11-30' UND Datensatz1 IST NICHT NULL – bitxwise