private void ExecuteBatchNonQuery(string sql)
        {
            var sqlBatch = string.Empty;

            try
            {
                var parser = new SqlAnywhereBatchParser();
                parser.SqlText      += (sender, args) => { sqlBatch = args.SqlText.Trim(); };
                parser.SpecialToken += (sender, args) =>
                {
                    if (string.IsNullOrEmpty(sqlBatch))
                    {
                        return;
                    }

                    if (args.Opaque is GoSearcher.GoSearcherParameters goParams)
                    {
                        using (var command = Factory.CreateCommand(string.Empty, Connection, Transaction, Options))
                        {
                            command.CommandText = sqlBatch;

                            for (var i = 0; i != goParams.Count; ++i)
                            {
                                command.ExecuteNonQuery();
                            }
                        }
                    }

                    sqlBatch = null;
                };

                using (var source = new TextReaderSource(new StringReader(sql), true))
                {
                    parser.Process(source, stripComments: true);
                }

                if (!string.IsNullOrEmpty(sqlBatch))
                {
                    using (var command = Factory.CreateCommand(string.Empty, Connection, Transaction, Options))
                    {
                        command.CommandText = sqlBatch;
                        command.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                using (var message = new StringWriter())
                {
                    message.WriteLine("An error occured executing the following sql:");
                    message.WriteLine(string.IsNullOrEmpty(sqlBatch) ? sql : sqlBatch);
                    message.WriteLine("The error was {0}", ex.Message);

                    throw new Exception(message.ToString(), ex);
                }
            }
        }
        private static bool ContainsGo(string sql)
        {
            var containsGo = false;
            var parser     = new SqlAnywhereBatchParser();

            parser.SpecialToken += (sender, args) => containsGo = true;
            using (var source = new TextReaderSource(new StringReader(sql), true))
            {
                parser.Process(source);
            }

            return(containsGo);
        }
        [TestCase("# blah\nqweqwe", "# blah\nqweqwe\n")] // #'s do not indicate comments. Leave as is
        public void TestSqlStrippedSingleLineCommentAndSqlWithoutGo(string input, string expected)
        {
            var output        = new List <string>();
            var specialTokens = new List <string>();
            var batchParser   = new SqlAnywhereBatchParser("\n");

            batchParser.SqlText      += (sender, evt) => { output.Add(evt.SqlText); };
            batchParser.SpecialToken += (sender, evt) => { specialTokens.Add(evt.Token); };
            var source = new TextReaderSource(new StringReader(input));

            batchParser.Process(source, true);
            Assert.AreEqual(1, output.Count);
            Assert.AreEqual(expected, output[0]);
            Assert.AreEqual(0, specialTokens.Count);
        }