在 TransactSql.ScriptDom 中为通用语句创建访问者
Create a visitor for generic statement in TransactSql.ScriptDom
使用TransactSql.ScriptDom,可以通过扩展TSqlFragmentVisitor class 查看SQL 语句的对象模型。对于每种语句类型,都有一个可以被覆盖的单独的 Visit 方法。但我想将完全相同的代码放入每种类型的每次访问中。对于各种声明,我需要类似通用访问的东西。我该怎么做?
using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Reflection;
public class CustomVisitor: TSqlFragmentVisitor
{
private void DoSomething(dynamic obj)
{
foreach (var property in obj.GetType().
GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
// Recursively analyse object model to find specific objects
}
}
// Create table
public override void Visit(CreateTableStatement node)
{
DoSomething(node);
base.Visit(node);
}
// Create view
public override void Visit(CreateViewStatement node)
{
DoSomething(node);
base.Visit(node);
}
// ...
// Huge number of Visit for different types of statement
}
我确实找到了一个适用于所有类型语句的通用方法:Visit(TSqlStatement node)。代码现在如下所示:
using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Reflection;
public class CustomVisitor : TSqlFragmentVisitor
{
private void DoSomething(dynamic obj)
{
foreach (var property in obj.GetType().
GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
// Recursively analyse object model to find specific objects
}
}
// Generic statement
public override void Visit(TSqlStatement node)
{
DoSomething(node);
base.Visit(node);
}
}
// Generic statement
public override void Visit(TSqlStatement node)
{
DoSomething(node);
base.Visit(node);
}
}
使用TransactSql.ScriptDom,可以通过扩展TSqlFragmentVisitor class 查看SQL 语句的对象模型。对于每种语句类型,都有一个可以被覆盖的单独的 Visit 方法。但我想将完全相同的代码放入每种类型的每次访问中。对于各种声明,我需要类似通用访问的东西。我该怎么做?
using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Reflection;
public class CustomVisitor: TSqlFragmentVisitor
{
private void DoSomething(dynamic obj)
{
foreach (var property in obj.GetType().
GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
// Recursively analyse object model to find specific objects
}
}
// Create table
public override void Visit(CreateTableStatement node)
{
DoSomething(node);
base.Visit(node);
}
// Create view
public override void Visit(CreateViewStatement node)
{
DoSomething(node);
base.Visit(node);
}
// ...
// Huge number of Visit for different types of statement
}
我确实找到了一个适用于所有类型语句的通用方法:Visit(TSqlStatement node)。代码现在如下所示:
using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Reflection;
public class CustomVisitor : TSqlFragmentVisitor
{
private void DoSomething(dynamic obj)
{
foreach (var property in obj.GetType().
GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
// Recursively analyse object model to find specific objects
}
}
// Generic statement
public override void Visit(TSqlStatement node)
{
DoSomething(node);
base.Visit(node);
}
}
// Generic statement
public override void Visit(TSqlStatement node)
{
DoSomething(node);
base.Visit(node);
}
}