首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Access vs SQL Server:個人記帳軟體開發實錄中的 5 大坑與避雷指南

     編輯:關於SqlServer

專案背景

開發 WinForms 個人記帳軟體,初期為免安裝資料庫服務選用 **Access (ACE/Jet)** 做本地儲存。開發過程踩中多個與 SQL Server 差異導致的坑,記錄於此供參考。

坑 1:保留關鍵字導致 INSERT 失敗 (最隱蔽)

現象:簡單 INSERT INTO Users (PassWord) VALUES ('123') 執行無錯誤但資料未寫入 / 拋出語法錯誤。
原因:PassWord 是 **Access 保留關鍵字** (Jet 4.0/ACE)。SQL Server 允許用方括號 [PassWord] 逸出,Access **若未加方括號直接報錯/失效**。
解決**:所有 DDL/DML **一律用方括號包裹識別碼** [PassWord],或改名 Pwd / UserPassword。

Access 常見保留關鍵字節錄 (完整清單見文末)

PASSWORDUSERGROUPLEVELKEYINDEXORDERDATETIMEYEARMONTHDAY
SELECTINSERTUPDATEDELETECREATEDROPTABLEVIEWPROCEDUREFUNCTIONTRIGGERCONSTRAINT
IDENTITYAUTOINCREMENTCOUNTERMEMOOLEOBJECTBINARYTEXTNOTELONGSHORTSINGLEDOUBLE

建議**:開發時開啟 ANSI_QUOTES 相容模式或統一用方括號,命名避開上述詞彙。

坑 2:日期時間型別在 C# 中對應差異

資料庫型別SQL Server 對應 .NET 型別Access (OleDb) 對應 .NET 型別
DATETIME / SMALLDATETIMEDateTime (DbType.DateTime)DateTime **但參數必須指定 DbType.DateTime**
DATE (Access 無此型別)DateTime / DateOnly (.NET 6+)無
TIMESTAMP (Rowversion)Byte[]無

實踐踩坑**:用 OleDbParameter 設 DbType.DateTime 傳入 DateTime.Now 卻報型別不匹配。
**根因**:Access OleDb 提供者對參數型別推斷極嚴格,需顯式指定 OleDbType.DBTimeStamp 或確保 Value 為 DateTime 非 String。

// 正確寫法
cmd.Parameters.Add("@dt", OleDbType.DBTimeStamp).Value = DateTime.Now;
// 或
var p = cmd.Parameters.Add("@dt", OleDbType.Date);
p.Value = DateTime.Today; // 僅日期

坑 3:自動編號 (Identity/AutoNumber) 種子與步長設定

操作SQL ServerAccess (Jet/ACE)
建表指定種子/步長ID INT IDENTITY(1000,10)ID COUNTER (1000, 10) 或 AUTOINCREMENT (1000, 10)
事後修改種子/步長DBCC CHECKIDENT ('Table', RESEED, 2000)ALTER TABLE Table ALTER COLUMN ID COUNTER (2000, 50)
重置從 1 開始DBCC CHECKIDENT ('Table', RESEED, 0)ALTER TABLE Table ALTER COLUMN ID COUNTER (1, 1)

警告**:Access 修改 COUNTER **不檢查唯一性**,若表內已有資料極易產生重複主鍵,**務必先備份、清空表或設為主鍵/唯一索引強制檢查**。

坑 4:SQL 語法與函數差異速查

功能SQL Server (T-SQL)Access (Jet/ACE SQL)
取前 N 筆SELECT TOP (10) * FROM TSELECT TOP 10 * FROM T (無括號)
字串串接+ 或 CONCAT()& (如 "A" & "B")
當前日期GETDATE() / SYSDATETIME()NOW() / DATE()
條件判斷CASE WHEN ... THEN ... ELSE ... ENDIIF(cond, trueVal, falseVal) 或 SWITCH
參數化查詢佔位符@ParamName? (位置參數,順序必須對應)
LIMIT/OFFSETOFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY (2012+)**不支援**,需用子查詢 TOP 模擬

