Fórum Como inserir strings que chegam como UTF16 no Postgres #591715
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:
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:
Não dá certo, pois mostra os caracteres estranhos ainda. Minha conexão esta assim:
É 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]
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
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)