.NET(C#) PostgreSQL Kullanımı

.NET tabanlı programlama dilleri (C#, VB.NET) ile PostgreSQL veritabanı kullanımı için gerekli olan PostgreSQL veri sağlayıcısının kurulumu, PostgreSQL bağlantısı, tablo oluşturma, veri ekleme, güncelleme, silme ve sorgulama işlemleri yer alıyor.

.NET PostgreSQL Kurulumu

PostgreSQL veritabanını bağlanmak ve veritabanı işlemleri için ADO.NET PostgreSQL veri sağlayıcısının kurulması gerekir.

ADO.NET hakkında detaylı bilgi almak için ADO.NET yazıma bakmalısın.

PostgreSQL .NET veri sağlayıcısına sahip değildir. Bundan dolayı çokca kullanılan açık kaynak Npgsql veri sağlayıcısı kullanılacaktır.

Veri sağlayıcının kurulumu Referans olarak eklemek veya Nuget (Package Manager, .NET CLI) ile yapılır.

.NET, .NET Core ve NuGet hakkında detaylı bilgi almak için .NET Dersleri bölümüne bakmalısın.

.NET Core CLI kullanılarak proje oluşturulur.

dotnet new console -o PostgreSQL

Veri sağlayıcı paketi eklenerek .NET PostgreSQL kurulumu tamamlanır.

dotnet add package Npgsql

.NET PostgreSQL Kullanımı

.NET içerisinde yer alan ADO.NET, veri sağlayıcı özelliği sayesinde veritabanı bağımsız olarak işlem yapmayı sağlar.

Veri sağlayıcı tanımlamak için DbProviderFactories sınıfında yer alan RegisterFactory metodu kullanılır.

DbProviderFactories.RegisterFactory(string providerInvariantName, DbProviderFactory factory);
DbProviderFactories.RegisterFactory(string providerInvariantName, string factoryTypeAssemblyQualifiedName);
DbProviderFactories.RegisterFactory(string providerInvariantName, Type providerFactoryClass);

Npgsql DbProviderFactory sınıfının bir örneğini Npgsql.NpgsqlFactory.Instance üzerinden sağlar.

DbProviderFactories.RegisterFactory("postgresql", Npgsql.NpgsqlFactory.Instance);

Veritabanı işlemleri yapmak için DbProviderFactories sınıfındaki GetFactory metodu kullanılır.

DbProviderFactories.GetFactory(DbConnection connection);
DbProviderFactories.GetFactory(DataRow providerRow);
DbProviderFactories.GetFactory(string providerInvariantName);

Metot geri dönüş olarak veritabanı bağlantısı (DbConnection), veritabanı işlemlerini (DbCommand, DbCommandBuilder) sınıflarını oluşturan DbProviderFactory sınıfını verir.

DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory("postgresql");

Fabrika tasarım desenini uygulayan DbProviderFactory sınıfı üzerinden veritabanı işlemlerinde kullanılan sınıflar oluşturulur.

.NET PostgreSQL bağlantısı

Veritabanı bağlantısı için DbProviderFactory ile elde edilebilen DbConnection sınıfı kullanılır.

DbConnection dbConnection = dbProviderFactory.CreateConnection();

DbConnection sınıfında yer alan ConnectionString değerine PostgreSQL bağlantı cümlesi yazılır.

Host=host-adresi;Username=kullanici;Password=sifre;Database=veritabani

Bağlantı cümlesinin daha anlaşılır olarak oluşturmak için DbProviderFactory üzerinden elde edilen DbConnectionStringBuilder kullanılır.

DbConnectionStringBuilder dbConnectionStringBuilder = dbProviderFactory.CreateConnectionStringBuilder();
dbConnectionStringBuilder.Add("Host", "host-adresi");
dbConnectionStringBuilder.Add("Username", "kullanici");
dbConnectionStringBuilder.Add("Password", "sifre");
dbConnectionStringBuilder.Add("Database", "veritabani");

Oluşturulan bağlantı cümlesi ConnectionString alanına yazılarak erişime hazır hale getirilir.

DbConnectionStringBuilder dbConnectionStringBuilder = dbProviderFactory.CreateConnectionStringBuilder();
dbConnectionStringBuilder.Add("Host", "localhost");
dbConnectionStringBuilder.Add("Username", "postgres");
dbConnectionStringBuilder.Add("Password", "yusuf.sezer");
dbConnectionStringBuilder.Add("Database", "postgres");

DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = dbConnectionStringBuilder.ConnectionString;

Bağlantı cümlesi ayarlandıktan sonra DbConnection sınıfında yer alan Open metodu ile PostgreSQL veritabanı bağlantısı sağlanır.

Bağlantı sırasında olası hataları yakalamak ve yönetmek için try-catch kullanımı faydalı olacaktır.

try
{
    dbConnection.Open();
}
catch (Exception ex)
{
    Console.Error.WriteLine(ex);
}

Bağlantı kontrolü DbConnection sınıfında yer alan ConnectionState ile yapılır.

Console.WriteLine("Bağlantı durumu: {0}", dbConnection.State);

Sınıf içerisinde yer alan Close metodu kullanılarak veritabanı bağlantısı kapatılır.

dbConnection.Open();
Console.WriteLine("Bağlantı durumu: {0}", dbConnection.State);
dbConnection.Close();

DbConnection sınıfı IDisposable arayüzünü uyguladığından dolayı using anahtar kelimesi ile kaynakların teslim edilmesi (veritabanı bağlantısının kapatılması) sağlanabilir.

using (dbConnection)
{
    dbConnection.Open();
    Console.WriteLine("Bağlantı durumu: {0}", dbConnection.State);
}

Arayüz hakkında detaylı bilgi almak için C# IDisposable yazıma bakmalısın.

class Program
{
    public static readonly string ProviderName = "postgresql";

    static void Main(string[] args)
    {

        DbProviderFactories.RegisterFactory(ProviderName, Npgsql.NpgsqlFactory.Instance);

        DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(ProviderName);

        DbConnectionStringBuilder dbConnectionStringBuilder =
                dbProviderFactory.CreateConnectionStringBuilder();
        dbConnectionStringBuilder.Add("Host", "localhost");
        dbConnectionStringBuilder.Add("Username", "postgres");
        dbConnectionStringBuilder.Add("Password", "yusuf.sezer");
        dbConnectionStringBuilder.Add("Database", "postgres");

        DbConnection dbConnection = dbProviderFactory.CreateConnection();
        dbConnection.ConnectionString = dbConnectionStringBuilder.ConnectionString;

        try
        {
            using (dbConnection)
            {
                dbConnection.Open();
                Console.WriteLine("Bağlantı durumu: {0}", dbConnection.State);
                // veritabanı işlemleri
            }
        }
        catch (Exception exception)
        {
            Console.Error.WriteLine(exception);
        }

    }
}

.NET PostgreSQL veritabanı işlemleri

ADO.NET veritabanı işlemlerinin hemen yapıldığı bağlantılı ve bellek üzerinde yapıldığı bağlantısız yöntemleri sağlar.

Bağlantılı veritabanı işlemleri sırasında DbCommand kullanılırken bağlantısız işlemlerde DbDataAdapter, DataSet, DataTable gibi sınıflar kullanılır.

.NET PostgreSQL tablo oluşturma

PostgreSQL tablo oluşturmak için SQL CREATE komutu ve DbCommand sınıfı kullanılır.

DbCommand dbCommand = dbConnection.CreateCommand();

dbCommand.CommandText = @"
CREATE TABLE kisiler (
kisi_sira INT GENERATED ALWAYS AS IDENTITY,
kisi_adi VARCHAR(20) NOT NULL,
kisi_soyadi VARCHAR(30) NOT NULL DEFAULT 'SEZER',
kisi_eposta VARCHAR(50) NOT NULL,
CONSTRAINT PK_sira PRIMARY KEY(kisi_sira)
);";

dbCommand.ExecuteNonQuery();
Console.WriteLine("Tablo oluşturuldu.");

Tablo oluşturma işlemi için SQL Tablo Oluşturma yazıma bakabilirsin.

.NET PostgreSQL veri ekleme

PostgreSQL veritabanına veri eklemek için SQL INSERT komutu ve DbCommand kullanılır.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = @"
INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) 
VALUES('Yusuf', 'SEZER', 'yusufsezer@mail.com')";

int kayitSayisi = dbCommand.ExecuteNonQuery();
Console.WriteLine("{0} kayıt eklendi.", kayitSayisi);

Kullanıcıdan veya dışarıdan alınan bilgiler ile veri ekleme, silme veya güncelleme sırasında DbParameter sınıfının kullanımı SQL Injection gibi durumlara karşı faydalı olacaktır.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = @"
INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) 
VALUES(:kisi_adi, :kisi_soyadi, :kisi_eposta)";

