在连接字符串中使用客户端编码时出错

时间:2018-10-24 07:14:37

标签: c# dapper npgsql

我在.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();
        }
    }
}

0 个答案:

没有答案