2011-06-13 9 views
6

Estoy tratando de devolver el recuento de filas de una tabla de SQL Server. Múltiples fuentes en la red muestran lo siguiente como un método viable, pero continúa devolviendo '0 filas'. Cuando uso esa consulta en Management Studio, funciona bien y devuelve el recuento de filas correctamente. Lo probé solo con el nombre de la tabla simple y la totalmente calificada que le gusta al estudio de administración.C# 'select count' comando sql devuelve incorrectamente cero filas del servidor sql

  using (SqlConnection cn = new SqlConnection()) 
      { 
       cn.ConnectionString = sqlConnectionString; 
       cn.Open(); 

       SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM [LBSExplorer].[dbo].[myTable]", cn); 
       countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar()); 
       Console.WriteLine("Starting row count: " + countStart.ToString()); 
      } 

¿Alguna sugerencia sobre lo que podría ser la causa de ello?

+0

¿Es 'noprimarykey2' una tabla o una vista? La razón por la que pregunto es porque podría ser una vista que filtra los datos del usuario actual. –

+0

Es una tabla, la renombré para mayor claridad. Gracias – Glinkot

+0

@Glinkot, ¿y está seguro de que se conecta a la misma instancia de SQL Server tanto en Management Studio como en el código? –

Respuesta

4

Fije su CommandType a texto

command.CommandType = CommandType.Text 

Más detalles de Damien_The_Unbeliever comentario, con respecto a si .NET predetermina SqlCommandTypes para escribir texto.

Si separa el getter para CommandType en SqlCommand, encontrará que hay una carcasa especial extraña, por lo que si el valor es actualmente 0, miente y dice que es Text/1 en su lugar (de manera similar, desde componente/perspectiva de diseño, el valor predeterminado se muestra como 1). Pero el valor interno real se deja como 0.

7

Así es como me gustaría escribir que:

using (SqlConnection cn = new SqlConnection(sqlConnectionString)) 
{ 
    cn.Open(); 

    using (SqlCommand commandRowCount 
     = new SqlCommand("SELECT COUNT(*) FROM [LBSExplorer].[dbo].[myTable]", cn)) 
    { 
     commandRowCount.CommandType = CommandType.Text; 
     var countStart = (Int32)commandRowCount.ExecuteScalar(); 
     Console.WriteLine("Starting row count: " + countStart.ToString()); 
    } 
} 
1

Se puede utilizar esta mejor consulta:

SELECT OBJECT_NAME(OBJECT_ID) TableName, st.row_count 
FROM sys.dm_db_partition_stats st 
WHERE index_id < 2 AND OBJECT_NAME(OBJECT_ID)=N'YOUR_TABLE_NAME' 
+0

Posiblemente, pero sería útil si explicaras por qué es mejor? Es mejor que usar COUNT() supongo? –