C# 如何在C中以字符串形式返回SELECT COUNT语句的结果?

C# 如何在C中以字符串形式返回SELECT COUNT语句的结果?,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我想知道如何从C中的SELECT COUNT语句返回结果 我有一个sql语句,返回15的计数 目前,我正在返回datareader。我能以某种方式将结果作为字符串返回吗 static public SqlDataReader FillDataReader(string sql, SqlParameter[] parms) { SqlConnection conn = new SqlConnection(ConnectionString); SqlCommand cmd =

我想知道如何从C中的SELECT COUNT语句返回结果

我有一个sql语句,返回15的计数

目前,我正在返回datareader。我能以某种方式将结果作为字符串返回吗

    static public SqlDataReader FillDataReader(string sql, SqlParameter[] parms)
{
    SqlConnection conn = new SqlConnection(ConnectionString);
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader dr = null;
    conn.Open();
    cmd.CommandTimeout = 120; //120 seconds for the query to finish executing

    foreach (SqlParameter p in parms)
    {
        cmd.Parameters.Add(p);
    }
    try
    {
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch (SqlException ex)
    {
        if (dr != null)
        {
            dr.Close();
        }
        conn.Close();


        //DBUtilExceptionHandler(ex, sql);

        throw ex;


    }
    finally
    {
    }

    return dr; //This could be null...be sure to test for that when you use it

}
或者我可以用另一种方法。我只是不知道应该是什么

感谢您的帮助

这是我的select语句:

        select count(LeadListID) from LeadLists WHERE SalesPersonID = 1
AND LeadListDateCreated BETWEEN '9/1/11' AND '10/1/11 23:59:59'

当然,在读取单个字段时,始终可以调用.NET中的ToString方法:

dr[0].ToString()
是否有许多记录要转换为字符串?然后循环每一行,以字符串形式获取值,并以for循环方式创建主字符串。

当然-只需使用:

int count = (int) query.ExecuteScalar();
// TODO: Decide the right culture to use etc
return count.ToString();
注:

使用using语句而不是手动try/catch/finally块 无论是否存在错误,都应关闭连接 假设查询的自然结果是整数,我会将其更改为返回int,而不是字符串。如果调用者愿意,让他们进行转换 如果出现错误,您几乎可以肯定应该让异常冒泡,而不是返回null 我将代码编写为:

public static int ExecuteScalarInt32(string sql, SqlParameter[] parms)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    using (SqlCommand command = new SqlCommand(sql, conn) { Parameters = parms })
    {
        conn.Open();
        command.CommandTimeout = 120;
        return (int) command.ExecuteScalar();
    }
}
如果您确实需要一个版本来处理任意数据读取器,您可以将其编写为:

public static T ExecuteQuery<T>(string sql, SqlParameter[] parms,
                                Func<SqlDataReader, T> projection)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    using (SqlCommand command = new SqlCommand(sql, conn) { Parameters = parms })
    {
        conn.Open();
        command.CommandTimeout = 120;
        return projection(command.ExecuteReader());
    }
}
然后用以下词语来称呼它:

int count = ExecuteQuery<int>(sql, parms, reader => {
                                  if (!reader.MoveNext()) {
                                      throw new SomeGoodExceptionType("No data");
                                  }
                                  return reader.GetInt32(0);
                              });

改为使用ExecuteScalar,它将从返回的记录集的第一条记录返回第一个字段,这就是您想要的。这将返回一个真正的整数对象。添加一个ToString,您应该会很好。

因为您只需要一个值,所以ExecuteReader的更好替代方法是:

尝试 { var count=cmd.ExecuteScalar.ToString; }
在sql中将其转换为varchar:

select cast(count(LeadListID) as varchar(10))
from LeadLists 
WHERE SalesPersonID = 1
AND LeadListDateCreated BETWEEN '9/1/11' AND '10/1/11 23:59:59'
或者直接调用.ToString查看结果,如其他答案所示

此外,我不喜欢数据阅读器依赖CommandBehavior.CloseConnection。我更喜欢这样的代码:

static public IEnumerable<IDataRecord> GetDataReader(string sql, SqlParameter[] parms)
{
    using (var conn = new SqlConnection(ConnectionString))
    using (var cmd = new SqlCommand(sql, conn))
    {
        cmd.CommandTimeout = 120; //120 seconds for the query to finish executing

        foreach (SqlParameter p in parms)
        {
            cmd.Parameters.Add(p);
        }

        conn.Open();
        using (var dr= cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                yield return dr;
            }
        }
    }
}

您正在寻找ExecuteScalar而不是ExecuteReaderHi Jon,这太棒了。我是新来的。什么SqlParameter被传递到方法中?@Barrett:嗯,我不知道-不管你以前在做什么。我假设您已经知道了这一点,因为它在您的原始代码中。我想我不需要传递任何参数,因为这在我的select语句中都已处理。@Barrett:在这种情况下,如果您在其他地方也不需要,请传入空数组或完全删除传入参数的功能。