C# WPF / PostgreSQL CRUD İşlemleri

Mertau

Hectopat
Katılım
24 Mart 2020
Mesajlar
865
Çözümler
3
Merhaba, PostgreSQL ve C# kullanarak TreeView üzerinde CRUD işlemleri yapmaya çalışıyorum. Tablolarım aşağıda attığım şekilde. TreeView yapımda her nodea tıkladığımda 3 adet buton çıkıyor Ekleme/Silme/Güncelleme için buna göre tablomla eşit şekilde hiyerarşik yapıyı bozmadan CRUD işlemlerini nasıl yapabilirim?

Kodumu şablon şekilde aşağıya ekliyorum ama hem kafamda hem kod olarak queryleri ve yapıyı nasıl kurmam gerektiğini çözemedim. Bilgisi olan biri yardım edebilirse çok sevinirim.
1690784375153.png
1690784428841.png

C#:
using Bornander.UI.ViewModels;
using Npgsql;
using System.Collections.Generic;
using System.Text;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Linq;


namespace Bornander.UI.Views
{
    public partial class TreeViewStyles : ResourceDictionary
    {
        public TreeViewStyles()
        {
            InitializeComponent();
        }

        private void UpdateNode(TreeNodeViewModel node)
        {
            string connectionString = "";

            using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
            {
                connection.Open();

                string query = "UPDATE your_table SET ";

                List<string> updateClauses = new List<string>();

                foreach (var property in node.GetType().GetProperties())
                {
                    if (property.GetValue(node) != null)
                    {
                        string columnName = property.Name;
                        string parameterName = $"@{columnName}";

                        updateClauses.Add($"{columnName} = {parameterName}");
                    }
                }

                query += string.Join(", ", updateClauses);
                query += " WHERE id = @id";

                using (NpgsqlCommand command = new NpgsqlCommand(query, connection))
                {
                    foreach (var property in node.GetType().GetProperties())
                    {
                        if (property.GetValue(node) != null)
                        {
                            string columnName = property.Name;
                            string parameterName = $"@{columnName}";
                            command.Parameters.AddWithValue(parameterName, property.GetValue(node));
                        }
                    }
                    command.Parameters.AddWithValue("@id", node.Id);

                    command.ExecuteNonQuery();
                }
            }
        }

        private void AddNode(TreeNodeViewModel node)
        {
            string connectionString = "";

            using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
            {
                connection.Open();

             //   string columnsQuery = "SELECT column_name FROM information_schema.columns WHERE table_name = 'your_table'";
                List<string> columnNames = new List<string>();

                using (NpgsqlCommand columnCommand = new NpgsqlCommand(columnsQuery, connection))
                {
                    using (NpgsqlDataReader reader = columnCommand.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string columnName = reader.GetString(0);
                            columnNames.Add(columnName);
                        }
                    }
                }

          //      string query = $"INSERT INTO your_table ({string.Join(", ", columnNames)}) VALUES ({string.Join(", ", columnNames.Select(c => $"@{c}"))})";

                using (NpgsqlCommand command = new NpgsqlCommand(query, connection))
                {
                    foreach (var columnName in columnNames)
                    {
                        object columnValue = node.GetType().GetProperty(columnName)?.GetValue(node);
                        command.Parameters.AddWithValue($"@{columnName}", columnValue ?? DBNull.Value);
                    }


                    command.ExecuteNonQuery();
                }
            }
        }

        private void DeleteNode(int nodeId)
        {
            string connectionString = "";

            using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
            {
                connection.Open();
                string query = "";

                using (NpgsqlCommand command = new NpgsqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@id", nodeId);

                    command.ExecuteNonQuery();
                }
            }
        }


        private string GenerateUpdateQuery(Dictionary<string, object> updateValues)
        {
            StringBuilder updateQuery = new StringBuilder();

            foreach (var updateValue in updateValues)
            {
                updateQuery.Append($"{updateValue.Key} = @{updateValue.Key}, ");
            }

            updateQuery.Length -= 2;

            return updateQuery.ToString();
        }

        //private void AddButton_Click(object sender, RoutedEventArgs e)
        //{
        //   Button button = (Button)sender;
        //    TreeNodeViewModel parentNode = (TreeNodeViewModel)button.DataContext;

        //   TreeNodeViewModel newNode = new TreeNodeViewModel();

        //  AddNode(newNode);
        //}

        private void UpdateButton_Click(object sender, RoutedEventArgs e)
        {
            Button button = (Button)sender;
            TreeNodeViewModel node = (TreeNodeViewModel)button.DataContext;

            UpdateNode(node);
        }

        private void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            Button button = (Button)sender;
            TreeNodeViewModel node = (TreeNodeViewModel)button.DataContext;
            DeleteNode(node.Id);
        }
    }
}
 

Yeni konular

Geri
Yukarı