.net core Apache Ignite 2.7:ODBC Linux-返回错误数据

.net core Apache Ignite 2.7:ODBC Linux-返回错误数据,.net-core,odbc,ignite,.net Core,Odbc,Ignite,我正在测试ApacheIgnite2.7LinuxODBC驱动程序,由于某些原因,它不能正常工作 当我运行SQL语句(如SELECT Id FROM MyTable)时,该值被乱码,返回Id列的值为8\00\05\07\09\0d\09\08\0-\0。但它与我期望的值类似,即80579d98-9010-4610-b12e-ed33ed7d3c62。我不知道这些是ASCII空字符\0还是什么,但有些地方不对劲,我想不出来 当我使用SQLLine工具时,值不会被篡改。我还安装了Windows OD

我正在测试ApacheIgnite2.7LinuxODBC驱动程序,由于某些原因,它不能正常工作

当我运行SQL语句(如SELECT Id FROM MyTable)时,该值被乱码,返回Id列的值为8\00\05\07\09\0d\09\08\0-\0。但它与我期望的值类似,即80579d98-9010-4610-b12e-ed33ed7d3c62。我不知道这些是ASCII空字符\0还是什么,但有些地方不对劲,我想不出来

当我使用SQLLine工具时,值不会被篡改。我还安装了Windows ODBC驱动程序,工作正常,但我需要Linux ODBC驱动程序

我使用以下库构建了驱动程序:

gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
GNU Make 4.1
libtoolize 2.4.6
aclocal 1.15
autoheader 2.69
automake 1.15
autoreconf 2.69
unixodbc 2.3.4-1
libssl 1.0.2r-1~deb9u1
以下是ignite-odbc-install.ini的内容:

# cat /src/apache-ignite-2.7.0-bin/platforms/cpp/odbc/install/ignite-odbc-install.ini
[Apache Ignite]
Description=Apache Ignite
Driver=/usr/local/lib/libignite-odbc.so
Setup=/usr/local/lib/libignite-odbc.so
DriverODBCVer=03.00
FileUsage=0
以下是运行odbcinst的结果:

# odbcinst -i -d -f /src/apache-ignite-2.7.0-bin/platforms/cpp/odbc/install/ignite-odbc-install.ini
odbcinst: Driver installed. Usage count increased to 1.
    Target directory is /etc
以下是/usr/local/lib文件夹的内容:

# cd /usr/local/lib
# ls
libignite-binary-2.7.0.33575.so.0      libignite-common-2.7.0.33575.so.0      libignite-odbc-2.7.0.33575.so.0      libignite-thin-client-2.7.0.33575.so.0
libignite-binary-2.7.0.33575.so.0.0.0  libignite-common-2.7.0.33575.so.0.0.0  libignite-odbc-2.7.0.33575.so.0.0.0  libignite-thin-client-2.7.0.33575.so.0.0.0
libignite-binary.a                     libignite-common.a                     libignite-odbc.a                     libignite-thin-client.a
libignite-binary.la                    libignite-common.la                    libignite-odbc.la                    libignite-thin-client.la
libignite-binary.so                    libignite-common.so                    libignite-odbc.so                    libignite-thin-client.so
以下是ldd命令的结果:

# ldd /usr/local/lib/libignite-odbc.so
        linux-vdso.so.1 (0x00007fffa46d0000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f18d554c000)
        libignite-binary-2.7.0.33575.so.0 => /usr/local/lib/libignite-binary-2.7.0.33575.so.0 (0x00007f18d531d000)
        libodbcinst.so.2 => /usr/lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007f18d5108000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f18d4d86000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f18d4a82000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f18d46e3000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f18d44cc000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f18d59f8000)
        libignite-common-2.7.0.33575.so.0 => /usr/local/lib/libignite-common-2.7.0.33575.so.0 (0x00007f18d42b5000)
        libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007f18d40ab000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f18d3e8e000)
更新1 我从.Net Core 2.2 C控制台程序运行此程序,在Docker Linux环境中仅使用System.Data.Odbc 4.5.0 NuGet引用

