Ошибка при использовании клиентской кодировки в строке подключения - PullRequest
0 голосов
/ 24 октября 2018

Я использую npgsql (версия 4.0.3) и Dapper (версия 1.50.5) в своем приложении .NET Core (.NET Standard 2.0).

Я запрашиваю данные из PostgreSQL.У выходного текста были некоторые проблемы с польскими символами, поэтому в строке подключения я заставляю использовать кодировку клиента, установленную на latin2.Но с этой опцией я получаю ошибку ниже:

System.Data.DataException
  HResult=0x80131501
  Message=Error parsing column 0 (name=<null>)
  Source=Dapper
  StackTrace:
   at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 3609
   at Dapper.SqlMapper.<QueryImpl>d__138`1.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1100
   at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 723


Inner Exception 1:
DecoderFallbackException: Unable to translate bytes [A3] at index 2 from specified code page to Unicode.

Некоторая информация о базе данных PostgreSQL 9.4.3 (в Debian) Кодировка базы данных установлена ​​в LATIN2 Сортировка: pl_PL

Строка подключения:

User ID=postgres;Host=192.168.1.26;Port=5432;Client Encoding = latin2;Database=testdb;Pooling=true;

Если я удаляю кодировку клиента из строки подключения, db.Query () работает правильно, возвращает значения без ошибок.Buuut с неправильным характером.

Возврат: MĽKA Должен вернуться: MĄKA

Ниже вы можете найти мой класс хранилища. GetAllItems метод, возвращающий список элементов.Поле в базе данных, которое может содержать польские символы, называется "nazwa_indeksu". db.Query () Функция вызывает исключение.И исключение выдается только тогда, когда «nazwa_indeksu» содержит польские символы.

 public class CatalogRepository : ICatalogRepository
    {
        private readonly IConfiguration _config;

        public CatalogRepository(IConfiguration config)
        {
            _config = config;
        }

        internal IDbConnection Connection
        {
            get
            {
                return new NpgsqlConnection(_config.GetConnectionString("DBConnection"));
            }
        }

        public IEnumerable<CatalogItem> GetAllItems(int pageIndex, int pageSize)
        {
            var sql = "select nazwa_indeksu as name, TRIM(indeks) as code, ilosc as quantity from g.gm_kartoteki where id_magazynu = 1 and ilosc > 0 order by nazwa_indeksu offset @Offset limit 10;";

            int offset = (pageIndex - 1) * pageSize;
            int limit = pageSize;

            using (IDbConnection db = Connection)
            {
                db.Open();
                return db.Query<CatalogItem>(sql, new { Offset = offset });
            }
        }
    }

Я также написал простое консольное приложение, которое могло бы помочь с воспроизведением проблемы.

using Dapper;
using Npgsql;
using System;
using System.Data;

namespace DapperError
{
    class Program
    {
        internal static IDbConnection Connection
        {
            get
            {
                return new NpgsqlConnection("User ID=postgres;Host=192.168.1.26;Port=5432;Client Encoding = latin2; Database=dbtest;Pooling=true;");
            }
        }

        static void Main(string[] args)
        {
            var sql = "select nazwa_indeksu as name from g.gm_kartoteki;";

            using (IDbConnection db = Connection)
            {
                db.Open();
                var result =  db.Query<string>(sql);

                foreach (var item in result)
                {
                    Console.WriteLine(item);
                }
            }

            Console.ReadKey();
        }
    }
}
...