gpt4 book ai didi

c# - 从 C# 中的字符串检测 SQL 查询

转载 作者:行者123 更新时间:2023-11-30 14:23:06 25 4
gpt4 key购买 nike

我在谷歌上搜索了很多关于我的问题,甚至在 SO 中查看了许多 QA,但找不到我要找的东西,无论如何,如果这是一个重复的问题,我很抱歉。这是我的场景:我在 C# 中有一个字符串,它应该用作 SQL Server 查询。但是这个字符串可以是任何东西,从简单的(从 B 中选择 A)到复杂的 SP(可能包含多个命令)。如何显式检测此字符串中的每个查询?例如,假设我们有以下字符串:

select columnA from tblB
delete tblD where ID='100'
insert into tblF (name) values ('test')

上面的文本显然由 3 个不同的查询组成,每个查询都应该以自己特定的方式执行,即第一个(选择)需要 ExecuteReader,我应该显示一个结果表,而其他的需要 ExecuteNonQuery。所以在内部我应该运行 3 个 SQL 查询,但问题是我如何区分这 3 个查询?我不能像在 SQL 中那样简单地用 '\n' 分割字符串,一个查询可以写成多行。检测不同查询的最佳/正确方法是什么。 (SQL Server Management Studio 是我正在寻找的完美示例)我应该使用 SQL 解析器吗?如果是这样,我应该寻找什么?我也见过很多解析器,但我真的很困惑,因为我不知道我应该从它们那里得到什么。

我已经尽力描述问题了!提前致谢

最佳答案

您可以添加对 Microsoft.SqlServer.TransactSql.ScriptDom 的引用,这样就非常简单了(至少对于快乐路径而言)

using Microsoft.SqlServer.TransactSql.ScriptDom;
using System;
using System.Collections.Generic;
using System.IO;

namespace MyApp
{
class Program
{
static void Main(string[] args)
{

var sql = @"
SELECT columnA
FROM tblB
WHERE ColumnB = 1

DELETE tblD
WHERE ID = '100'

INSERT INTO tblF
(NAME)
VALUES ('test'),
('foo'),
('bar')
";

var parser = new TSql100Parser(true); //Or TSql120Parser or whatever
IList<ParseError> errors = new List<ParseError>();

TSqlScript script = (TSqlScript)parser.Parse(new StringReader(sql), out errors);

//TODO: Don't ignore errors
foreach (var batch in script.Batches)
{
foreach (var st in batch.Statements)
{
Console.WriteLine(st.GetType().Name);
Console.WriteLine(sql.Substring(st.StartOffset, st.FragmentLength));
Console.WriteLine();
}
}
}
}
}

返回

enter image description here

关于c# - 从 C# 中的字符串检测 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46756176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com