-
Notifications
You must be signed in to change notification settings - Fork 1
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();
}