Console.Write("Adınız: ");
DbParameter kisiAdi = dbProviderFactory.CreateParameter(); // DbProviderFactory üzerinden
kisiAdi.ParameterName = "kisi_adi";
kisiAdi.Value = Console.ReadLine();
dbCommand.Parameters.Add(kisiAdi);

Console.Write("Soyadınız: ");
DbParameter kisiSoyadi = dbCommand.CreateParameter(); // DbCommand üzerinden
kisiSoyadi.ParameterName = "kisi_soyadi";
kisiSoyadi.Value = Console.ReadLine();
dbCommand.Parameters.Add(kisiSoyadi);

Console.Write("E-posta: ");
DbParameter kisiEposta = dbCommand.CreateParameter();
kisiEposta.ParameterName = "kisi_eposta";
kisiEposta.Value = Console.ReadLine();
dbCommand.Parameters.Add(kisiEposta);

int kayitSayisi = dbCommand.ExecuteNonQuery();
Console.WriteLine("{0} kayıt eklendi.", kayitSayisi);

NOT: Yer tutucular(:kisi_adi, @KisiAdi) veri sağlayıcısına göre farklılık gösterir.

NOT2: DbParameter sınıfında yer alan DbType, Scale, Size gibi alanlar kullanılarak veri bilgisi belirlenir.

