我正在尝试创建一个将常规sql语句转换为c#对象的方法,所以我决定使用Irony来解析sql语句然后我将该语句作为Action返回,其中包含语句的类型及其值取决于类型
这是我未完成的代码[因为我感到沮丧因为我不知道该怎么办]
private List<Action> ParseStatement(string statement)
{
var parser = new Parser(new SqlGrammar());
var parsed = parser.Parse(statement);
var status = parsed.Status;
while (parsed.Status == ParseTreeStatus.Parsing)
{
Task.Yield();
}
if (status == ParseTreeStatus.Error)
throw new ArgumentException("The statement cannot be parsed.");
ParseTreeNode parsedStmt = parsed.Root.ChildNodes[0];
switch (parsedStmt.Term.Name)
{
case "insertStmt":
var table = parsedStmt.ChildNodes.Find(x => x.Term.Name == "Id").ChildNodes[0].Token.ValueString;
var valuesCount =
parsedStmt.ChildNodes.Find(x => x.Term.Name == "insertData").ChildNodes.Find(
x => x.Term.Name == "exprList").ChildNodes.Count;
var values = parsedStmt.ChildNodes.Find(x => x.Term.Name == "insertData").ChildNodes.Find(
x => x.Term.Name …Run Code Online (Sandbox Code Playgroud) 我需要解析部分SQL查询(它是用于SQL注入审计工具).例如
'1' AND 1=1--
Run Code Online (Sandbox Code Playgroud)
应该分解成令牌
[0] => [SQL_STRING, '1']
[1] => [SQL_AND]
[2] => [SQL_INT, 1]
[3] => [SQL_AND]
[4] => [SQL_INT, 1]
[5] => [SQL_COMMENT]
[6] => [SQL_QUERY_END]
Run Code Online (Sandbox Code Playgroud)
他们至少是基于我的SQL的词法分析器,还是C#的bison等任何好工具(尽管我不想编写我自己的语法,因为我需要支持大部分,如果不是所有MySQL 5的语法)
我正在处理为任何SSRS RDL标识依赖的db对象的特定问题。
我对RDL中的查询是否有任何数据集具有存储过程有很好的了解,然后可以引用关联的存储过程并获取所有依赖对象(详细信息可以在此处找到:查找SQL Server对象依赖关系的不同方法)
但是我正在专门针对文本查询或任何rdl的内联查询的数据集。我能够从rdl的XML中提取CommandText,但是我不确定如何提取db对象(例如sp,table,views列)形成一个命令文本,该文本是rdl中的内联查询。
例如,如果我从XML commandText中提取以下查询(这是一个假设查询,则数据库中的名称未标准化,例如vw_用于视图,udf_用于函数):
-----This query serves Report ABC
SELECT DATE
,[amount]
,teamID = (SELECT TeamID FROM Sales.[getSalesPerson](r.date) as s WHERE R.[SalesPersonName] = S.[SalesPersonName])
,[channel]
,[product]
,[Item]
,r.[M_ID]
,Amount
,M.[Type]
FROM dbo.FactTable AS R
LEFT JOIN sp_Channel C ON R.[Channel_ID] = C.[Channel_ID]
LEFT JOIN Marketing.vw_M M ON R.[M_ID] = M.[M_ID]
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以确定此查询具有依赖对象,如下所示:
ObjectName ObjectType
------------------------------------------
dbo.FactTable Table
sp_Channel Stored Procedure
Marketing.vw_M View
Sales.[getSalesPerson] Function
Run Code Online (Sandbox Code Playgroud) 根据MSDN,SqlDataReader.GetSchemaTable返回执行查询的列元数据.我想知道是否有一个类似的方法将给出给定查询的表元数据?我的意思是涉及哪些表以及它所拥有的别名.
在我的应用程序中,我得到了查询,我需要以where编程方式附加该子句.使用GetSchemaTable(),我可以获取列元数据及其所属的表.但即使表有别名,它仍然返回真正的表名.有没有办法获取该表的别名?
以下代码显示了获取列元数据.
const string connectionString = "your_connection_string";
string sql = "select c.id as s,c.firstname from contact as c";
using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand command = new SqlCommand(sql, connection))
{
connection.Open();
SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo);
DataTable schema = reader.GetSchemaTable();
foreach (DataRow row in schema.Rows)
{
foreach (DataColumn column in schema.Columns)
{
Console.WriteLine(column.ColumnName + " = " + row[column]);
}
Console.WriteLine("----------------------------------------");
}
Console.Read();
}
Run Code Online (Sandbox Code Playgroud)
这将正确地提供列的详细信息.但是当我看到BaseTableName列时Id,它给出的contact不是别名c …
谁能帮帮我吗?
我有一堆.sql文件.我想在服务器上执行这些文件之前解析(验证)这些文件.
我有很多在线网站解析代码.但我想用C#解析代码.
所以,请你指导.如果有任何工具,我需要使用DLL.
我只是想解析文件而不是执行它
我有一个表示SQL查询的字符串,我需要从该字符串中提取表的名称.例如:
SELECT * FROM Customers
Run Code Online (Sandbox Code Playgroud)
将返回"客户".要么
SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo'
SELECT a.AddressZip FROM Customers c
INNER JOIN Addresses a ON c.AddressId=a.AddressId
Run Code Online (Sandbox Code Playgroud)
将返回"客户,地址".获得更高级:
(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable)))
Run Code Online (Sandbox Code Playgroud)
只需返回"MyTable"
(注意,我可能已经对查询进行了拼写错误,但你明白了).
实现这一目标的最佳/最准确的方法是什么?
类Parser仅具有返回ParseResult的Parse方法,似乎我无法使用ParseResult做任何事情。如何获得sql语句的抽象语法树,或者仅可以从sql解析元数据标记就可以了。
我需要解析一个Command.CommandText.
我不想运行查询.我只想查看命令执行时查询是否成功.
说我有; "SELECT * FROM SomeTable WHERE (1=1)"
此字符串将成功.
但,
"SELECT * FROM SomeTable WHERE (1=1"
Run Code Online (Sandbox Code Playgroud)
不会成功.
现在我的问题.我怎么会Parse这个字符串c#?
在C#中评估SQL语句以确定它是否不仅仅是选择的最佳方法是什么? - 即 - 如果稍后执行该语句,则检查是否将更改值(插入,更新,删除,修改或删除).
我可以使用的开箱即用C#dlls/functions的任何想法,或者这是我应该使用字符串解析技术编写自己的东西?
谢谢.
c# ×7
sql ×6
parsing ×3
t-sql ×3
.net ×2
sql-server ×2
ado.net ×1
dll ×1
irony ×1
lexer ×1
metadata ×1
mysql ×1
sqlcommand ×1
string ×1
validation ×1
xml-parsing ×1