无法从数据库获取结果

时间:2019-09-26 21:27:51

标签: c# sql

在我的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中没有数据。

可能不相关,但是我的查询包含三个内部联接。这是我第一次做那么多,所以可能是问题所在吗?除非那是引起问题的原因,否则在我运行查询时将无法正常工作?

2 个答案:

答案 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代码博客