.NET PostgreSQL veri güncelleme

.NET ile PostgreSQL veri güncelleme işleminde SQL UPDATE komutu ve DbCommand kullanılır.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = @"UPDATE kisiler SET kisi_adi = :kisi_adi";

Console.Write("Sıra: ");
DbParameter kisiSira = dbCommand.CreateParameter();
kisiSira.ParameterName = "kisi_sira";
kisiSira.DbType = DbType.Int32; // veri türü belirlendi
kisiSira.Value = Convert.ToInt32(Console.ReadLine());
dbCommand.Parameters.Add(kisiSira);

Console.Write("Adınız: ");
DbParameter kisiAdi = dbCommand.CreateParameter();
kisiAdi.ParameterName = "kisi_adi";
kisiAdi.Value = Console.ReadLine();
dbCommand.Parameters.Add(kisiAdi);

int kayitSayisi = dbCommand.ExecuteNonQuery();
Console.WriteLine("{0} kayıt düzenlendi.", kayitSayisi);

NOT: Veri güncelleme işleminde WHERE kullanılmazsa tablodaki tüm veriler güncellenir.

.NET PostgreSQL veri silme

PostgreSQL veri silme için SQL DELETE komutu ve DbCommand sınıfı kullanılır.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = @"DELETE FROM kisiler WHERE kisi_sira = :kisi_sira";

Console.Write("Sıra: ");
DbParameter kisiSira = dbCommand.CreateParameter();
kisiSira.ParameterName = "kisi_sira";
kisiSira.DbType = DbType.Int32; // veri türü belirlendi
kisiSira.Value = Convert.ToInt32(Console.ReadLine());
dbCommand.Parameters.Add(kisiSira);

int kayitSayisi = dbCommand.ExecuteNonQuery();
Console.WriteLine("{0} kayıt silindi.", kayitSayisi);

NOT: Veri silme işleminde WHERE kullanılmazsa tablodaki tüm veriler silinir.

.NET PostgreSQL sorgulama

PostgreSQL veri çekme, veri listeme veya sorgulama için SQL SELECT, DbCommand ve DbDataReader kullanılır.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = @"SELECT kisi_adi, kisi_soyadi, kisi_eposta FROM kisiler";

DbDataReader dbDataReader = dbCommand.ExecuteReader();
while (dbDataReader.Read())
{
    Console.WriteLine("Adı: {0} \nSoyadı: {1} \nE-posta: {2}",
        dbDataReader[0],
        dbDataReader["kisi_soyadi"],
        dbDataReader.GetString(2));
}

NOT: Tablo yapısı biliniyorsa GetVeriTuru metotları kullanmak faydalı olacaktır.

DbDataReader sınıfında yer alan FieldCount gibi alanlar kullanılarak veri listeleme işlemi yapılır.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = @"SELECT kisi_adi, kisi_soyadi, kisi_eposta FROM kisiler";

DbDataReader dbDataReader = dbCommand.ExecuteReader();
int fieldCount = dbDataReader.FieldCount;

for (int i = 0; i < fieldCount; i++)
{
    Console.Write("{0}\t", dbDataReader.GetName(i));
}
Console.WriteLine();

while (dbDataReader.Read())
{
    for (int i = 0; i < fieldCount; i++)
    {
        Console.Write("{0}\t", dbDataReader.GetString(i));
    }
    Console.WriteLine();
}

