none
Como utilizar o postgreSQL em um aplicação C#

    Question

  • Qual a melhor maneira de se utilizar o postgreSQL em uma aplicação com C#?

    npgsql? odbc? ou alguma outra forma?

    Tentei com o npgsql mas não obtive resposta do banco em muitos casos (se necessario posso postar meu codigo).

    Friday, July 06, 2012 2:09 AM

Answers

  • Oi Thales,

    O ODBC já vem instalado no Windows, e é nativo do .Net Framework.

    Vc chegou a testar a consulta desta forma:

    class Program
        {
            static void Main(string[] args)
            {
                int i;
                NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=postgres;Database=teste;");           
                conn.Open();
                NpgsqlCommand cmd = new NpgsqlCommand("SELECT \"Nome\" FROM cliente;",conn);
                try
                {
                    NpgsqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        for (i = 0; i < rd.FieldCount; i++)
                        {
                            Console.Write("{0} \t", rd[i]);
                        }
                        Console.WriteLine();
                    }
                }
                catch(NpgsqlException e)
                {
                    Console.WriteLine("Erro " + e);
                }
                conn.Close();
                Console.WriteLine("\n\nPresione uma tecla para SAIR");
                Console.ReadKey();
            }
        }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Saturday, July 07, 2012 2:44 PM