Ignitegarbledatareproducer.csproj

Dockerfile

ADD ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.7.tar.gz .
RUN gunzip unixODBC*.tar.gz && tar xvf unixODBC*.tar

WORKDIR /src/unixODBC-2.3.7
RUN ./configure --enable-gui=no --enable-drivers=no --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE
RUN make && make install

ENV LD_LIBRARY_PATH="/usr/local/lib"
docker-compose.yml

docker-compose-override.yml

建造

执行

更新2 我转而将以下内容添加到/src/apache-ignite-2.7.0-bin/platforms/cpp/odbc/install/ignite-odbc-install.ini中,您可以获得

从MyTable中选择Id之后的日志结尾;为方便起见,声明如下

[ODBC][1][1556564832.827181][SQLExecDirectW.c][177]
        Entry:
            Statement = 0xf27a80
            SQL = [SELECT Id FROM MyTable;][length = 23 (SQL_NTS)]
[ODBC][1][1556564832.847882][SQLExecDirectW.c][445]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.852889][SQLRowCount.c][173]
        Entry:
            Statement = 0xf27a80
            Row Count = 0x7ffd7da98f00
[ODBC][1][1556564832.856831][SQLRowCount.c][247]
        Exit:[SQL_SUCCESS]
            Row Count = 0x7ffd7da98f00 -> 0
[ODBC][1][1556564832.860335][SQLNumResultCols.c][156]
        Entry:
            Statement = 0xf27a80
            Column Count = 0x7ffd7da98f50
[ODBC][1][1556564832.864944][SQLNumResultCols.c][251]
        Exit:[SQL_SUCCESS]
            Count = 0x7ffd7da98f50 -> 1
[ODBC][1][1556564832.869909][SQLFetch.c][162]
        Entry:
            Statement = 0xf27a80
[ODBC][1][1556564832.884876][SQLFetch.c][351]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.894173][SQLColAttributeW.c][156]
        Entry:
            Statement = 0xf27a80
            Column Number = 1
            Field Identifier = SQL_DESC_NAME
            Character Attr = 0xf2e190
            Buffer Length = 4096
            String Length = 0x7ffd7da98f20
            Numeric Attribute = 0x7ffd7da98ee0
[ODBC][1][1556564832.898409][SQLColAttributeW.c][523]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.910800][SQLColAttributeW.c][156]
        Entry:
            Statement = 0xf27a80
            Column Number = 1
            Field Identifier = SQL_DESC_CONCISE_TYPE
            Character Attr = 0xf2e190
            Buffer Length = 4096
            String Length = 0x7ffd7da98f40
            Numeric Attribute = 0x7ffd7da98f00
[ODBC][1][1556564832.914551][SQLColAttributeW.c][523]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.925913][SQLGetData.c][237]
        Entry:
            Statement = 0xf27a80
            Column Number = 1
            Target Type = -8 SQL_WCHAR
            Buffer Length = 4094
            Target Value = 0xf2e190
            StrLen Or Ind = 0x7ffd7da98ee0
[ODBC][1][1556564832.929959][SQLGetData.c][534]
        Exit:[SQL_SUCCESS]                
            Buffer = [8](unicode)                
            Strlen Or Ind = 0x7ffd7da98ee0 -> 36
[ODBC][1][1556564832.934835][SQLFetch.c][162]
        Entry:
            Statement = 0xf27a80
[ODBC][1][1556564832.938930][SQLFetch.c][351]
        Exit:[SQL_NO_DATA]
[ODBC][1][1556564832.943970][SQLMoreResults.c][162]
        Entry:
            Statement = 0xf27a80
[ODBC][1][1556564832.960311][SQLMoreResults.c][345]
        Exit:[SQL_NO_DATA]
[ODBC][1][1556564832.965960][SQLFreeStmt.c][144]
        Entry:
            Statement = 0xf27a80
            Option = 0
[ODBC][1][1556564832.970025][SQLFreeStmt.c][266]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.975135][SQLFreeHandle.c][381]
        Entry:
            Handle Type = 3
            Input Handle = 0xf27a80
