动态查找字符串 sql 并在 C# 中替换

Dynamic seek for a string sql and replace in C#

我使用 ADO DataReader 从 sql 服务器获取行。由于 DataReader 没有记录数,我需要自己获取记录数。所以在我的例子中,我想将传递给 class 动态的原始 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 语句中计算记录,也欢迎这个答案!

编辑 澄清我的问题。 link How to get number of rows using SqlDataReader in C# 解释了如何做。我读了那个。我的问题是如何处理传入的 SQL 语句是否添加 TOP 100 PERCENT 子句。

DataReader 可能没有行数,但您可以在将结果集解析到数据模型时通过调用 Read() 来推断它。

此外,您的代码容易受到 SQL 注入攻击。您应该使用 SqlCommand 并为动态值参数添加 SqlParameter 对象来代替字符串连接。

这是使用 Read()SqlCommand class 的基本示例:MSDN - SqlDataReader.Read

澄清一下:查询是动态传入的东西?然后您想知道它读取了多少行?我相信正如一条评论所暗示的那样;您可以将 "select @@rowcount" 添加到传入查询的末尾;然后回到 C# 中使用 .NextResult 从查询结果跳转到您的行计数结果。