Sql server 使用Microsoft.SqlServer.Transact-SQL.ScriptDom进行有错误的分析查询
我使用以下代码获取查询中的语句列表:Sql server 使用Microsoft.SqlServer.Transact-SQL.ScriptDom进行有错误的分析查询,sql-server,c#-4.0,Sql Server,C# 4.0,我使用以下代码获取查询中的语句列表: using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using Microsoft.SqlServer.TransactSql.ScriptDom; namespace SqlTokenazer { public partial class Form1 : Form { public Form
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using Microsoft.SqlServer.TransactSql.ScriptDom;
namespace SqlTokenazer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Tokenaze();
}
private void Tokenaze()
{
rtbLog.Clear();
string script = "select * from dbo.Mytable where columnName = 0 delete from dbo.Mytable where columnName = 0";
var sqlScript = ParseScript(script);
PrintStatements(sqlScript);
}
public TSqlScript ParseScript(string script){
IList<ParseError> parseErrors;
TSql100Parser tsqlParser = new TSql100Parser(true);
TSqlFragment fragment;
using (StringReader stringReader = new StringReader(script))
{
fragment = (TSqlFragment)tsqlParser.Parse(stringReader, out parseErrors);
}
if (parseErrors.Count > 0)
{
var retMessage = string.Empty;
foreach (var error in parseErrors)
{
retMessage += error.Number + " - " + error.Message + " - position: " + error.Offset + ";\r\n";
}
rtbLog.Text += retMessage;
}
return (TSqlScript)fragment;
}
public void PrintStatements(TSqlScript tsqlScript)
{
if (tsqlScript != null)
{
foreach (TSqlBatch batch in tsqlScript.Batches)
{
if (batch.Statements.Count == 0) continue;
foreach (TSqlStatement statement in batch.Statements)
{
rtbLog.Text += string.Format("{0}\r\n", statement.GetType().ToString());
}
}
}
}
}
}
但当我在查询中出错时,语句列表是空的:(
string script=“从dbo.Mytable中选择*,其中。。。
从dbo.Mytable中删除,其中columnName=0”
如果查询错误,如何获取语句列表
谢谢!我知道这是一个老问题,但我在谷歌搜索时遇到了它,所以我想我会回答它 如果你的问题是,如果SQL不能被解析,如何获得语句列表,那么简单的回答是你不能——解析器不知道语句列表是什么。你必须查看错误并找出答案
如果你的问题是,输入代码有什么问题,那就是select和delete语句都在同一行。如果你用分号将它们分开,或者将它们分成两行,就可以得到你的两个语句。我知道这是一个老问题,但我在谷歌搜索时遇到了它,所以我想我会回答它 如果你的问题是,如果SQL不能被解析,如何获得语句列表,那么简单的回答是你不能——解析器不知道语句列表是什么。你必须查看错误并找出答案 如果你的问题是,输入代码有什么问题,那就是select和delete语句都在同一行上。如果你用分号将它们分开,或者将它们分成两行,那么就行了,你可以得到两条语句
Microsoft.SqlServer.TransactSql.ScriptDom.SelectStatement
Microsoft.SqlServer.TransactSql.ScriptDom.DeleteStatement