Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用Microsoft.SqlServer.Transact-SQL.ScriptDom进行有错误的分析查询_Sql Server_C# 4.0 - Fatal编程技术网

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