动态查找字符串 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 从查询结果跳转到您的行计数结果。
我使用 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 从查询结果跳转到您的行计数结果。