esdion 發表於 2026-1-2 19:14

資料庫


using System;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Lineage76GMTool
{
    public partial class Form1 : Form
    {
      private string server = "localhost";
      private string port = "3306";
      private string username = "root";
      private string password = "root";
      private string connectionString = "";

      public Form1()
      {
            InitializeComponent();
            UpdateConnectionString();
      }

      private void UpdateConnectionString()
      {
            connectionString = $"Server={server};" +
                              $"Port={port};" +
                              $"Uid={username};" +
                              $"Pwd={password};" +
                              $"Charset=utf8;";
      }

      private void btnTest_Click(object sender, EventArgs e)
      {
            textBoxLog.AppendText("嘗試連線資料庫...\r\n");

            try
            {
                using (var conn = new MySqlConnection(connectionString))
                {
                  conn.Open();
                  textBoxLog.AppendText("資料庫連線成功\r\n");

                  // 如果已選擇資料庫,則顯示該資料庫資訊
                  if (comboBoxDatabase.SelectedItem != null)
                  {
                        string selectedDatabase = comboBoxDatabase.SelectedItem.ToString();
                        
                        // 切換到選定的資料庫
                        conn.ChangeDatabase(selectedDatabase);
                        
                        textBoxLog.AppendText($"已選擇資料庫:{selectedDatabase}\r\n");
                        
                        // 獲取該資料庫中的所有表
                        var cmd = new MySqlCommand("SHOW TABLES", conn);
                        var reader = cmd.ExecuteReader();
                        
                        // 清空現有的表列表
                        listBoxTables.Items.Clear();
                        
                        while (reader.Read())
                        {
                            listBoxTables.Items.Add(reader.GetString(0));
                        }
                        reader.Close();
                        
                        textBoxLog.AppendText($"資料庫 '{selectedDatabase}' 的資料表已載入\r\n");
                  }
                  else
                  {
                        // 如果沒有選擇資料庫,則顯示所有用戶資料庫
                        LoadDatabaseList();
                  }
                }
            }
            catch (Exception ex)
            {
                textBoxLog.AppendText("連線失敗\r\n");
                textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
                textBoxLog.AppendText("\r\n請檢查:\r\n");
                textBoxLog.AppendText("1. MySQL服務是否正在運行\r\n");
                textBoxLog.AppendText("2. 連線參數是否正確 (主機、端口、用戶名、密碼)\r\n");
                textBoxLog.AppendText("3. 用戶'root'是否有相應權限\r\n");
            }
      }

      private void Form1_Load(object sender, EventArgs e)
      {
            LoadDatabaseList();
      }

      private void LoadDatabaseList()
      {
            try
            {
                using (var conn = new MySqlConnection(connectionString))
                {
                  conn.Open();

                  // 查询所有非系统数据库
                  var cmd = new MySqlCommand(@"SELECT SCHEMA_NAME
                                                 FROM information_schema.SCHEMATA
                                                 WHERE SCHEMA_NAME NOT IN ('mysql', 'performance_schema', 'information_schema')
                                                 ORDER BY SCHEMA_NAME", conn);
                  var reader = cmd.ExecuteReader();

                  // 清空現有項目
                  comboBoxDatabase.Items.Clear();

                  // 添加資料庫到下拉選單
                  while (reader.Read())
                  {
                        comboBoxDatabase.Items.Add(reader.GetString(0));
                  }
                  reader.Close();
                  
                  textBoxLog.AppendText("資料庫列表已更新\r\n");
                }
            }
            catch (Exception ex)
            {
                textBoxLog.AppendText("載入資料庫列表失敗\r\n");
                textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
            }
      }

      private void comboBoxDatabase_SelectedIndexChanged(object sender, EventArgs e)
      {
            string selectedDatabase = comboBoxDatabase.SelectedItem.ToString();
            DisplayTablesInDatabase(selectedDatabase);
      }

      private void DisplayTablesInDatabase(string databaseName)
      {
            try
            {
                using (var conn = new MySqlConnection(connectionString))
                {
                  conn.Open();
                  // 切換到選定的資料庫
                  conn.ChangeDatabase(databaseName);
                  
                  textBoxLog.AppendText($"------------------------\r\n");
                  textBoxLog.AppendText($"資料庫 '{databaseName}' 中的資料表:\r\n");
                  
                  // 獲取該資料庫中的所有表
                  var cmd = new MySqlCommand("SHOW TABLES", conn);
                  var reader = cmd.ExecuteReader();
                  
                  // 清空現有的表列表
                  listBoxTables.Items.Clear();
                  
                  int tableCount = 0;
                  while (reader.Read())
                  {
                        listBoxTables.Items.Add(reader.GetString(0));
                        tableCount++;
                  }
                  reader.Close();
                  
                  if (tableCount == 0)
                  {
                        textBoxLog.AppendText("此資料庫中沒有資料表\r\n");
                  }
                  
                  textBoxLog.AppendText($"總計: {tableCount} 個資料表\r\n");
                }
            }
            catch (Exception ex)
            {
                textBoxLog.AppendText("載入資料表失敗\r\n");
                textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
            }
      }

      private void listBoxTables_SelectedIndexChanged(object sender, EventArgs e)
      {
            if (listBoxTables.SelectedItem != null)
            {
                string selectedTable = listBoxTables.SelectedItem.ToString();
                string selectedDatabase = comboBoxDatabase.SelectedItem.ToString();
               
                if (!string.IsNullOrEmpty(selectedDatabase))
                {
                  LoadTableData(selectedDatabase, selectedTable);
                }
            }
      }

      private void LoadTableData(string databaseName, string tableName)
      {
            try
            {
                using (var conn = new MySqlConnection(connectionString))
                {
                  conn.Open();
                  // 切換到選定的資料庫
                  conn.ChangeDatabase(databaseName);
                  
                  // 查詢表的所有數據
                  var cmd = new MySqlCommand($"SELECT * FROM `{tableName}`", conn);
                  var adapter = new MySqlDataAdapter(cmd);
                  var dataTable = new DataTable();
                  
                  textBoxLog.AppendText($"正在載入表格 '{tableName}' 的資料...\r\n");
                  
                  adapter.Fill(dataTable);
                  
                  // 將數據綁定到DataGridView,允許編輯
                  dataGridViewTableData.ReadOnly = false;
                  dataGridViewTableData.DataSource = dataTable;
                  
                  textBoxLog.AppendText($"表格 '{tableName}' 載入完成,共 {dataTable.Rows.Count} 行資料\r\n");
                }
            }
            catch (Exception ex)
            {
                textBoxLog.AppendText($"載入表格 '{tableName}' 失敗\r\n");
                textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
            }
      }

      private void btnDeleteDatabase_Click(object sender, EventArgs e)
      {
            if (comboBoxDatabase.SelectedItem != null)
            {
                string databaseToDelete = comboBoxDatabase.SelectedItem.ToString();
               
                DialogResult result = MessageBox.Show(
                  $"確定要刪除資料庫 '{databaseToDelete}' 嗎?\n此操作無法復原!",
                  "確認刪除",
                  MessageBoxButtons.YesNo,
                  MessageBoxIcon.Warning
                );
               
                if (result == DialogResult.Yes)
                {
                  try
                  {
                        using (var conn = new MySqlConnection(connectionString))
                        {
                            conn.Open();
                           
                            // 刪除資料庫
                            var cmd = new MySqlCommand($"DROP DATABASE `{databaseToDelete}`", conn);
                            cmd.ExecuteNonQuery();
                           
                            textBoxLog.AppendText($"資料庫 '{databaseToDelete}' 已刪除\r\n");
                           
                            // 重新載入資料庫列表
                            LoadDatabaseList();
                           
                            // 清空表格和數據顯示
                            listBoxTables.Items.Clear();
                            dataGridViewTableData.DataSource = null;
                        }
                  }
                  catch (Exception ex)
                  {
                        textBoxLog.AppendText($"刪除資料庫 '{databaseToDelete}' 失敗\r\n");
                        textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
                  }
                }
            }
            else
            {
                MessageBox.Show("請先選擇要刪除的資料庫", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
      }

      private void btnDeleteTable_Click(object sender, EventArgs e)
      {
            if (listBoxTables.SelectedItem != null && comboBoxDatabase.SelectedItem != null)
            {
                string tableToDelete = listBoxTables.SelectedItem.ToString();
                string databaseName = comboBoxDatabase.SelectedItem.ToString();
               
                DialogResult result = MessageBox.Show(
                  $"確定要刪除表格 '{tableToDelete}' 嗎?\n此操作無法復原!",
                  "確認刪除",
                  MessageBoxButtons.YesNo,
                  MessageBoxIcon.Warning
                );
               
                if (result == DialogResult.Yes)
                {
                  try
                  {
                        using (var conn = new MySqlConnection(connectionString))
                        {
                            conn.Open();
                            conn.ChangeDatabase(databaseName);
                           
                            // 刪除表格
                            var cmd = new MySqlCommand($"DROP TABLE `{tableToDelete}`", conn);
                            cmd.ExecuteNonQuery();
                           
                            textBoxLog.AppendText($"表格 '{tableToDelete}' 已刪除\r\n");
                           
                            // 重新載入表格列表
                            DisplayTablesInDatabase(databaseName);
                           
                            // 清空數據顯示
                            dataGridViewTableData.DataSource = null;
                        }
                  }
                  catch (Exception ex)
                  {
                        textBoxLog.AppendText($"刪除表格 '{tableToDelete}' 失敗\r\n");
                        textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
                  }
                }
            }
            else
            {
                MessageBox.Show("請先選擇要刪除的表格", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
      }

      private void btnDeleteRecord_Click(object sender, EventArgs e)
      {
            if (dataGridViewTableData.SelectedRows.Count > 0 && listBoxTables.SelectedItem != null && comboBoxDatabase.SelectedItem != null)
            {
                string tableName = listBoxTables.SelectedItem.ToString();
                string databaseName = comboBoxDatabase.SelectedItem.ToString();
               
                // 獲取選中行的主鍵值,以便構造刪除語句
                DataGridViewRow selectedRow = dataGridViewTableData.SelectedRows[0];
               
                DialogResult result = MessageBox.Show(
                  $"確定要刪除表格 '{tableName}' 中的選取記錄嗎?\n此操作無法復原!",
                  "確認刪除",
                  MessageBoxButtons.YesNo,
                  MessageBoxIcon.Warning
                );
               
                if (result == DialogResult.Yes)
                {
                  try
                  {
                        using (var conn = new MySqlConnection(connectionString))
                        {
                            conn.Open();
                            conn.ChangeDatabase(databaseName);
                           
                            // 構造 DELETE 語句 - 需要根據實際表結構構造
                            // 這裡我們先獲取主鍵列
                            var cmd = new MySqlCommand($"SHOW KEYS FROM `{tableName}` WHERE Key_name = 'PRIMARY'", conn);
                            var reader = cmd.ExecuteReader();
                           
                            string primaryKeyColumn = "";
                            if (reader.Read())
                            {
                              primaryKeyColumn = reader["Column_name"].ToString();
                            }
                            reader.Close();
                           
                            if (!string.IsNullOrEmpty(primaryKeyColumn))
                            {
                              // 獲取主鍵值
                              object primaryKeyValue = selectedRow.Cells[primaryKeyColumn].Value;
                              
                              // 執行刪除
                              var deleteCmd = new MySqlCommand($"DELETE FROM `{tableName}` WHERE `{primaryKeyColumn}` = @pkValue", conn);
                              deleteCmd.Parameters.AddWithValue("@pkValue", primaryKeyValue);
                              int rowsAffected = deleteCmd.ExecuteNonQuery();
                              
                              textBoxLog.AppendText($"已刪除 {rowsAffected} 筆記錄 from '{tableName}'\r\n");
                              
                              // 重新載入表格數據
                              LoadTableData(databaseName, tableName);
                            }
                            else
                            {
                              MessageBox.Show("無法識別主鍵,無法刪除記錄", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                  }
                  catch (Exception ex)
                  {
                        textBoxLog.AppendText($"刪除記錄失敗\r\n");
                        textBoxLog.AppendText("錯誤訊息:" + ex.Message + "\r\n");
                  }
                }
            }
            else
            {
                MessageBox.Show("請先選擇要刪除的記錄", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
      }

      private void btnConnectionSettings_Click(object sender, EventArgs e)
      {
            var connectionForm = new ConnectionSettingForm();
            connectionForm.Server = server;
            connectionForm.Port = port;
            connectionForm.Username = username;
            connectionForm.Password = password;

            if (connectionForm.ShowDialog() == DialogResult.OK)
            {
                server = connectionForm.Server;
                port = connectionForm.Port;
                username = connectionForm.Username;
                password = connectionForm.Password;

                UpdateConnectionString();
               
                textBoxLog.AppendText($"連線設定已更新: {connectionForm.ConnectionName} ({server}:{port})\r\n");
            }
      }
    }
}


頁: [1]
查看完整版本: 資料庫