【发布时间】:2015-05-21 14:48:59
【问题描述】:
我使用 ADO DataReader 从 sql server 获取行。由于 DataReader 没有记录数,我需要自己获取记录数。因此,在我的情况下,我想将传递给动态类的原始 sql 语句放在子查询中。
例子
SELECT
id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title
应该是
SELECT COUNT(*)
FROM (
SELECT id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title)t
在这种情况下,我们需要修改 SQL 语句,因为语法要求添加 TOP 100 PERCENT 才能正常工作:
SELECT COUNT(*)
FROM (SELECT TOP 100 PERCENT id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title)t
所以我这样做了:
int fromIndex = this.SQL.IndexOf("SELECT",
StringComparison.CurrentCultureIgnoreCase);
String countSql = "SELECT TOP 100 PERCENT" +
this.SQL.Substring(fromIndex + 6);
countSql = "SELECT COUNT(*) FROM (" + countSql + ")t";
但是如果原始语句已经有一个像这样的 TOP 子句怎么办
SELECT TOP 5 id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title
甚至更糟
SELECT TOP 5
id,
title,
value
FROM table
WHERE id = 1234
ORDER BY title
所以我的代码需要处理这个。
顺便说一句:如果有人有更好的方法来从 任何 SQL 语句中计算记录,那么这个答案也是受欢迎的!
编辑
澄清我的问题。
链接How to get number of rows using SqlDataReader in C# 解释了如何做到这一点。我读了那个。我的问题是如何处理传入的SQL语句添加TOP 100 PERCENT子句。
【问题讨论】:
-
在第一个
select之后添加select @@rowcount,您可以.NextResult阅读它 -
我试过这个答案。 => 之前运行专门的 SELECT COUNT(*) 正是我试图做的,因为 sql 语句是动态的,所以我必须处理这个。 @@rowcount 在多查询/多用户系统中没有给我确切的计数...
标签: c# replace datareader