7月17日 星期五 天气晴
实习两个星期了。感觉自己对C#的了解有了一定程度的进步,但是编码还是不够熟练,模块完成的速度不快,看来还是要努力才行。
ps: 我要把握自己的幸福啊。可是现在只能等待天使的calling。等吧等吧。愿意等你一生一世。
今天要做什么呢?
首先,把数据库导出成Access文件那一块完成了。然后去看看上传,下载的那一块怎么弄。再然后去把删除的做完。记得一定是要在本地数据库上面操作才好。如果这些都做完还剩时间,那就自己先测试一下吧,感觉Bug还是挺多的。要抓紧时间总结。
10:27-----遇到问题:在database.Tables.append(table)语句中,返回一个COMException,提示是类型无效。
原因是提供程序可以接受的表中的列仅识别的数据类型。 每个提供程序是不同和特定顺序存储的数据库格式。
adBinary | 128 | 是 | 是 | 是 |
adBoolean | 11 | 是 | 是 | 是 |
adChar | 129 来 | 是 | 否 | 是 |
adCurrency | 6 | 是 | 是 | 是 |
adDate | 7 | 是 | 是 | 否 |
adDouble | 5 | 是 | 是 | 是 |
adGUID | 72 | 是 | 是 | 是 |
adInteger | 3 | 是 | 是 | 是 |
adLongVarBinary | 205 | 是 | 是 | 是 |
adLongVarChar | 201 已 | 是 | 否 | 是 |
adLongVarWChar | 203 | 否 | 是 | 是 |
adNumeric | 131 | 否 | 是 (使用信息) * | 是 (使用信息) * |
adSingle | 4 | 是 | 是 | 是 |
adSmallInt | 2 | 是 | 是 | 是 |
adUnsignedTinyInt | 17 | 是 | 是 | 是 |
adVarBinary | 204 | 是 | 是 | 是 |
adVarChar | 200 | 是 | 否 | 是 |
adVarWChar | 202 | 否 | 是 | 是 |
adWChar | 130 | 否 | 是 | 是 |
adDBTimeStamp | 135 | 否 | 否 | 是 |
* 如果您使用 adNumeric 数据类型 Microsoft Jet 4.0 和 Microsoft SQL Server 7.0,必须设置精度。
所以不能使用adVarChar,要使用adVarWChar。恩。改了就对了。
11:34----------看看ADO.NET。看来对C#的了解真的是一张白纸,啥也不知道。不过用了就要知道了。
-----------------------------------------------------------------------------------------------------------------------------------------
ADO.NET 要点记录
* 与ADO的不同之处。
---------ADO 的主要对象是Connection Command RecordSet和Filed. 而ADO.NET新增了DataSet DataTalbe DataView等新类。
ADO.NET 最重要的新特性是这些新类,如DataSet等,是以断开连接的方式工作的,比如DataSet,dataset就彷佛是内存中的数据库,当从远程服务器中把数据下载过来后,连接断开,在本地处理数据,完了后再建立连接。这里摘抄一段:
“ADO2.1引入了断开连接的记录集,允许从数据库中检索数据,把他们传送给客户机,进行处理再重新连接服务器。但他们使用起来常常很繁琐,因为断开连接的工作方式不是一开始就设计好的。ADO.NET则不同,除了一种情况(<provider>DataReader)外,他们都用于脱机处理数据库”
16:36------------上来冒个泡。ADO.NET的内容之后以后再补上了。还是要先完成任务。
-------------刚刚算是学习了一下LINQ的语法,比如Join,不如符合from。发现真的是挺博大精深的。
----------- 还有的就是LINQ的实现原理,这个是目前仍然是一知半解的,知道一点,但是又不完全明白,使用了非常多的泛型,扩展方法,匿名委托,相当灵活。
------------ 可惜LINQ的强大语法我都用不上,我要做的是从几个表中将有用的字段的记录都拿出来,然后写入到Access数据库中。
-------------------我的做法是先用from句式读出主表的对象集合。
像这样:
var memberCardTable = from mc in database.mb_MemberCard select mc;
然后在一个foreach里面,读出这些对象中需要用到的字段。
而那些在这些对象中没有的字段,也就是在其他表中的,用这样的方法:
string level = database.mb_MemberType.First(r=>r.MemberTypeID==memberCard.MemberTypeID).MemberTypeName;
string memberName = database.mb_Member.First(r => r.MemberID == memberCard.MemberID).MemberName;
string cellPhone = database.mb_Member.First(r => r.MemberID == memberCard.MemberID).MobileNumber;
用的是一个First方法,用来返回第一个符合条件的结果。而条件是使用r表达式写的。
--------------- 写入数据库的过程也是很简单啦。跟JDBC差不多的。
---------------- 先建立连接。 用OleConnection,写个连接字符串就行。
----------------- 然后建一个OleCommand,用它的ExecuteNoneQuery方法来执行插入的SQL语句。
---------------- - 插入的SQL语句可以用很原始的方法去写,像这样:
string commandString = "INSERT INTO [Member Info] values ("
+"'" + cardID + "',"
+"'" + memberName + "',"
+"'" + level + "',"
+"'" + cellPhone + "')";
非常需要注意的一点事表名啊,member info,周围一定要加上[ ]!!!这个小BUG就让我爽了好一阵子。还有,原来关键字一定要大写。hollyshit.
Transact-SQL 语法规则:http://www.ebok.cn/NetWork/Servers/Servers-33012.html
17:28 ------------------ 终于完成了会员信息导出成mdb的模块。
最后补充一下SQL语句是怎么写的:
首先定义SQL语句:
string commandString ="INSERT INTO [Member Info] values(@cardID, @memberName, @level, @cellPhone ,@consumptionSum,@score)";
@后面跟一个变量名,这表示的是SQL变量。
然后从command中获取一个参数集合:
OleDbParameterCollection parameters = command.Parameters;
这是一个容器变量,然后往里面添加我们各个字段的名称和类型,注意名称跟SQL语句中的变量名是一致的。
parameters.Add(new OleDbParameter("@cardID", OleDbType.VarWChar));
parameters.Add(new OleDbParameter("@memberName", OleDbType.VarWChar));
parameters.Add(new OleDbParameter("@level", OleDbType.VarWChar));
parameters.Add(new OleDbParameter("@cellPhone", OleDbType.VarWChar));
parameters.Add(new OleDbParameter("@consumptionSum", OleDbType.Currency));
parameters.Add(new OleDbParameter("@score", OleDbType.Currency));
这是为了要定义每一个字段的数据类型。
最后一步就是为各个变量添加具体的值:
parameters[0].Value = cardID;
parameters[1].Value = memberName;
parameters[2].Value = level;
parameters[3].Value = cellPhone;
parameters[4].Value = consumptionSum;
parameters[5].Value = score;
当然了这些值都是在上面用LINQ语句获得了的。
最后executeNoneQuery().大功告成!
这个星期又将要结束了。感觉还是挺充实的。下星期继续努力吧。