原代碼存在硬編碼 SQL、未參數化、變量未定義等問題。以下為規範重寫版。
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace StudentApp {
public partial class Form1 : Form {
private const string ConnStr = "Server=(local);Integrated Security=SSPI;Database=student";
public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) {
using (SqlConnection conn = new SqlConnection(ConnStr)) {
try {
conn.Open();
MessageBox.Show("連接成功!");
// 參數化查詢,防注入
string sql = "SELECT StudentID, StudentName, Age FROM Students";
using (SqlCommand cmd = new SqlCommand(sql, conn))
using (SqlDataReader dr = cmd.ExecuteReader()) {
while (dr.Read()) {
// 輸出到 ListBox 或 DataGridView,而非 Console
string info = $"{dr["StudentID"]}\t{dr["StudentName"]}\t{dr["Age"]}";
listBox1.Items.Add(info); // 假設界面有 listBox1
}
}
} catch (Exception ex) {
MessageBox.Show("錯誤: " + ex.Message);
}
}
}
}
}
SqlConnection/SqlCommand/SqlDataReader,防洩漏。WHERE Name = @name,用 cmd.Parameters.AddWithValue("@name", txtName.Text)。try-catch 友好提示,不讓程序崩潰。ListBox/DataGridView/BindingSource,而非 Console.WriteLine。app.config <connectionStrings>。<connectionStrings>
<add name="StudentDB" connectionString="Server=(local);Database=student;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
代碼中讀取:ConfigurationManager.ConnectionStrings["StudentDB"].ConnectionString。
遵循 ADO.NET 最佳實踐,代碼健壯、安全、可維護。