CREATE TABLE Users (
UserID AUTOINCREMENT PRIMARY KEY,
Username TEXT(50) NOT NULL UNIQUE, -- 唯一約束
Password TEXT(100) NOT NULL,
Email TEXT(100)
);
或在 Access 設計檢視 → 「索引」視窗 → 新增索引名稱「UsernameIndex」→ 欄位「Username」→ 唯一:「是」。
public bool RegisterUser(string username, string password, string email) {
const string sql = "INSERT INTO Users (Username, Password, Email) VALUES (?, ?, ?)";
using (var conn = new OleDbConnection(connStr))
using (var cmd = new OleDbCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@Username", username);
cmd.Parameters.AddWithValue("@Password", HashPassword(password)); // 必須加密
cmd.Parameters.AddWithValue("@Email", email);
try {
conn.Open();
int rows = cmd.ExecuteNonQuery();
return rows > 0;
} catch (OleDbException ex) when (ex.ErrorCode == -2147217873) { // 0x80040E2F: 重複索引
// Access 重複索引錯誤代碼
return false; // 或拋出自訂例外 UserAlreadyExistsException
}
}
}
| ErrorCode (十六進位) | 十進位 | 含義 |
|---|---|---|
| 0x80040E2F | -2147217873 | 索引/主鍵重複 (唯一約束違反) |
| 0x80040E14 | -2147217900 | 語法錯誤 / 欄位不存在 |
| 0x80004005 | -2147467259 | 未指定錯誤 (常見於連線字串錯誤、檔案鎖定) |
// 缺點:檢查與插入之間有時間窗,高併發下仍可能重複
string checkSql = "SELECT COUNT(*) FROM Users WHERE Username = ?";
cmd.CommandText = checkSql;
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Username", username);
conn.Open();
int count = (int)cmd.ExecuteScalar();
if (count > 0) return false;
// 再執行 INSERT...
? 佔位符。Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\db.accdb;Persist Security Info=False;Access 判斷用戶名重複:**資料表欄位加 UNIQUE 索引** + **C# 捕捉 OleDbException ErrorCode -2147217873**。此法併發安全、效能最佳、程式碼最簡潔。