Sorgulama işlemi kullanıcıdan veya dışarıdan alınan veri ile yapılacaksa DbParameter kullanımı faydalı olacaktır.

.NET PostgreSQL bağlantısız işlemler

ADO.NET veritabanındaki verileri DataSet veya DataTable sınıfı ile ifade ederek bellek üzerinde işlem yapmayı sağlar.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandType = CommandType.TableDirect;
dbCommand.CommandText = "kisiler";

DbDataAdapter dbDataAdapter = dbProviderFactory.CreateDataAdapter();
dbDataAdapter.SelectCommand = dbCommand;

DataTable dataTable = new DataTable();
dbDataAdapter.Fill(dataTable);

foreach (DataRow item in dataTable.Rows)
{
    Console.WriteLine("Adı: {0} \nSoyadı: {1} \nE-posta: {2}", item[0], item["kisi_soyadi"], item[2]);
}

NOT: Bağlantısız veritabanı işlemlerinde SelectCommand kullanımı zorunludur.

İşlemlerin veritabanında yansıtılması için DbDataAdapter sınıfındaki InsertCommand, DeleteCommand, UpdateCommand kullanılır.

Her alana ait komutların yazılması yerine DbCommandBuilder sınıfı kullanılabilir.

DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandType = CommandType.TableDirect;
dbCommand.CommandText = "kisiler";

DbDataAdapter dbDataAdapter = dbProviderFactory.CreateDataAdapter();
dbDataAdapter.SelectCommand = dbCommand;

DbCommandBuilder dbCommandBuilder = dbProviderFactory.CreateCommandBuilder();
dbCommandBuilder.DataAdapter = dbDataAdapter;
dbDataAdapter.InsertCommand = dbCommandBuilder.GetInsertCommand();
dbDataAdapter.UpdateCommand = dbCommandBuilder.GetUpdateCommand();
dbDataAdapter.DeleteCommand = dbCommandBuilder.GetDeleteCommand();

// veri çekme
DataTable dataTable = new DataTable();
dbDataAdapter.Fill(dataTable);

// veri ekleme
DataRow yusuf = dataTable.NewRow();
yusuf[0] = "0";
yusuf[1] = "Yusuf";
yusuf.SetField(2, "Sefa");
yusuf[3] = "yusufsezer@mail.com";
dataTable.Rows.Add(yusuf);
dbDataAdapter.Update(dataTable);

// veri güncelleme
dataTable.PrimaryKey = new DataColumn[] { dataTable.Columns[0] };
DataRow foundDataRow = dataTable.Rows.Find(1);
foundDataRow[1] = "Yusuf Sefa";
dbDataAdapter.Update(dataTable);

// veri silme
dataTable.PrimaryKey = new DataColumn[] { dataTable.Columns["kisi_sira"] };
DataRow[] foundDataRows = dataTable.Select("kisi_adi='Yusuf Sefa'"); // filter
foreach (DataRow item in foundDataRows)
{
    item.Delete();
}
dbDataAdapter.Update(foundDataRows);

// veri listeleme
foreach (DataRow item in dataTable.Rows)
{
    Console.WriteLine("Adı: {0} \nSoyadı: {1} \nE-posta: {2}",
        item[0],
        item["kisi_soyadi"],
        item[2]);
}

NOT: DataTable üzerinde veri seçme (Find) ve veri sorgulama (Select) işlemi sırasında PrimaryKey belirlenmesi gerekir.

NOT2: Birden fazla tablo arasında ilişkilerin DataRelation, kısıtlamaların ise Constraint ile belirlenmesi gerekir.

Son

.NET ile PostgreSQL işlemlerinde kullanılan Npgsql paketinin Npgsql alanında NpgsqlConnection, NpgsqlCommand, NpgsqlDataReader sınıfları yer alır.

Ayrıca PostgreSQL veritabanına özel işlemlerde kullanılan NpgsqlCopyTextWriter, NpgsqlLargeObjectManager, NpgsqlBinaryExporter gibi sınıflarda vardır.

PostgreSQL özgü işlemleri yaparken bu sınıfların kullanımı faydalı olacaktır.

Temel veritabanı işlemlerinde ADO.NET tarafından sağlanan sınıfların kullanımı olası veritabanı değişikliği sırasında faydalı olacaktır.

.NET Derslerine buradan ulaşabilirsiniz.

PostgreSQL Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.


Bunlara'da bakmalısın!