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

C# ExecuteNonQuery 返回 1 但資料庫未更新:檢查資料庫使用者寫入權限

     編輯:程式設計綜合問答

現象

  • 程式碼執行 `ExecuteNonQuery` 回傳 `1` (影響 1 列)。
  • 查詢操作正常,但 `INSERT`/`UPDATE`/`DELETE` **資料庫實際未變更**。
  • 無例外拋出。

核心原因

**資料庫連線使用者帳號僅具備 `SELECT` 權限,缺乏 `INSERT`/`UPDATE`/`DELETE` 權限。**

  • ADO.NET `ExecuteNonQuery` 回傳「受影響列數」由伺服器回報。
  • 若觸發器 (`INSTEAD OF TRIGGER`) 截獲操作並不實際寫入,仍可能回傳 >0。
  • 若為權限不足,SQL Server 通常拋出例外,**但某些情境 (如透過視圖、觸發器、權限模糊) 可能靜默失敗**。

排查步驟

  1. **SSMS 以相同帳號登入**,手動執行 `INSERT` 語句,觀察是否報錯或成功。
  2. 檢查使用者權限:
    SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
  3. 確認連線字串 `Integrated Security=True` (Windows 驗證) 或 SQL 帳號密碼正確。
  4. 檢查是否有 `INSTEAD OF INSERT` 觸發器攔截並忽略操作。
  5. 啟用 SQL Profiler / Extended Events 追蹤實際執行的 SQL 與錯誤。

修正

授予該使用者 `db_datawriter` 角色或明確 `GRANT INSERT, UPDATE, DELETE ON table TO user;`。

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