[ODBC][1][1556564832.981240][SQLFreeHandle.c][494]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.991337][SQLDisconnect.c][208]
        Entry:
            Connection = 0xf0a6f0
[ODBC][1][1556564832.996778][SQLDisconnect.c][379]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564833.001505][SQLFreeHandle.c][284]
        Entry:
            Handle Type = 2
            Input Handle = 0xf0a6f0
[ODBC][1][1556564833.006038][SQLFreeHandle.c][333]
        Exit:[SQL_SUCCESS]
更新3 我有一种预感,它可能与UTF-16有关,因为字符之间用\0分隔

可能与ODBC日志中此行的UNICODE设置有关

[ODBC][1][1556564832.214691][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0xf0a6f0
            Window Hdl = (nil)
            Str In = [DRIVER={Apache Ignite};ADDRESS=my-ignite-3e8b8cb9a4e192af.elb.us-east-1.amazonaws.com:10800;SSL_MODE=disable;][length = 115 (SQL_NTS)]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = 0x7ffd7da98dd0
            Completion = 0
        UNICODE Using encoding ASCII 'ANSI_X3.4-1968' and UNICODE 'UCS-2LE'
更新4 我发现这个说

如果ASCII字符编码不是UTF-8,例如:

使用编码ASCII“ISO8859-1”和UNICODE“UCS-2LE”的UNICODE 是否安装了多个驱动程序管理器,并且您的应用程序 使用错误的,或者驱动程序管理器未正确构建

我假设我的驱动程序没有正确构建

并说使用-enable iconv-和iconv char enc=UTF8-和iconv ucode enc=UTF16LE

更新5 我还发现这与.NETCore、unixODBC和UTF16有关

更新6 在调用unixODBC的configure时,我尝试添加-enable iconv-with iconv char enc=UTF8-with iconv ucode enc=UTF16LE,这将ODBC连接更改为UNICODE,使用ASCII编码“UTF8”和UNICODE编码“UTF16LE”,但不管怎样,我都得到了相同的错误数据。我也尝试过使用iconv-ucode-enc=UNICODE,但没有改变

这就是我更改Dockerfile的方式。我从apt get中删除了unixodbc,并将以下内容添加到Dockerfile中

ADD ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.7.tar.gz .
RUN gunzip unixODBC*.tar.gz && tar xvf unixODBC*.tar

WORKDIR /src/unixODBC-2.3.7
RUN ./configure --enable-gui=no --enable-drivers=no --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE
RUN make && make install

ENV LD_LIBRARY_PATH="/usr/local/lib"
这就是odbc日志现在的样子:

[ODBC][7][1556723781.839804][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0x1ddff70
            Window Hdl = (nil)
            Str In = [DRIVER={Apache Ignite};ADDRESS=my-ignite-3e8b8cb9a4e192af.elb.us-east-1.amazonaws.com:10800;SSL_MODE=disable;][length = 115 (SQL_NTS)]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = 0x7ffeca3331a0
            Completion = 0
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'
更新7 我通过连接得到了正确的响应,但是当我通过iusql连接时,我从我的复制机得到了错误的数据

更新8 添加一些odbc安装信息:

root@4efdb5ed98b5:/app# odbc_config --cflags
-DHAVE_UNISTD_H -DHAVE_PWD_H -DHAVE_SYS_TYPES_H -DHAVE_LONG_LONG -DSIZEOF_LONG_INT=8 -I/usr/local/include
root@4efdb5ed98b5:/app# odbc_config --ulen
-DSIZEOF_SQLULEN=8
root@4efdb5ed98b5:/app# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

这是ApacheIgnite2.7.0的一个bug,因此没有答案。ApacheIgnite已经提交了一个问题来解决它


Id列的类型是什么?如何检索数据?请出示密码。@NellieDanielyan抱歉耽搁了。我不得不创建一个复制器,因为我的代码库太复杂,无法发布。问题已更新为复制该问题的代码。我在AWS地址后面的ignite无法公开访问,因此您将无法访问它。您需要提供自己的Ignite 2.7.0实例。请尝试rdr.GetStringGetOrdinalId,而不是rdr[Id]@Nelliedinelyan。我已经尝试过了,但它会产生相同的结果。我认为ODBC驱动程序中存在一个问题,Apache Ignite人员必须解决这个问题。我还尝试为每种数据类型插入数据,并尝试返回相同的数据,我注意到char、varchar、uuid和date数据类型工作不正常。例如,当我向UUID列中插入数据时,我得到一个数据类型实际上是字节[]的对象,我必须自己将其转换为字符串,类似于new System.IO.StreamReadernew System.IO.MemoryStreambyte[]value.ReadToEnd。
PS C:\IgniteGarbledDataReproducer> docker-compose up
Starting ignitegarbleddatareproducer_ignitegarbleddatareproducer_1 ... done
Attaching to ignitegarbleddatareproducer_ignitegarbleddatareproducer_1
ignitegarbleddatareproducer_1  | START
ignitegarbleddatareproducer_1  | DRIVER={Apache Ignite};ADDRESS=my-ignite-3e8b8cb9a4e192af.elb.us-east-1.amazonaws.com:10800;SSL_MODE=disable;
ignitegarbleddatareproducer_1  | Connection Opened
ignitegarbleddatareproducer_1  | DROP TABLE IF EXISTS MyTable;
ignitegarbleddatareproducer_1  | Table Dropped (if it existed)
ignitegarbleddatareproducer_1  | CREATE TABLE MyTable (Id varchar(36) not null, FirstName varchar(255), LastName varchar(255), PRIMARY KEY (Id));
ignitegarbleddatareproducer_1  | Table Created
ignitegarbleddatareproducer_1  | INSERT INTO MyTable (Id) VALUES ('80579d98-9010-4610-b12e-ed33ed7d3c62');
ignitegarbleddatareproducer_1  | Data Inserted
ignitegarbleddatareproducer_1  | SELECT Id FROM MyTable;
ignitegarbleddatareproducer_1  | Id = '8 0 5 7 9 d 9 8 - '
ignitegarbleddatareproducer_1  | Data Returned
ignitegarbleddatareproducer_1  | DONE
ignitegarbleddatareproducer_ignitegarbleddatareproducer_1 exited with code 0
[ODBC]
Trace=yes
TraceFile=/logs/odbc.log
[ODBC][1][1556564832.827181][SQLExecDirectW.c][177]
        Entry:
            Statement = 0xf27a80
            SQL = [SELECT Id FROM MyTable;][length = 23 (SQL_NTS)]
[ODBC][1][1556564832.847882][SQLExecDirectW.c][445]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.852889][SQLRowCount.c][173]
        Entry:
            Statement = 0xf27a80
            Row Count = 0x7ffd7da98f00
[ODBC][1][1556564832.856831][SQLRowCount.c][247]
        Exit:[SQL_SUCCESS]
            Row Count = 0x7ffd7da98f00 -> 0
[ODBC][1][1556564832.860335][SQLNumResultCols.c][156]
        Entry:
            Statement = 0xf27a80
            Column Count = 0x7ffd7da98f50
[ODBC][1][1556564832.864944][SQLNumResultCols.c][251]
        Exit:[SQL_SUCCESS]
            Count = 0x7ffd7da98f50 -> 1
[ODBC][1][1556564832.869909][SQLFetch.c][162]
        Entry:
            Statement = 0xf27a80
[ODBC][1][1556564832.884876][SQLFetch.c][351]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.894173][SQLColAttributeW.c][156]
        Entry:
            Statement = 0xf27a80
            Column Number = 1
            Field Identifier = SQL_DESC_NAME
            Character Attr = 0xf2e190
            Buffer Length = 4096
            String Length = 0x7ffd7da98f20
            Numeric Attribute = 0x7ffd7da98ee0