All replies

  • Olá Thales,

    As duas são válidas e bastante utilizadas.

    Eu geralmente prefiro utilizar o NPGSQL.

    Vc poderia postar o código?

    Referências:

    http://www.codeproject.com/Articles/30989/Using-PostgreSQL-in-your-C-NET-application-An-intr

    http://www.devmedia.com.br/forum/conexao-c-com-postgresql/134298

    http://wiki.postgresql.org/wiki/Using_Microsoft_.NET_with_the_PostgreSQL_Database_Server_via_ODBC

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Friday, July 06, 2012 12:20 PM
  • Fiz uma console application simples em só para testar a conexão

    Este código funciona perfeitamente, mas se eu quiser por exemplo só visualizar a coluna Nome da tabela cliente eu altero a linha que possui o comando em SQL

    SELECT * FROM cliente

    para

    SELECT Nome FROM cliente

    E ai da erro.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Npgsql;
    
    
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i;
    
                NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=postgres;Database=teste;");           
                conn.Open();
    
                NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM cliente;",conn);
    
                try
                {
                    NpgsqlDataReader rd = cmd.ExecuteReader();
    
                    while (rd.Read())
                    {
                        for (i = 0; i < rd.FieldCount; i++)
                        {
                            Console.Write("{0} \t", rd[i]);
                        }
                        Console.WriteLine();
                    }
    
                }
                catch(NpgsqlException e)
                {
                    Console.WriteLine("Erro " + e);
                }
    
                conn.Close();
                Console.WriteLine("\n\nPresione uma tecla para SAIR");
                Console.ReadKey();
            }
        }
    }

    Friday, July 06, 2012 2:39 PM
  • Olá Thales,
    Tudo bem?

    O campo Nome realmente existe nessa tabela?

    Qual a mensagem de erro?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Friday, July 06, 2012 4:06 PM
  • A campo Nome existe sim, abaixo a imagem comprovando a existência dele

     de

    O erro q o catch retorna:

    Npgsql.NpgsqlException:
    coluna "nome" não existe
    Severity: ERRO
    Code: 42703
       at Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__a.MoveNext() in C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:line 850
       at Npgsql.ForwardsOnlyDataReader.GetNextResponseObject() in C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:line 1173
       at Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() in C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:line 1191
       at Npgsql.ForwardsOnlyDataReader.NextResult() in C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:line 1377
       at Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean synchOnReadError) in C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:line 1040
       at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 611
       at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 588
       at Npgsql.NpgsqlCommand.ExecuteReader() in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 551
       at ConsoleApplication1.Program.Main(String[] args) in E:\Documentos\Visual Studio 2010\Projects\BD_Postgre_ConsoleApplication\BD_Postgre_ConsoleApplication\Program.cs:line 25

    Obrigado por ajudar :D

    Friday, July 06, 2012 10:43 PM
  • Olá Thales,

    Isso é bastante estranho.

    Acontece o mesmo com as demais colunas?

    Vc esta conectando no servidor correto?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Saturday, July 07, 2012 4:24 AM
  • Sim a acontece a mesma coisa com cada uma das colunas, mas quando eu seleciono todas com o * funciona o q mostra que esta fazendo a conexão com o servidor. Já criei outro banco outra tabela e da sempre o mesmo erro.

    Vc pode me indicar como faço a conexão usando outro driver como o odbc por exemplo?

    Obrigado.

    Saturday, July 07, 2012 2:20 PM
  • Olá Thales,

    Sua código deve ficar assim com ODBC:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using system.Data.Odbc;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i;
                OdbcConnection conn = new OdbcConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=postgres;Database=teste;");           
                conn.Open();
                OdbcCommand cmd = new OdbcCommand("SELECT * FROM cliente;",conn);
                try
                {
                    OdbcDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        for (i = 0; i < rd.FieldCount; i++)
                        {
                            Console.Write("{0} \t", rd[i]);
                        }
                        Console.WriteLine();
                    }
                }
                catch(OdbcException e)
                {
                    Console.WriteLine("Erro " + e);
                }
                conn.Close();
                Console.WriteLine("\n\nPresione uma tecla para SAIR");
                Console.ReadKey();
            }
        }
    }

    Quando vc faz a consulta usando o provider do PostgreSQL qual o nome das consultas retornadas?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Saturday, July 07, 2012 2:29 PM
  •  Quando perguntei ao odbc me referi a como instalar o driver, é só eu baixar o arquivo .dll e adicionar nas referencias?

    a consulta feita no pgadmin

    Saturday, July 07, 2012 2:41 PM
  • Oi Thales,

    O ODBC já vem instalado no Windows, e é nativo do .Net Framework.

    Vc chegou a testar a consulta desta forma:

    class Program
        {
            static void Main(string[] args)
            {
                int i;
                NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=postgres;Database=teste;");           
                conn.Open();
                NpgsqlCommand cmd = new NpgsqlCommand("SELECT \"Nome\" FROM cliente;",conn);
                try
                {
                    NpgsqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        for (i = 0; i < rd.FieldCount; i++)
                        {
                            Console.Write("{0} \t", rd[i]);
                        }
                        Console.WriteLine();
                    }
                }
                catch(NpgsqlException e)
                {
                    Console.WriteLine("Erro " + e);
                }
                conn.Close();
                Console.WriteLine("\n\nPresione uma tecla para SAIR");
                Console.ReadKey();
            }
        }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Saturday, July 07, 2012 2:44 PM
  • tentei utilizando o odbc mas os visual C# deu erro no conn.open(); acho q é pq nao tenho o driver do odbc instalado no windows, vi na internet q tem q instalar alguma coisa pra funcionar com o postgre.

    Mas fiz a consulta utilizando o npgsql da forma q vc disse SELECT \"Nome\" FROM cliente e funcionou!!! :D:D

    Muito obrigado mesmo.

    Sem querer abusar da sua boa vontade gostaria de saber como usar imagens como atributo de uma tabela ou mesmo como uma tabela.


    Saturday, July 07, 2012 2:54 PM
  • Boa Thales!

    Excelente que agora esteja funcionando.

    Para imagens (ou outros arquivos) eu geralmente crio um propriedade que seja um byte[] (array de bytes).

    Na sua tabela, pelo o que vi na documentação do PostGre vc terá de criar uma coluna do tipo "bytea".

    Veja: http://www.postgresql.org/docs/8.4/static/datatype-binary.html

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Saturday, July 07, 2012 3:03 PM
  • Blz Fernando muito orgiado por tudo.
    Saturday, July 07, 2012 3:08 PM
  • Fernando seguindo o padrão de comando que vc disse um comando INSERT ficaria assim? nome, idade e id são variáveis do tipo string, int e int respectivamente.

    "INSERT INTO clientes (\"Nome\", \"Idade\", \"ID\") VALUES ("+nome+","+idade+","+id+");";

    Esta dando erro, acho q o problema esta no values.

    Saturday, July 07, 2012 10:45 PM
  • Não crie a estrutura da sua tabela usando aspas, senão fica essa sujeira no código e pode criar confusões do tipo. Refaça os create tables sem usar aspas nos nomes de campos e tabelas.
    Sunday, July 08, 2012 12:55 AM
  • Olá Thales,

    Vc deve utilizar aspas simples para entre os valores do tipo string, desta forma:

    "INSERT INTO clientes (\"Nome\", \"Idade\", \"ID\") VALUES ('"+nome+"',"+idade+","+id+");";

    O comentário do rs.developer é relevante. Verifique se quando vc criou as tabelas utilizou aspas duplas entre os nomes das colunas. Se sim, então é melhor apagar estas tabelas e refaze-las sem as aspas duplas.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    Sunday, July 08, 2012 2:05 PM
  • E não usei aspas para criar a tabela, acho q foi pgadmin q colocou elas. Tem como criar as tabelas sem elas ou tira-las?

    Fernando o insert funcionou obrigado.

    Monday, July 09, 2012 12:06 AM
  • Se sua base já está toda pronta, então gera todo o script (backup formato plain) e retira todas as aspas.
    Monday, July 09, 2012 1:06 AM