 |
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");
}
}
}
}
| |