ADO.NET学习摘记(1)

一、解决控制台应用程序和WinForm程序中两份mdf文件的问题:

 引用 参考资料:http://www.rupeng.com/forum/thread-11988-1-1.html

在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给学生,学生也不用将数据库文件attach。采用项目中嵌入mdf文件的方式,老师把讲课的代码发给学生,学生打开就可以运行。我在传智播客.net培训班教学中就是用的这种方式进行讲解。
在ASP.net程序中只要将mdf文件放到项目的App_Data文件夹即可,在连接字符串中使用
Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/CallCenter.mdf;Integrated Security=True;User Instance=True
做连接字符串即可。

但是在WinForm程序中,如果在项目的App_Data文件夹中新建一个mdf文件,然后用
Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/CallCenter.mdf;Integrated Security=True;User Instance=True
进行连接会提示找不到CallCenter.mdf。原来WinForm程序并不会去App_Data中找mdf文件。原来在ASP.net中DataDirectory的值是当前项目的App_Data路径,而WinForm中的DataDirectory值则是当前项目的路径,因此Winform中mdf文件不用放到App_Data中,放到项目根目录下就可以。

但是新问题随之又来了,在WinForm中用这种方式开发的时候有时候改了项目中mdf文件中的表中的数据或者表结构,运行的时候却发现运行时通过程序读取的数据或者表结构没有变,而有时调试时Insert插入的数据在这次调试的时候竟然没有了。经过研究发现,WinForm程序运行的时候连接的是bin/Debug下的mdf文件,而不是项目中的mdf文件,这是和ASP.net程序行为不同的地方。每次程序发生Build行为的时候,项目中的mdf就会覆盖bing/Debug下的mdf文件,也就是有两个mdf文件的存在,项目中的mdf相当于“源文件”。虽然可以通过修改文件的“BuildToOuput”属性来部分解决问题,但是仍然不是很完美。

有一个比较很直接的想法,就是让程序去连接项目中的mdf文件,而不是连接bin/Debug下那个。
经过查询资料找到了修改方法,在Program.cs文件Main函数最开始加入如下代码:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"/bin/Debug/")
                || dataDir.EndsWith(@"/bin/Release/"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }

原理简单分析:连接字符串中的DataDirectory的值就是通过AppDomain.CurrentDomain.SetData赋值过去的,如果当前程序的目录以"/bin/Debug/"或者"/bin/Release/"则认为它是运行在VisualStudio环境中,就取项目的目录然后赋值给DataDirectory这个key。既然是CurrentDomain.SetData,估计对于非默认AppDomain中的数据库连接代码可能会不起作用(只是猜测,没验证),这就要需要创建子AppDomain的时候再去赋值了。

上面的代码还是有一点潜在的bug的,比如正式的运行的时候exe被很杯具的放到了某个bin/Debug目录下,就会有问题,不过想想正式生产环境运行的时候肯定不会用这种AttachDbFilename方式,这种方式只存在于开发环境,因此也就睁一只眼闭一只眼了,呵呵。

二、SQL关键字摘记,在编程中误用关键字了,而又未加[]或""加以区别开的话,将让新手,困惑不知所措!因此,有必要对关键字有定了解,出现类似报错信息,加以注意,是不是误用了关键字:

在使用sql的时候,一不小心就使用到关键字,但没有加上中括号,程序使用不能运行,但又找不到错误,浪费了许多时间。这里列出所有的关键字,在使用的时候要注意。

