查看: 438|回復: 0

[閒聊閒語] 資料庫

[複製鏈接]

71

主題

267

帖子

5707

金錢

火焰之影

Rank: 8Rank: 8

威望
247
精華
0
貢獻
0
鑽石
0
閱讀權限
50
積分
6468
在線時間
110 小時
相冊
0
日誌
0
好友
0
發表於 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");
            }
        }
    }
}






上一篇︰0102搖一搖
下一篇︰Form1
您需要登錄後才可以回帖 登錄 | 註冊會員

本版積分規則

天堂私服列表

45客服

Archiver| 45天堂私服論壇   分享到微博! 分享到臉書! 分享到噗浪! 分享到維特! 分享到Google+! 分享到LINE!

45天堂私服發佈站 ©    天堂私服架設教學  提供最新天堂私服最新資訊

流量最高、品質最好、服務最優、玩家首選、最新天堂私服資訊,都在45天堂私服發佈站.    免責聲明

Sitetag
line客服聯繫
掃一掃二碼
Line客服聯繫
24H專人回覆
返回頂部 返回列表