Como inserir strings que chegam como UTF16 no Postgres

09/03/2018

0

Olá pessoal, tudo bem!?

Entendi é que na codificação do C#, quando vou inserir dados no banco as strings chegam como UTF16 e no meu caso o banco Postgres está com UTF8.
[E uma aplicação C# com Windows Form, não estou usando Entity framework nem testei com o uso dele não.

Converti uma string de teste e deu certo, mas esse procedimento está correto?
Vou ter que ficar convertendo todo texto que for inserido no banco?

Usei esse código aqui para converter de 16 para 8:

// convertendo string UTF16 para UTF8 para depois inserir no banco postgres 
public string U16u8(string utf16ToutUtf8) 
{ 
// Get UTF16 bytes and convert UTF16 bytes to UTF8 bytes 
byte[] utf16Bytes = Encoding.Unicode.GetBytes(utf16ToutUtf8); 
byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes); 

// Return UTF8 bytes as ANSI string 
return Encoding.Default.GetString(utf8Bytes); 
} 


Esse funcionou blz: salva no Postgres e vejo os caracteres no banco ok. Porém, quando seleciono normal no banco e mando exibir no form os dados, aparecem
caracteres estranhos no lugar do "ç", por exemplo. Com isso, tentei pegar o 8 e converter para 16:

// convertendo string UTF8 para UTF16 para retornar dados do banco postgres para o form 
public string U8u16(string utf8ToutUtf16) 
{ 
// Get UTF8 bytes and convert UTF8 bytes to UTF16 bytes 
byte[] utf8Bytes = Encoding.UTF8.GetBytes(utf8ToutUtf16); 
byte[] utf16Bytes = Encoding.Convert(Encoding.Unicode, Encoding.Unicode, utf8Bytes); 

// Return UTF8 bytes as ANSI string 
return Encoding.Unicode.GetString(utf16Bytes); 
} 


Não dá certo, pois mostra os caracteres estranhos ainda. Minha conexão esta assim:

public class DAL 
{ 
static string serverName = "127.0.0.1"; // localhost 
static string port = "5432"; // porta default 
static string userName = "postgres"; // nome do administrador 
static string password = "132456"; // senha do administrador 
static string databaseName = "meubanco"; // nome do banco de dados 
NpgsqlConnection pgsqlConnection = null; 
static string connString = null; 

public DAL() 
{ 
connString = String.Format("Server=;Port=;User Id=;Password= 
;Database=;",serverName, port, userName, password, databaseName); 
} 

*** Para inserir esta assim: 

// Produtos - Inserir 
public void Produtos_Inserir(string descricao, string unid) 
{ 
try 
{ 
using (pgsqlConnection = new NpgsqlConnection(connString)) 
{ 
pgsqlConnection.Open(); 

string cmdSql = String.Format("insert into produtos(cod_pro, descricao, unid) 
values ('" + pro.CodPro + "', '" + descricao + "', '" + unid 
+ "')"); 

using (NpgsqlCommand pgsqlcommand = new NpgsqlCommand(ger.U16u8(cmdSql), 
pgsqlConnection)) 
{ 
pgsqlcommand.ExecuteNonQuery(); 
ger.MensagemOK("Produto salvo com sucesso! "); 
} 
} 
} 
catch (NpgsqlException ex) 
{ 
throw ex; 
} 
catch (Exception ex) 
{ 
throw ex; 
} 
finally 
{ 
pgsqlConnection.Close(); 
} 

*** Para selecionar esta assim: 

// Produtos - Busca pelo codigo 
public DataTable Produtos_BuscaPor_Codigo() 
{ 
DataTable dt = new DataTable(); 
try 
{ 
using (pgsqlConnection = new NpgsqlConnection(connString)) 
{ 
pgsqlConnection.Open(); 
string cmdSql = "select descricao, unid " + 
"from produtos " + 
"where cod_pro = " + pro.CodPro + ""; 

using (NpgsqlDataAdapter Adpt = new NpgsqlDataAdapter(cmdSql, 
pgsqlConnection)) 
{ 
Adpt.Fill(dt); 
pro.Descricao = dt.Rows[0][ger.U8u16("descricao")].ToString(); 
pro.Unid = dt.Rows[0][ger.U8u16("unid")].ToString(); 
} 

catch (Exception ex) 
{ 
throw ex; 
} 
finally 
{ 
pgsqlConnection.Close(); 
} 
return dt; 
} 


É possível alterar a codificação da base com o set client_encoding? Olhei no banco e tem um monte de opção para mudar, mas não tem a UTF 16.

Grato desde já.



Essa dúvida foi gerada a partir de um comentário na aula [url:descricao=Introdução ao C# - O que é C# - Vídeo 1]//www.devmedia.com.br/introducao-ao-csharp-o-que-e-csharp-video-1/38177[/url]
Legal

Legal

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar