2010-11-30 13 views
5

El título es probablemente confuso, pero básicamente lo que quiero hacer algo en la línea de este,consulta C# sql if() else() en función de resultados nulo?

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 
} 

obviamente cmd "no es nulo") no es real, pero creo que ustedes podrían conseguir el punto.

+0

¿Por qué desea ejecutar una selección sin esperar ningún resultado? – flq

+2

no, no entiendo el punto. – RPM1984

+0

porque si no hay un conjunto de resultados tengo que actualizar un valor de un archivo de texto, si hay un conjunto de resultados tengo que actualizar el valor existente + el valor del archivo de texto –

Respuesta

2

Parece que usted quiere hacer var result = cmd.ExecuteScalar(); y luego compare if (result == DBNull.Value).

+0

El método 'ExecuteScalar' devuelve el número de registros afectados por la consulta. El tipo de devolución es 'int', por lo que nunca puede ser DBNull. – Guffa

+0

Sí, no funciona de la forma en que se dio ... –

0

Prueba esto:

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

El método 'ExecuteNonQuery' devuelve el número de registros afectados, y que siempre sería uno con esa consulta. (No es mi voto negativo por cierto.) – Guffa

+0

Oops, destinado a utilizar 'ExecuteScalar'. Actualizado. – cdhowie

+0

El objeto no se puede convertir de DBNull a otros tipos. –

3

Si desea comprobar si hay alguna registros coincidentes, puede contar con ellos:

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

Para obtener el resultado que utiliza el método ExecuteScalar:

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

El objeto no se puede convertir de DBNull a otros tipos. –

+0

@Mike: El resultado de contar los registros nunca es nulo, siempre es un número. – Guffa

+0

entiendo que solo te estoy dando la expectativa de que arroja –

1

ExecuteNonQuery devuelve el número de filas afectadas (si ciertas opciones no están seleccionadas) como n entero. Por lo tanto, puede verificar que el recuento sea igual (o mayor que) alguna condición de éxito o ejecutar escalar y devolver un valor de su consulta para indicar el éxito.

7

No entiendo por qué todos están tratando de usar ExecuteNonQuery o ExecuteScalar cuando la consulta en la pregunta es una instrucción SELECT. Si se trataba de una llamada de procedimiento almacenado que se ocupaba de la lógica de INSERT versus UPDATE en función de la existencia de un valor, ExecuteScalar tendría sentido porque puede devolver cualquier valor individual que desee de un procedimiento almacenado.

Sin embargo, dada la estructura de la pregunta, me estoy inclinando por esto como la respuesta.

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

Puede cambiar la consulta para utilizar WHERE EXISTS si no desea transmitir partidos de vuelta completa, pero a partir de los sonidos de la misma, sólo tendría a lo sumo 1 partido de todos modos.

+0

depende de los datos presentes, lo intentaré por la mañana pero me gusta la opción reader.hasrows. Gracias, suena lógico, te lo haré saber mañana. –

+0

HasRows aún devuelve un valor verdadero incluso si la columna es nula –

+0

Entonces cambie su consulta para que sea: SELECCIONE dataset1 FROM dbo.ste WHERE project = 'whatever' AND date = '2010-11-30' AND dataset1 IS NOT NULL – bitxwise