Como inserir strings que chegam como UTF16 no Postgres
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
Curtidas 0