Я использую 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();
}
}
}