我在.NET Core应用程序(.NET Standard 2.0)中使用了npgsql(版本4.0.3)和Dapper(版本1.50.5)。
我从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
下面您可以找到我的存储库类。 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();
}
}
}