[ODBC][1][1556564832.898409][SQLColAttributeW.c][523]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.910800][SQLColAttributeW.c][156]
        Entry:
            Statement = 0xf27a80
            Column Number = 1
            Field Identifier = SQL_DESC_CONCISE_TYPE
            Character Attr = 0xf2e190
            Buffer Length = 4096
            String Length = 0x7ffd7da98f40
            Numeric Attribute = 0x7ffd7da98f00
[ODBC][1][1556564832.914551][SQLColAttributeW.c][523]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.925913][SQLGetData.c][237]
        Entry:
            Statement = 0xf27a80
            Column Number = 1
            Target Type = -8 SQL_WCHAR
            Buffer Length = 4094
            Target Value = 0xf2e190
            StrLen Or Ind = 0x7ffd7da98ee0
[ODBC][1][1556564832.929959][SQLGetData.c][534]
        Exit:[SQL_SUCCESS]                
            Buffer = [8](unicode)                
            Strlen Or Ind = 0x7ffd7da98ee0 -> 36
[ODBC][1][1556564832.934835][SQLFetch.c][162]
        Entry:
            Statement = 0xf27a80
[ODBC][1][1556564832.938930][SQLFetch.c][351]
        Exit:[SQL_NO_DATA]
[ODBC][1][1556564832.943970][SQLMoreResults.c][162]
        Entry:
            Statement = 0xf27a80
