SQL Server 建表語法範例
CREATE TABLE [Products] (
[Id] INT IDENTITY(1,1) PRIMARY KEY,
[Name] NVARCHAR(100) NOT NULL,
[Description] NTEXT NULL,
[CreatedDate] DATETIME NOT NULL DEFAULT GETDATE(),
[Price] MONEY NULL,
[Stock] INT NOT NULL DEFAULT 0,
[Rating] DECIMAL(3,2) NOT NULL DEFAULT 0,
[Image] VARBINARY(MAX) NULL
);
常用 DDL 操作
| 操作 | SQL 範例 |
| 刪除資料表 | DROP TABLE [Products]; |
| 新增欄位 | ALTER TABLE [Products] ADD [CategoryId] INT NULL; |
| 刪除欄位 | ALTER TABLE [Products] DROP COLUMN [CategoryId]; |
| 修改欄位 | ALTER TABLE [Products] ALTER COLUMN [Name] NVARCHAR(200) NOT NULL; |
| 重命名資料表 | EXEC sp_rename 'Products', 'Items'; |
| 新增預設值 | ALTER TABLE [Products] ADD CONSTRAINT DF_Products_Stock DEFAULT 0 FOR [Stock]; |
| 刪除預設值 | ALTER TABLE [Products] DROP CONSTRAINT DF_Products_Stock; |
| 新增檢查約束 | ALTER TABLE [Products] ADD CONSTRAINT CK_Products_Price CHECK ([Price] >= 0); |
| 刪除約束 | ALTER TABLE [Products] DROP CONSTRAINT CK_Products_Price; |
基本 CRUD 參數化查詢 (防 SQL Injection)
using (var conn = new SqlConnection(connStr))
using (var cmd = conn.CreateCommand())
{
conn.Open();
// INSERT
cmd.CommandText = "INSERT INTO Products (Name, Price, Stock) VALUES (@Name, @Price, @Stock); SELECT SCOPE_IDENTITY();";
cmd.Parameters.AddWithValue("@Name", "筆記型電腦");
cmd.Parameters.AddWithValue("@Price", 25000m);
cmd.Parameters.AddWithValue("@Stock", 10);
int newId = Convert.ToInt32(cmd.ExecuteScalar());
// SELECT
cmd.CommandText = "SELECT Id, Name, Price FROM Products WHERE Stock > @MinStock";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@MinStock", 5);
using (var reader = cmd.ExecuteReader())
while (reader.Read()) Console.WriteLine($"{reader[0]}: {reader[1]} - {reader[2]:C}");
// UPDATE
cmd.CommandText = "UPDATE Products SET Price = @Price WHERE Id = @Id";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Price", 23000m);
cmd.Parameters.AddWithValue("@Id", newId);
cmd.ExecuteNonQuery();
// DELETE
cmd.CommandText = "DELETE FROM Products WHERE Id = @Id";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Id", newId);
cmd.ExecuteNonQuery();
}
ADO.NET 核心物件速查
| 物件 | 用途 | 關鍵方法 |
| SqlConnection | 資料庫連線 | Open(), Close(), State |
| SqlCommand | 執行 SQL/預存程序 | ExecuteReader(), ExecuteScalar(), ExecuteNonQuery() |
| SqlDataReader | 唯讀、前向資料流 | Read(), GetInt32(), GetString(), [ordinal] |
| SqlDataAdapter | 橋接 DataSet 與資料庫 | Fill(), Update() |
| DataSet / DataTable | 離線資料集 | Tables, Rows, Columns, AcceptChanges() |
| SqlParameter | 參數化查詢 | ParameterName, Value, SqlDbType, Direction |
最佳實踐提醒
- 永遠使用參數化查詢,絕不拼接字串。
- using 區塊確保連線/命令/讀取器正確釋放。
- 連線字串存放於設定檔 (
appsettings.json),勿硬編碼。
- 大量資料操作考慮
SqlBulkCopy 或 Table-Valued Parameters。
- 現代專案建議:使用 Entity Framework Core / Dapper 等 ORM/Micro-ORM,減少樣板碼、強型別、支援 LINQ、遷移管理。