首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# Access 唯一索引 + Try Catch 實現用戶名重複檢測

     編輯:程式設計疑難解答

最佳實務:資料庫層面約束 + 例外處理

1. 建立資料表時設定唯一索引

CREATE TABLE Users (
    UserID AUTOINCREMENT PRIMARY KEY,
    Username TEXT(50) NOT NULL UNIQUE,  -- 唯一約束
    Password TEXT(100) NOT NULL,
    Email TEXT(100)
);

或在 Access 設計檢視 → 「索引」視窗 → 新增索引名稱「UsernameIndex」→ 欄位「Username」→ 唯一:「是」。

2. C# 註冊邏輯

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
        }
    }
}

Access 常見錯誤代碼對照

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...

安全性補充

  • **密碼必須雜湊**:使用 BCrypt / PBKDF2 / Argon2,絕不儲存明文。
  • **參數化查詢**:防止 SQL Injection,Access 同樣支援 ? 佔位符。
  • **連線字串**:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\db.accdb;Persist Security Info=False;

總結

Access 判斷用戶名重複:**資料表欄位加 UNIQUE 索引** + **C# 捕捉 OleDbException ErrorCode -2147217873**。此法併發安全、效能最佳、程式碼最簡潔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved