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); }