Я получаю сообщение об ошибке при выполнении оператора SQL DDL через соединение ODBC в .Net Core.
Я использую свежий экземпляр Ignite (v2.7) по умолчанию, подключенный из .Net Core (v2.2) через OdbcConnection (System.Data.Odbc v4.5.0).
Трассировка стека:
2019-56-04 10:56:57.622 [ERROR] CREATE TABLE X (Id varchar(255) not null, Value int, PRIMARY KEY (Id));CREATE TABLE Y (Id varchar(255) not null, Value int, PRIMARY KEY (Id));
2019-56-04 10:56:57.710 [ERROR] ERROR [HY000] Failed to find query with ID: 0
2019-56-04 10:56:57.718 [ERROR] at System.Data.Odbc.OdbcDataReader.NextResult(Boolean disposing, Boolean allresults)
at System.Data.Odbc.OdbcDataReader.FirstResult()
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
at System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
at System.Data.Common.DbCommand.ExecuteNonQueryAsync(CancellationToken cancellationToken)
Я заметил, что если я разделил два оператора на отдельные вызовы ExecuteNonQuery, это сработало, поэтому я предполагаю, что Ignite не нравится несколько операторов, когда он получает количество затронутых записей.
Я обнаружил похожую проблему из v2.3, но я думаю, что это не так, и я получаю ее в v2.7.
Репродуктор:
using System;
using System.Data.Odbc;
namespace IgniteMultistatementReproducer {
internal class Program {
private static void Main(string[] args) {
try {
using (var conn = new OdbcConnection($"DRIVER={{Apache Ignite}};ADDRESS=localhost:10800;")) {
conn.Open();
var cmd = new OdbcCommand {
CommandText = "CREATE TABLE X (Id varchar(255) not null, Value int, PRIMARY KEY (Id));CREATE TABLE Y (Id varchar(255) not null, Value int, PRIMARY KEY (Id));",
Connection = conn
};
var numRecordsAffected = cmd.ExecuteNonQuery();
Console.WriteLine($"Num Records Affected: {numRecordsAffected}");
}
} catch (Exception ex) {
Console.WriteLine(ex);
}
}
}
}