相关疑难解决方法(0)

用反语解析SQL语句

我正在尝试创建一个将常规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)

c# sql irony

14
推荐指数
1
解决办法
3152
查看次数

在C#中使用部分SQL

我需要解析部分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的语法)

c# mysql sql parsing lexer

11
推荐指数
1
解决办法
5917
查看次数

使用内联查询从SSRS数据集中提取数据库对象依赖性(查询类型:文本)

我正在处理为任何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)

sql t-sql sql-server reporting-services xml-parsing

11
推荐指数
1
解决办法
282
查看次数

从查询中获取表模式

根据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 …

.net sql ado.net metadata

7
推荐指数
1
解决办法
4079
查看次数

如何使用C#解析SQL文件?

谁能帮帮我吗?

我有一堆.sql文件.我想在服务器上执行这些文件之前解析(验证)这些文件.

我有很多在线网站解析代码.但我想用C#解析代码.

所以,请你指导.如果有任何工具,我需要使用DLL.

我只是想解析文件而不是执行它

c# sql validation parsing

5
推荐指数
1
解决办法
4105
查看次数

如何为表的名称解析SQL Query语句

我有一个表示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"

(注意,我可能已经对查询进行了拼写错误,但你明白了).

实现这一目标的最佳/最准确的方法是什么?

c# string

5
推荐指数
1
解决办法
4165
查看次数

如何使用Microsoft.SqlServer.Management.SqlParser中的类将T-SQL解析为AST

Parser仅具有返回ParseResult的Parse方法,似乎我无法使用ParseResult做任何事情。如何获得sql语句的抽象语法树,或者仅可以从sql解析元数据标记就可以了。

c# t-sql sql-server

5
推荐指数
1
解决办法
1741
查看次数

在c#中解析SQL字符串

我需要解析一个Command.CommandText.

我不想运行查询.我只想查看命令执行时查询是否成功.

说我有; "SELECT * FROM SomeTable WHERE (1=1)"

此字符串将成功.

但,

"SELECT * FROM SomeTable WHERE (1=1"
Run Code Online (Sandbox Code Playgroud)

不会成功.

现在我的问题.我怎么会Parse这个字符串c#

.net c# t-sql parsing sqlcommand

4
推荐指数
1
解决办法
8217
查看次数

在C#中评估sql语句的最佳方法是什么?

在C#中评估SQL语句以确定它是否不仅仅是选择的最佳方法是什么? - 即 - 如果稍后执行该语句,则检查是否将更改值(插入,更新,删除,修改或删除).

我可以使用的开箱即用C#dlls/functions的任何想法,或者这是我应该使用字符串解析技术编写自己的东西?

谢谢.

c# sql dll

2
推荐指数
1
解决办法
292
查看次数