Ruby 101:动态编程
Written by Allen Lee
当method_missing的魔法失效时……
在上一篇文章里,我们通过重写Hash类的method_missing方法把Hash对象模拟成匿名对象,但是,这种做法有时会产生一些莫名其妙的问题,举个例子吧,假如我把process方法(完整实现参见上一篇文章的代码31)的options参数从这样:
代码 1
改成这样:
代码 2
我们将会发现,不论options参数的count取什么值,我们总是得到两本书,为什么?想想看,method_missing方法的触发条件是什么?仅当我们调用的方法不存在时,method_missing方法才有机会出场,但是,Hash类本身就有count方法:
图 1
这打破了method_missing方法的触发条件,换句话说,method_missing方法被count方法"截胡"(麻将术语)了。Hash类的count方法返回键/值对的个数,而options参数默认就有两个键/值对,如果我们没有添加额外的键/值对,count方法的返回值将会总是2,这就是为什么修改options参数之后我们总是得到两本书。那么,如何解决这个问题?
显然,method_missing方法和count方法无法同时存在,否则转发消息的逻辑总 ......
下午在Excel导入SQL时,发现原连接Excel的数据连接串过时造成新的Excel格式*.xlsx无法识别。
把新的连接串替换~
分别测试03/07的Excel文件均可通过~
Office 97-2003版本
Excel: Provider= Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;Extended Properties=Excel 8.0;
Access: Provider= Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;Jet OLEDB:Database Password=密码;
Office 2007版本
Excel: Provider= Microsoft.Ace.OleDB.12.0;Data Source=文件位置;Extended Properties=Excel 12.0;
Access: Provider= Microsoft.Ace.OleDB.12.0;Data Source=文件位置;Jet OLEDB:Database Password=密码; ......
MS Access ODBC connection strings
Standard Security:
"Driver= {MicrosoftAccessDriver(*.mdb)};DBQ=C:\App1\Your_Database_Name.mdb;Uid=Your_Username;Pwd=Your_Password;"
Workgroup:
"Driver={Microsoft Access Driver (*.mdb)}; Dbq=C:\App1\Your_Database_Name.mdb; SystemDB=C:\App1\Your_Database_Name.mdw;"
Exclusive "Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\App1\Your_Database_Name.mdb; Exclusive=1; Uid=Your_Username; Pwd=Your_Password;"
MS Access OLE DB & OleDbConnection (.NET framework) connection strings
Open connection to Access database:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\App1\Your_Database_Name.mdb; User Id=admin; Password="
Open connection to Access database using Workgroup (System database):
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\App1\Your_Database_Name.mdb; Jet OLEDB:System Database=c:\App1\Your_System_Database_Name.mdw"
Open connection to password protected Access database:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\App1\Your ......
在做Mobile项目时遇到一个问题,我们的Mobile项目需要使用SqlCe数据库,而客户提供的带有原始数据的数据库是Access格式的,所以我们面临的第一个问题是将Access数据库(*.mdb)转换成SqlCe数据库(*.sdf)。网上搜索的很多资料是关于如何将SqlServer 2005与SqlCe数据进行同步,主要是通过发布订阅及RDA编程来实现,可以参考的资料有:
用 SQL Server Management Studio 管理 SQL Server Compact Edition 数据库
SQL CE 和 SQL Server 的同步
Step by Step: Program Microsoft SQL Server CE 2.0 Merge Replication Using .NET Compact Framework
后来找到一个工具Data Port Wizard可以直接将其他数据库转换为SqlCe数据库,省了不少事。只是转换过程中遇到一个小小的问题,在客户提供的Access数据库的关系里设置了很多表与表之间的关系,但所有的表都没有设置主键,所以转换时就抛出异常。为了省事,我将Access表的关系全部删除,这样就顺利的将Access数据库转换成SqlCe 3.5版本的sdf数据库了。
至于操作SqlCe的数据层的类,在网上找到一个SqlCeHelper.cs,转贴如下:
using System;
using System.Data;
using System.Data.S ......
最近在项目中用到了SQLite。主要是客户端用到,这种小型内嵌数据库还是蛮实用的。
提起SQLite我不自觉的就想起了微软出的ACCESS。他们两个确实是有可比性的。曾经,小型网站数据库,ASP可以用到ACCESS。但是,PHP却是没有相对应的解决方案,自从SQLite的出现,给PHP提供了一个解决方案。
在客户端里面,我用到的数据保存方案有:CSV、INI、XML。其中XML是最强大的,但是可惜的是我用的解析器是Tinyxml,实用tinyxml的初衷就是简单,只用于配置,所以再复杂的事情就有些应付不过来。至少,逻辑上要复杂上许多。
我最近,看了迅雷,搜狗……一些软件的目录,都有一个sqlite3.dll。于是就去了解了下。貌似现在很多的im软件用这个做客户端数据库的也多起来了。看起来这个项目还是不错的。
SQLite有好几种版本,如果要想内嵌到应用程序当中去,那就要用sqlite-amalgamation这个版本了。它就是一个头文件,一个c的实现文件,这个文件里面有十多万行代码。我用VS2003编译的时候,编译器会提醒我,行数有些超长了-_-!!
C++里面对SQLite的包装类库里面,我觉得SOCI算是很不错的,这个项目不仅仅是对SQLite进行了包装,而且对其他数据库都有包装,像MySQL、PostgreS ......
/******************************
系统函数
******************************/
--convert 用来转变数据类型
--convert (data_type[(length)], expression [, style])
select convert(int,convert(varchar(5),12345)+'678')+1 --返回12345679
--cast 也是用来转换数据类型
--cast(expression as data_type[(length)])
select cast((cast(12345 as varchar(5))+'678') as int)+1 --返回123456789
--current_user 返回当前用户的名字
select current_user
--datalength
--返回用于指定表达式的字节数
select datalength ('中国a盟') --中文占个字节
--host_name 返回当前用户所登录的计算机名字
select host_name()
--system_user 返回当前所登录的用户名称
select system_user
--user_name从给定的用户id返回用户名
select user_name(2) --返回guest
--空值函数isnull(col,replaceStr)
select isnull(pwd,'***') pwd from person
--字符串连接
print 'hello,'+'sqlserver2005!'
--如果两个参数相同就返回null,否则返回第一个参数,忽略大小写
if nullif('accp','ACCP2') is null
print '两个参数相同'
else
begin
print nul ......