Skip to content

PostgreSQL C#

Winterpuma edited this page Dec 21, 2019 · 4 revisions

Подружим PostgreSQL с C#.
Для этого используем npgsql.
Нужно добавить ссылку на пакет nuget в проект.

  • Можно так
  • Или в VisualStudio в открытом проекте в обозревателе решений: ссылки -> управление пакетами nuget -> ищем npgsql.

Дальше можно копировать примеры из документации microsoft:

Подводные камни:

Для хранимой функции (созданной через CREATE FUNCTION, а не CREATE PROCEDURE) можно использовать CommandType.StoredProcedure, но это не даст преимущества перед вызовом вручную(SELECT * FROM function_name).

Для хранимой процедуры(CREATE PROCEDURE) же, не нужно использовать CommandType.StoredProcedure, а просто вызвать CALL procedure_name.

// For functions
using (var cmd = new NpgsqlCommand("SELECT my_func(1, 2)", conn))
using (var reader = cmd.ExecuteReader()) { ... }

// For procedures
using (var cmd = new NpgsqlCommand("CALL my_proc(1, 2)", conn))
using (var reader = cmd.ExecuteReader()) { ... }

Применение

           string connString =
                String.Format(
                    "Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
                    "127.0.0.1",
                    "username",
                    "dbname",
                    "5432", //port
                    "userpassword1234");

            using (var conn = new NpgsqlConnection(connString))
            {

                Console.Out.WriteLine("Opening connection");
                conn.Open();

                // ----- Вывести все из customer
                using (var command = new NpgsqlCommand("SELECT * FROM customer", conn))
                {
                    var reader = command.ExecuteReader();
                    
                    while (reader.Read())
                    {
                        Console.WriteLine(
                            string.Format(
                                "Reading from table=({0}, {1}, {2}, {3})",
                                reader.GetInt32(0).ToString(),
                                reader.GetString(1),
                                reader.GetInt32(2).ToString(),
                                reader.GetString(3)
                                )
                            );
                    }
                    // чтобы можно было больше одного запроса
                    reader.DisposeAsync(); // или запихнуть reader = command.ExecuteReader() в using
                }

                // ----- Вывести длину таблицы покупателей
                using (var cmdScalar = new NpgsqlCommand("SELECT COUNT(*) FROM customer", conn))
                {
                    // Execute the query and obtain the value of the first column of the first row
                    Int64 count = (Int64)cmdScalar.ExecuteScalar();
                    Console.Write("{0}\n", count);
                }

                // ----- Вызов функции с аргументом
                using (var cmdFunc = new NpgsqlCommand("SELECT * FROM test_func(@id)", conn)) // функция принимает int; select * from customer where id = $1;
                {
                    cmdFunc.Parameters.AddWithValue("id", 4); // а можно просто захардкодить в команду 
                    //cmdFunc.CommandType = System.Data.CommandType.StoredProcedure; // для function; procedure через call
                
                    NpgsqlDataReader dr = cmdFunc.ExecuteReader();
                    while (dr.Read())
                        Console.Write("{0}\t{1} \n", dr[0], dr[1]);
                }

                conn.Close();
            }