#c# #odbc #ignite
#c# #odbc #воспламенить
Вопрос:
Я получаю сообщение об ошибке при запуске инструкции SQL DDL через ODBC-соединение в .Net Core.
Я использую новый экземпляр Ignite по умолчанию (v2.7), подключенный из .Net Core (v2.2) через OdbcConnection (System.Data.Odbc версии 4.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);
}
}
}
}
Комментарии:
1. Можете ли вы также предоставить пример кода C #?
2. @isapego добавил код для воспроизведения проблемы.