[ODBC][1][1556564832.960311][SQLMoreResults.c][345]
        Exit:[SQL_NO_DATA]
[ODBC][1][1556564832.965960][SQLFreeStmt.c][144]
        Entry:
            Statement = 0xf27a80
            Option = 0
[ODBC][1][1556564832.970025][SQLFreeStmt.c][266]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.975135][SQLFreeHandle.c][381]
        Entry:
            Handle Type = 3
            Input Handle = 0xf27a80
[ODBC][1][1556564832.981240][SQLFreeHandle.c][494]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.991337][SQLDisconnect.c][208]
        Entry:
            Connection = 0xf0a6f0
[ODBC][1][1556564832.996778][SQLDisconnect.c][379]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564833.001505][SQLFreeHandle.c][284]
        Entry:
            Handle Type = 2
            Input Handle = 0xf0a6f0
[ODBC][1][1556564833.006038][SQLFreeHandle.c][333]
        Exit:[SQL_SUCCESS]
[ODBC][1][1556564832.214691][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0xf0a6f0
            Window Hdl = (nil)
            Str In = [DRIVER={Apache Ignite};ADDRESS=my-ignite-3e8b8cb9a4e192af.elb.us-east-1.amazonaws.com:10800;SSL_MODE=disable;][length = 115 (SQL_NTS)]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = 0x7ffd7da98dd0
            Completion = 0
        UNICODE Using encoding ASCII 'ANSI_X3.4-1968' and UNICODE 'UCS-2LE'
ADD ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.7.tar.gz .
RUN gunzip unixODBC*.tar.gz && tar xvf unixODBC*.tar

WORKDIR /src/unixODBC-2.3.7
RUN ./configure --enable-gui=no --enable-drivers=no --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE
RUN make && make install

ENV LD_LIBRARY_PATH="/usr/local/lib"
[ODBC][7][1556723781.839804][SQLDriverConnectW.c][290]
        Entry:
            Connection = 0x1ddff70
            Window Hdl = (nil)
            Str In = [DRIVER={Apache Ignite};ADDRESS=my-ignite-3e8b8cb9a4e192af.elb.us-east-1.amazonaws.com:10800;SSL_MODE=disable;][length = 115 (SQL_NTS)]
            Str Out = (nil)
            Str Out Max = 0
            Str Out Ptr = 0x7ffeca3331a0
            Completion = 0
        UNICODE Using encoding ASCII 'UTF8' and UNICODE 'UTF16LE'
root@4efdb5ed98b5:/app# odbc_config --cflags
-DHAVE_UNISTD_H -DHAVE_PWD_H -DHAVE_SYS_TYPES_H -DHAVE_LONG_LONG -DSIZEOF_LONG_INT=8 -I/usr/local/include
root@4efdb5ed98b5:/app# odbc_config --ulen
-DSIZEOF_SQLULEN=8
root@4efdb5ed98b5:/app# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8