小议Access与MS SQL的差别
这段时间没有什么项目做比较闲,但隔三岔五的老板又会安排我做点小事情,总是静不下心来认真学习。想了想,算了学习理论知识还不如尝试去点做没有以前接触过的东西,这样即学了知识又长了经验,一举两得。
前几个月我女朋友老是唠叨钱不知道用到哪里去了,我自己也这么认为。感觉没有怎么花钱,但钱又不知不觉没了,于是我想了个办法去整个记账软件把每天的开支及收入都一一记录下来,以后就有据可依啦!用那个记账软件用了段日子,说实话弄的挺好的,尤其是报表统计那块非常的棒,直到有天软件突然弹出提示“您的试用期限已到,请注册”。都怪自己没有看清楚,我还以为是共享版的呢,自己又不愿意花钱去注册(我想搞软件的人都不愿意吧,当然我绝对支持正版哈),就想自己琢磨着设计一套出来。正好现在可支配的时间比较充裕,虽然我之前没有做过Winform的程序,但是我觉得整套小的个人记账软件应该不是问题吧,更何况我有一个很好的帮手,我女朋友是做Winform软件的,嘿嘿。
说干就干,花了点时间来分析之前使用的那套软件,再加了点我们自己的需求,开始啦!为了便于维护我采用的是工厂模式来设计,该有的都有。数据库用的是Access,不用安装数据库服务端,方便。我想没有哪个会用MS SQL或其它需要安装服务段的数据库来做数据容器吧,要是你拿去卖的话估计一套都卖不了。在制作的过程中遇到了很多纳闷的问题,比如插入数据失败(非常简单的数据插入),我跟踪来跟踪去总是找不出原因,查看SQL语句又都是对,我整了很长的时间都没有解决。后来跟同事交流了会,他估计了下原因,可能是我Access中字段的问题。我之前用MS SQL时都有一套我自己认为比较合理的字段命名规范,难道在Access中就不行。于是我就轮流把字段名该了下,经测试真的是字段名的问题,我的用户表中密码字段用的是“PassWord”,我把它改成“PWD”之后马上就能正常运行了。在网上查了下看是怎么回事,原来“PassWord”是Access中的保留关键字不能使用,但是MS SQL中也有关键字啊,我以前怎么从来就没有遇到过类似的问题,难道是Access智能型不够强?
为了不让大家犯同样的错误,我把Access的关键字列出来,朋友们多多注意哈。
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
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
YES
YESNO
另外一个问题就是,Access中的数据类型没有MS SQL中的那么全,习惯了用MS SQL在使用Access时经常会出现数据类型的错误。Access中时间类型字段在C#中是被定义为string类型的,刚刚我就出现了这样的问题,我在给一条SQL语句中时间类型的参数设置DBType时就报错了,因为我把它设置为DateTime类型。同样又花了我很长时间来找错误,郁闷,后来把它设为string类型就成功啦!
总之Access和MS SQL还是有一定差别的,除了上面所讲的两方面还有其它不同的地方,比如一些内置函数、SQL语句的差别。要是以后所有的数据库都有一套标准就好了,所有数据库厂商都必须遵循该标准,到时候学会了其中一种比较流行的数据库,其它的也就触类旁通了,再也不用花很多心思去学什么Oracle、DB2、MySql等不同的数据库,只是学习下各个数据库软件操作方法就行,在转移数据库时也不会存在不兼容的问题。