关键字PostgreSQLSQL 99SQL 92
ABORT非保留  
ABS 非保留 
ABSOLUTE非保留保留保留
ACCESS非保留  
ACTION非保留保留保留
ADA 非保留非保留
ADD非保留保留保留
ADMIN 保留 
AFTER非保留保留 
AGGREGATE非保留保留 
ALIAS 保留 
ALL保留保留保留
ALLOCATE 保留保留
ALTER非保留保留保留
ANALYSE保留  
ANALYZE保留  
AND保留保留保留
ANY保留保留保留
ARE 保留保留
ARRAY 保留 
AS保留保留保留
ASC保留保留保留
ASENSITIVE 非保留 
ASSERTION 保留保留
ASSIGNMENT 非保留 
ASYMMETRIC 非保留 
AT非保留保留保留
ATOMIC 非保留 
AUTHORIZATION非保留保留保留
AVG 非保留保留
BACKWARD非保留  
BEFORE非保留保留 
BEGIN非保留保留保留
BETWEEN保留(可以是函数)非保留保留
BINARY保留(可以是函数)保留 
BIT非保留(不能是函数或者类型)保留保留
BITVAR 非保留 
BIT_LENGTH 非保留保留
BLOB 保留 
BOOLEAN 保留 
BOTH保留保留保留
BREADTH 保留 
BY非保留保留保留
C 非保留非保留
CACHE非保留  
CALL 保留 
CALLED 非保留 
CARDINALITY 非保留 
CASCADE非保留保留保留
CASCADED 保留保留
CASE保留保留保留
CAST保留保留保留
CATALOG 保留保留
CATALOG_NAME 非保留非保留
CHAIN非保留非保留 
CHAR非保留(不能是函数或类型)保留保留
CHARACTER非保留(不能是函数或类型)保留保留
CHARACTERISTICS非保留  
CHARACTER_LENGTH 非保留保留
CHARACTER_SET_CATALOG 非保留非保留
CHARACTER_SET_NAME 非保留非保留
CHARACTER_SET_SCHEMA 非保留非保留
CHAR_LENGTH 非保留保留
CHECK保留保留保留
CHECKED 非保留 
CHECKPOINT非保留  
CLASS 保留 
CLASS_ORIGIN 非保留非保留
CLOB 保留 
CLOSE非保留保留保留
CLUSTER非保留  
COALESCE非保留(不能是函数或者类型)非保留保留
COBOL 非保留非保留
COLLATE保留保留保留
COLLATION 保留保留
COLLATION_CATALOG 非保留非保留
COLLATION_NAME 非保留非保留
COLLATION_SCHEMA 非保留非保留
COLUMN保留保留保留
COLUMN_NAME 非保留非保留
COMMAND_FUNCTION 非保留非保留
COMMAND_FUNCTION_CODE 非保留 
COMMENT非保留  
COMMIT非保留保留保留
COMMITTED非保留非保留非保留
COMPLETION 保留 
CONDITION_NUMBER 非保留非保留
CONNECT 保留保留
CONNECTION 保留保留
CONNECTION_NAME 非保留非保留
CONSTRAINT保留保留保留
CONSTRAINTS非保留保留保留
CONSTRAINT_CATALOG 非保留非保留
CONSTRAINT_NAME 非保留非保留
CONSTRAINT_SCHEMA 非保留非保留
CONSTRUCTOR 保留 
CONTAINS 非保留 
CONTINUE 保留保留
CONVERT 非保留保留
COPY非保留  
CORRESPONDING 保留保留
COUNT 非保留保留
CREATE非保留保留保留
CREATEDB非保留  
CREATEUSER非保留  
CROSS保留(可以是函数)保留保留
CUBE 保留 
CURRENT 保留保留
CURRENT_DATE保留保留保留
CURRENT_PATH 保留 
CURRENT_ROLE 保留 
CURRENT_TIME保留保留保留
CURRENT_TIMESTAMP保留保留保留
CURRENT_USER保留保留保留
CURSOR非保留保留保留
CURSOR_NAME 非保留非保留
CYCLE非保留保留 
DATA 保留非保留
DATABASE非保留  
DATE 保留保留
DATETIME_INTERVAL_CODE 非保留非保留
DATETIME_INTERVAL_PRECISION 非保留非保留
DAY非保留保留保留
DEALLOCATE 保留保留
DEC非保留(不能是函数或者类型)保留保留
DECIMAL非保留(不能是函数或者类型)保留保留
DECLARE非保留保留保留
DEFAULT保留保留保留
DEFERRABLE保留保留保留
DEFERRED非保留保留保留
DEFINED 非保留 
DEFINER 非保留 
DELETE非保留保留保留
DELIMITERS非保留  
DEPTH 保留 
DEREF 保留 
DESC保留保留保留
DESCRIBE 保留保留
DESCRIPTOR 保留保留
DESTROY 保留 
DESTRUCTOR 保留 
DETERMINISTIC 保留 
DIAGNOSTICS 保留保留
DICTIONARY 保留 
DISCONNECT 保留保留
DISPATCH 非保留 
DISTINCT保留保留保留
DO保留  
DOMAIN 保留保留
DOUBLE非保留保留保留
DROP非保留保留保留
DYNAMIC 保留 
DYNAMIC_FUNCTION 非保留非保留
DYNAMIC_FUNCTION_CODE 非保留 
EACH非保留保留 
ELSE保留保留保留
ENCODING非保留  
ENCRYPTED非保留  
END保留保留保留
END-EXEC 保留保留
EQUALS 保留 
ESCAPE非保留保留保留
EVERY 保留 
EXCEPT保留保留保留
EXCEPTION 保留保留
EXCLUSIVE非保留  
EXEC 保留保留
EXECUTE非保留保留保留
EXISTING 非保留 
EXISTS非保留(不能是函数或类型)非保留保留
EXPLAIN非保留  
EXTERNAL 保留保留
EXTRACT非保留(不能是函数或类型)非保留保留
FALSE保留保留保留
FETCH非保留保留保留
FINAL 非保留 
FIRST 保留保留
FLOAT非保留(不能是函数或类型)保留保留
FOR保留保留保留
FORCE非保留  
FOREIGN保留保留保留
FORTRAN 非保留非保留
FORWARD非保留  
FOUND 保留保留
FREE 保留 
FREEZE非保留(可以是函数)  
FROM保留保留保留
FULL保留(可以是函数)保留保留
FUNCTION非保留保留 
G 非保留 
GENERAL 保留 
GENERATED 非保留 
GET 保留保留
GLOBAL非保留保留保留
GO 保留保留
GOTO 保留保留
GRANT非保留保留保留
GRANTED 非保留 
GROUP保留保留保留
GROUPING 保留 
HANDLER非保留  
HAVING保留保留保留
HIERARCHY 非保留 
HOLD 非保留 
HOST 保留 
HOUR非保留保留保留
IDENTITY 保留保留
IGNORE 保留 
ILIKE保留(可以是函数)  
IMMEDIATE非保留保留保留
IMPLEMENTATION 非保留 
IN保留(可以是函数)保留保留
INCREMENT非保留  
INDEX非保留  
INDICATOR 保留保留
INFIX 非保留 
INHERITS非保留  
INITIALIZE 保留 
INITIALLY保留保留保留
INNER保留(可以是函数)保留保留
INOUT非保留保留 
INPUT 保留保留
INSENSITIVE非保留非保留保留
INSERT非保留保留保留
INSTANCE 非保留 
INSTANTIABLE 非保留 
INSTEAD非保留  
INT 保留保留
INTEGER 保留保留
INTERSECT保留保留保留
INTERVAL非保留(不能是函数或类型)保留保留
INTO保留保留保留
INVOKER 非保留 
IS保留(可以是函数)保留保留
ISNULL保留(可以是函数)  
ISOLATION非保留保留保留
ITERATE 保留 
JOIN保留(可以是函数)保留保留
K 非保留 
KEY非保留保留保留
KEY_MEMBER 非保留 
KEY_TYPE 非保留 
LANCOMPILER非保留  
LANGUAGE非保留保留保留
LARGE 保留 
LAST 保留保留
LATERAL 保留 
LEADING保留保留保留
LEFT保留(可以是函数)保留保留
LENGTH 非保留非保留
LESS 保留 
LEVEL非保留保留保留
LIKE保留(可以是函数)保留保留
LIMIT保留保留 
LISTEN非保留  
LOAD非保留  
LOCAL非保留保留保留
LOCALTIME 保留 
LOCALTIMESTAMP 保留 
LOCATION非保留  
LOCATOR 保留 
LOCK非保留  
LOWER 非保留保留
M 非保留 
MAP 保留 
MATCH非保留保留保留
MAX 非保留保留
MAXVALUE非保留  
MESSAGE_LENGTH 非保留非保留
MESSAGE_OCTET_LENGTH 非保留非保留
MESSAGE_TEXT 非保留非保留
METHOD 非保留 
MIN 非保留保留
MINUTE非保留保留保留
MINVALUE非保留  
MOD 非保留 
MODE非保留  
MODIFIES 保留 
MODIFY 保留 
MODULE 保留保留
MONTH非保留保留保留
MORE 非保留非保留
MOVE非保留  
MUMPS 非保留非保留
NAME 非保留非保留
NAMES非保留保留保留
NATIONAL非保留保留保留
NATURAL保留(可以是函数)保留保留
NCHAR非保留(不能是函数或类型)保留保留
NCLOB 保留 
NEW保留保留 
NEXT非保留保留保留
NO非保留保留保留
NOCREATEDB非保留  
NOCREATEUSER非保留  
NONE非保留(不能是函数或类型)保留 
NOT保留保留保留
NOTHING非保留  
NOTIFY非保留  
NOTNULL保留(可以是函数)  
NULL保留保留保留
NULLABLE 非保留非保留
NULLIF非保留(不能是函数或类型)非保留保留
NUMBER 非保留非保留
NUMERIC非保留(不能是函数或类型)保留保留
OBJECT 保留 
OCTET_LENGTH 非保留保留
OF非保留保留保留
OFF保留保留 
OFFSET保留  
OIDS非保留  
OLD保留保留 
ON保留保留保留
ONLY保留保留保留
OPEN 保留保留
OPERATION 保留 
OPERATOR非保留  
OPTION非保留保留保留
OPTIONS 非保留 
OR保留保留保留
ORDER保留保留保留
ORDINALITY 保留 
OUT非保留保留 
OUTER保留(可以是函数)保留保留
OUTPUT 保留保留
OVERLAPS保留(可以是函数)非保留保留
OVERLAY 非保留 
OVERRIDING 非保留 
OWNER非保留  
PAD 保留保留
PARAMETER 保留 
PARAMETERS 保留 
PARAMETER_MODE 非保留 
PARAMETER_NAME 非保留 
PARAMETER_ORDINAL_POSITION 非保留 
PARAMETER_SPECIFIC_CATALOG 非保留 
PARAMETER_SPECIFIC_NAME 非保留 
PARAMETER_SPECIFIC_SCHEMA 非保留 
PARTIAL非保留保留保留
PASCAL 非保留非保留
PASSWORD非保留  
PATH非保留保留 
PENDANT非保留  
PLI 非保留非保留
POSITION非保留(不能是函数或类型)非保留保留
POSTFIX 保留 
PRECISION非保留保留保留
PREFIX 保留 
PREORDER 保留 
PREPARE 保留保留
PRESERVE 保留保留
PRIMARY保留保留保留
PRIOR非保留保留保留
PRIVILEGES非保留保留保留
PROCEDURAL非保留  
PROCEDURE非保留保留保留
PUBLIC保留(可以是函数)保留保留
READ非保留保留保留
READS 保留 
REAL 保留保留
RECURSIVE 保留 
REF 保留 
REFERENCES保留保留保留
REFERENCING 保留 
REINDEX非保留  
RELATIVE非保留保留保留
RENAME非保留  
REPEATABLE 非保留非保留
REPLACE非保留  
RESET非保留  
RESTRICT非保留保留保留
RESULT 保留 
RETURN 保留 
RETURNED_LENGTH 非保留非保留
RETURNED_OCTET_LENGTH 非保留非保留
RETURNED_SQLSTATE 非保留非保留
RETURNS非保留保留 
REVOKE非保留保留保留
RIGHT保留(可以是函数)保留保留
ROLE 保留 
ROLLBACK非保留保留保留
ROLLUP 保留 
ROUTINE 保留 
ROUTINE_CATALOG 非保留 
ROUTINE_NAME 非保留 
ROUTINE_SCHEMA 非保留 
ROW非保留保留 
ROWS 保留保留
ROW_COUNT 非保留非保留
RULE非保留  
SAVEPOINT 保留 
SCALE 非保留非保留
SCHEMA非保留保留保留
SCHEMA_NAME 非保留非保留
SCOPE 保留 
SCROLL非保留保留保留
SEARCH 保留 
SECOND非保留保留保留
SECTION 保留保留
SECURITY 非保留 
SELECT保留保留保留
SELF 非保留 
SENSITIVE 非保留 
SEQUENCE非保留保留 
SERIALIZABLE非保留非保留非保留
SERVER_NAME 非保留非保留
SESSION非保留保留保留
SESSION_USER保留保留保留
SET非保留保留保留
SETOF非保留(不能是函数或类型)  
SETS 保留 
SHARE非保留  
SHOW非保留  
SIMILAR 非保留 
SIMPLE 非保留 
SIZE 保留保留
SMALLINT 保留保留
SOME保留保留保留
SOURCE 非保留 
SPACE 保留保留
SPECIFIC 保留 
SPECIFICTYPE 保留 
SPECIFIC_NAME 非保留 
SQL 保留保留
SQLCODE  保留
SQLERROR  保留
SQLEXCEPTION 保留 
SQLSTATE 保留保留
SQLWARNING 保留 
START非保留保留 
STATE 保留 
STATEMENT非保留保留 
STATIC 保留 
STATISTICS非保留  
STDIN非保留  
STDOUT非保留  
STRUCTURE 保留 
STYLE 非保留 
SUBCLASS_ORIGIN 非保留非保留
SUBLIST 非保留 
SUBSTRING非保留(不能是函数或类型)非保留保留
SUM 非保留保留
SYMMETRIC 非保留 
SYSID非保留  
SYSTEM 非保留 
SYSTEM_USER 保留保留
TABLE保留保留保留
TABLE_NAME 非保留非保留
TEMP非保留  
TEMPLATE非保留  
TEMPORARY非保留保留保留
TERMINATE 保留 
THAN 保留 
THEN保留保留保留
TIME非保留(不能是函数或类型)保留保留
TIMESTAMP非保留(不能是函数或类型)保留保留
TIMEZONE_HOUR 保留保留
TIMEZONE_MINUTE 保留保留
TO保留保留保留
TOAST非保留  
TRAILING保留保留保留
TRANSACTION非保留保留保留
TRANSACTIONS_COMMITTED 非保留 
TRANSACTIONS_ROLLED_BACK 非保留 
TRANSACTION_ACTIVE 非保留 
TRANSFORM 非保留 
TRANSFORMS 非保留 
TRANSLATE 非保留保留
TRANSLATION 保留保留
TREAT 保留 
TRIGGER非保留保留 
TRIGGER_CATALOG 非保留 
TRIGGER_NAME 非保留 
TRIGGER_SCHEMA 非保留 
TRIM非保留(不能是函数或类型)非保留保留
TRUE保留保留保留
TRUNCATE非保留  
TRUSTED非保留  
TYPE非保留非保留非保留
UNCOMMITTED 非保留非保留
UNDER 保留 
UNENCRYPTED非保留  
UNION保留保留保留
UNIQUE保留保留保留
UNKNOWN非保留保留保留
UNLISTEN非保留  
UNNAMED 非保留非保留
UNNEST 保留 
UNTIL非保留  
UPDATE非保留保留保留
UPPER 非保留保留
USAGE 保留保留
USER保留保留保留
USER_DEFINED_TYPE_CATALOG 非保留 
USER_DEFINED_TYPE_NAME 非保留 
USER_DEFINED_TYPE_SCHEMA 非保留 
USING保留保留保留
VACUUM非保留  
VALID非保留  
VALUE 保留保留
VALUES非保留保留保留
VARCHAR非保留(不能是函数或类型)保留保留
VARIABLE 保留 
VARYING非保留保留保留
VERBOSE保留(可以是函数)  
VERSION非保留  
VIEW非保留保留保留
WHEN保留保留保留
WHENEVER 保留保留
WHERE保留保留保留
WITH非保留保留保留
WITHOUT非保留保留 
WORK非保留保留保留
WRITE 保留保留
YEAR非保留保留保留
ZONE非保留保留保留

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值