THE MOMENT, THE MEMENTO

2008年02月20日

FTP传送扩展名为ASP的数据库要注意传输类型

标签:, , , — 吴德文 @ 17:10

去年开始接管一个单位的网站,是用ASP制作的,其数据库为了防止别人下载命名成了abc.asp的形式。

管理网站首要的任务就是备份、恢复了,尤其是数据库。通常都是用FTP下载下来, 在本地进行备份。

FTP一直都用图形化工具FileZilla,文件的传输类型(文本或者是二进制)默认都已经设定好了,所以也就基本上都忘记这回事了。

刚接管这个ASP网站的时候,用FTP下载下数据库,然后再传到一个新建的网站上做修改测试。可新网站提示说数据库格式无法识别。开始我还想是不是下载下来的数据库被我的Access 2003打开修改以后被保存成2003格式,所以机器上的旧ASP程序认不出来。此后,就一直小小心心不敢在本地直接修改数据库,只能通过管理界面提供的接口。有一次为了删除所有的垃圾留言,还特地修改asp源代码把删除一条的按钮改成删除全部。

过了一个年以后,就把这个约束给忘了。这次在无法登录的情况下想要修改数据库复制一个管理员出来,最后在回传数据库文件的时候又出问题了。理所当然的,我又以为是数据库格式问题。可是后来的发现证明的我想法是错的。一个发现是Access(不论是2003或者是2007)在打开数据库的时候会显示此数据库是什么格式,是2000或者2003,即便修改过以后,格式不会改变;另一个发现是我将未修改过的数据库回传会网站的时候也遇到这个问题。这就说明不是Access格式的问题了,而纯粹是FTP传输过程中改变文件内容了。当想到FTP传输过程的问题是,我突然想到自己传的是一个ASP文件,而FTP工具肯定将其作为文本文来传输了,文件内容自然就被改变了。

想到这点,赶紧在设置里将文本类型的ASP扩展名删除,再进行回传。这下就没有问题了。嗯,这下终于松了口气 ,以后可以随便修改数据库文件了。只是不知道以后再过多久我会不会又忘记这个设置的问题,而且那个时候会不会记得来看这篇文章。但愿是不要忘记的好。


Related:

2007年11月27日

Postgresql数据库表名大写的问题

标签:, — 吴德文 @ 16:32

这个学期为了一些应用,用Postgrsql建了数据库,本想正式点,数据库的表名都用大写,比如Users、Profiles、Money等。

可是后来发现,在做select * from Users这样的查询的时候会提示ERROR:  relation "users" does not exist。分析了一下,认为,应该是处理SQL语句的时候把大写的内容都变成小写了,实际的SQL语句变成select * from users——这也说明平时我们可以不用写SELECT * FROM users了,反正都要转换的,哈哈。而Postgresql数据库里表名应该是分大小写的,导致找不到users这个表。

要解决这个问题,就要改SQL语句,所有表名都要加双引号(这个好像也是SQL标准规定的,所有表名、字段名都应该加双引号),select * from "Users"这样就避开了大小写转化的问题。只是这样的话,在一些EJB以及JPA应用里,会带来麻烦。它们在指定Entity使用的是哪个表的时候,往往都要设定表名,通常就是”TABLE NAME”的形式。如果就按默认写法的话,最后在SQL语句里肯定是没有双引号的;如果设定时多加一个双引号上去,就变成双重引号了,当然也许可以’”TABLE NAME”‘即用单引号来包含双引号,但是没有测试不知道是否可行。

最简单的办法,就是数据库里所有的表名都是小写的,最好字段名也都是小写的(因为映射到对象属性以后基本上会变换大小写,JPA是都变成小写)。这样就没与那么多烦恼以及兼容性问题了。人其实都是这样,往往都是自己把事情搞得复杂化的。

注:刚刚发现如果用psql客户端程序创建表的时候,即便表名为大写,实际还是小写的。例如create table Test(),实际得到的表名其实是test。可能使用一些标准化的图形工具的时候,输入的表名,它会用双引号括起来,变成实际的表名是有大小写之分的。


Related:

终于写出一个基于JPA的程序了

标签:, , , — 吴德文 @ 16:11

发现自己学东西实在太慢了,常常一个月都在读文档,却始终写不出一个有用的东西来。

之前开始学JPA——本来是按照一些PPT和书上的内容学EJB的,当然有也讲Hibernate的书,可是EJB还没有看完呢,也没有空看。后来才发现EJB(2.0)过时了,找了最新的技术,觉得JPA应该是以后的趋势了,就学它了,可是断断续续的这么久,不断的测试平台,也才只是学会怎么将数据库映射成对象(其实很简单,就只是一个JPA Tool->Generate Entities就搞定的事情),下午终于下定决心搞出一个可以连上数据库查询出东西来的sample程序。

经过给persistence.xml添加Properties(openjpa.ConnectURL等),添加Postgresql驱动(这里要说的是驱动URI是org.postgresql.Driver,开始设成了org.postgresql.jdbc.Driver,结果一直出错(org.apache.openjpa.util.StoreException ),还有一个数据库设置的问题,另外其一个题来说吧。附加上主程序吧,实在是简单呢。

EntityManagerFactory factory = Persistence.createEntityManagerFactory("Dali-ME");
// 从 EntityManagerFactory 实例 factory 中获取 EntityManager
EntityManager em = factory.createEntityManager();
Basic basic = em.find(Basic.class, 4);System.out.println("ID: " + basic.getUid());
System.out.println("姓名: " + basic.getXingming());
System.out.println("学号: " + basic.getXuehao());
System.out.println("性别: " + basic.getGender());
em.close ();
factory.close ();


Related:

Valid XHTML 1.1 Valid CSS! Creative Commons License WordPress 所驱动