坑 5:部署與連接字串

  • Access**:需目標機安裝 **Microsoft Access Database Engine** (32/64 位元對應應用程式編譯目標)。連接字串:
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\App.mdb;Persist Security Info=False;
  • SQL Server Express / LocalDB**:免安裝完整版,支援 AttachDbFilename 掛載 .mdf。連接字串:
    Server=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\App.mdf;Integrated Security=True;

總結:如何選擇?

場景推薦理由
單機、單用戶、< 100MB、免安裝、簡單 CRUDAccess / SQLite零配置、檔案即資料庫、複製即備份
多用戶並發、> 100MB、需備份/還原/複寫/安全性/預存程序SQL Server Express / LocalDB / PostgreSQL真正的伺服器架構、ACID、鎖管理、擴展性
跨平台、.NET Core / 容器化、開源生態PostgreSQL / SQLiteLinux 友善、功能強大、無授權成本

附錄:Access 保留關鍵字完整分類清單 (供搜尋參考)

A: ADD, ALL, ALPHANUMERIC, ALTER, AND, ANY, APPLICATION, AS, ASC, ASSISTANT, AUTOINCREMENT, AVG
B: BETWEEN, BINARY, BIT, BOOLEAN, BY, BYTE
C: CHAR, CHARACTER, COLUMN, COMPACTDATABASE, CONSTRAINT, CONTAINER, COUNT, COUNTER, CREATE, CREATEDATABASE, CREATEFIELD, CREATEGROUP, CREATEINDEX, CREATEOBJECT, CREATEPROPERTY, CREATERELATION, CREATETABLEDEF, CREATEUSER, CREATEWORKSPACE, CURRENCY, CURRENTUSER
D: DATABASE, DATE, DATETIME, DELETE, DESC, DESCRIPTION, DISALLOW, DISTINCT, DISTINCTROW, DOCUMENT, DOUBLE, DROP
E: ECHO, ELSE, END, EQV, ERROR, EXISTS, EXIT
F: FALSE, FIELD, FIELDS, FILLCACHE, FLOAT, FLOAT4, FLOAT8, FOREIGN, FORM, FORMS, FROM, FULL, FUNCTION
G: GENERAL, GETOBJECT, GETOPTION, GOTOPAGE, GROUP, GROUP BY, GUID
H: HAVING
I: IDLE, IEEEDOUBLE, IEEESINGLE, IF, IGNORE, IMP, IN, INDEX, INDEXES, INNER, INSERT, INSERTTEXT, INT, INTEGER, INTEGER1, INTEGER2, INTEGER4, INTO, IS
J: JOIN
K: KEY
L: LASTMODIFIED, LEFT, LEVEL, LIKE, LOGICAL, LOGICAL1, LONG, LONGBINARY, LONGTEXT
M: MACRO, MATCH, MAX, MIN, MOD, MEMO, MODULE, MONEY, MOVE
N: NAME, NEWPASSWORD, NO, NOT, NOTE, NULL, NUMBER, NUMERIC
O: OBJECT, OLEOBJECT, OFF, ON, OPENRECORDSET, OPTION, OR, ORDER, ORIENTATION, OUTER, OWNERACCESS
P: PARAMETER, PARAMETERS, PARTIAL, PERCENT, PIVOT, PRIMARY, PROCEDURE, PROPERTY
Q: QUERIES, QUERY, QUIT
R: REAL, RECALC, RECORDSET, REFERENCES, REFRESH, REFRESHLINK, REGISTERDATABASE, RELATION, REPAINT, REPAIRDATABASE, REPORT, REPORTS, REQUERY, RIGHT
S: SCREEN, SECTION, SELECT, SET, SETFOCUS, SETOPTION, SHORT, SINGLE, SMALLINT, SOME, SQL, STDEV, STDEVP, STRING, SUM
T: TABLE, TABLEDEF, TABLEDEFS, TABLEID, TEXT, TIME, TIMESTAMP, TOP, TRANSFORM, TRUE, TYPE
U: UNION, UNIQUE, UPDATE, USER
V: VALUE, VALUES, VAR, VARP, VARBINARY, VARCHAR
W: WHERE, WITH, WORKSPACE
X: XOR
Y: YEAR
Z: YES, YESNO

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