在我的C#代码中,我试图打开与SQL Server数据库的连接并获得计数。我从我编写的另一个运行良好的应用程序中复制了代码(禁止查询本身)。我已经运行了查询-我构建的版本和代码构造的查询(我都使用变量)-它们都可以正常工作,并返回相同的计数。我只是什么也没回来。
我已经设置了断点并检查了我的连接和查询,这正是我所期望的。当我用谷歌搜索时,我只是为遇到完全不同问题的人们得到了结果,所以我很沮丧。我不知道为什么我什么都没回来。错误在哪里?
SqlConnection RRconnection = new SqlConnection();
RRconnection.ConnectionString = "Data Source=;Initial Catalog=;User id=;Password=";
RRconnection.Open();
string ridQuery = "SELECT COUNT (t.RxTimeStamp) FROM...";
SqlCommand query = new SqlCommand(ridQuery, RRconnection);
SqlDataReader data = query.ExecuteReader();
if (data.Read())
transcount = Convert.ToInt32(data.GetValue(0));
如果上面的段落不清楚,我希望查询返回计数1592064(对于我正在测试的特定实例),而data
中没有数据。
可能不相关,但是我的查询包含三个内部联接。这是我第一次做那么多,所以可能是问题所在吗?除非那是引起问题的原因,否则在我运行查询时将无法正常工作?
答案 0 :(得分:3)
您是否尝试过使用SqlCommand.ExecuteScalar Method
SqlCommand query = new SqlCommand(ridQuery, RRconnection);
Int32 transcount = (Int32) query.ExecuteScalar();
更新
我不确定您的查询为什么不起作用,也许尝试给count列加上别名:
string ridQuery = "SELECT COUNT (t.RxTimeStamp) AS RxCount FROM ...";
答案 1 :(得分:0)
如果查询返回单个值,最好使用ExecuteScalar
。
ExecuteScalar; 返回对象值,因此必须
Convert
为正确的类型
int totalCount = Convert.ToInt32(cmd.ExecuteScalar());
所以,对您的问题
这是ExecuteReader
,不用于获得Select Count
的结果,但是这段代码没有问题。您可以看到此代码的总计数值。
注意 :SqlDataReader对象是基于流的,仅向前检索来自数据源的查询结果的对象。
Read
方法仅处理内存中的一行,然后在保留下一行时覆盖旧记录。
ExecureReader; 在您的情况下,阅读器的第一行和第一列填充了查询结果,其他行和列设置为null。
if(reader.Read())
{
int totalRows = Convert.ToInt32(reader.GetValue(0)); //convert returned value
}
注意:使用列名和使用读取器特殊类型转换方法是我的最佳选择。
reader.GetInt32(reader.GetOrdinal("TotalCount"))
建议
ExecuteReader
读取单个值ExecuteScalar
,然后将结果强制转换为正确的类型IDisposible
代码博客中使用using
个对象(Connection,Command和Reader)。使用块关闭并处理当前对象。using
代码博客