1、导入带有分界符的文本文件ASP 是被打算用于创建 HTML 文档的,但是对于许多其它的编程问题,它也是一种唾手可得的解决工具。比如像把含有定界符的文本文件导入到 SQL Sever 6.5 的表中这样的工作。虽然 SQL Sever 包括了一个这样的工具(批量拷贝或者 bcp 实用工具),但是它至少有一个主要的缺陷:把您要导入的数据想得太完美无缺了。因此,如果在定界符文件中应该写着数字的地方写上了字符串,bcp 实用工具就会崩溃。这种情况下,一个对于健壮性的改进方案是使用Access 作为向 SQL Sever 导入数据的前端。这是个好的做法,但是 Access 也对包含错误数据的域也非常的挑
2、剔。最终,一切都表明一个用户定制编写的程序才是最好的解决方案。要解决这类问题,ASP 是一个很好的选择,它几乎拥有 Visual Basic 的全部功能,并且能够更容易的让程序立即运行起来。因为在这种工作中,并不需要一个用户界面,我们需要的仅仅是导入一些数据并且如果有错误的话,可以得到关于错误的报告。设想不幸的是,使用 ASP 将带有定界符的文本文件变成数据库表并不想所期望的那样简单。不管怎么说,ASP 并非一个数据库工具,所以我们需要在实际导入数据前进行一些设置工作。特别要注意的是,我们需要使用某种方法将导入数据的目标表的信息告诉 ASP 代码。至少要了解表中域的个数、名称、它们的类型(比如
3、字符型、数字型、日期形等等) 以及每个域中最多可以包含的数据(如果是一个字符型的域)。使用一个简单的文本文件来描述目标数据库表是一个好的解决办法。表 A 列出了这样一个例子。表 A: 一个简单的数据库表描述文件3name, c, 50age, n, 0birthday, d, 0文件的首行告诉我们该表有多少个域(在此例中是三个)。剩下的三行分别描述了表中每一个域的特征。每一行都含有域的名称、类型(n=数字型、c=字符型、d=日期型)以及域可以包含的字符个数。(注意最后一项信息只对字符域有意义。) 需要特别注意的是,这些域的排列顺序必须与它们在含有定界符的文本文件中的顺序相同!好,从表 A 中我
4、们可以看出这个表有三个域: name:一个可以容纳 50 个字符的字符型域 age:一个数字型域 birthday:一个日期型域 在表 B 中,我们看到的是一个用 tab 作为定界符的简单的文本文件。它含有几个总统的姓名、他们就职时的年龄以及他们的生日。(注意这个文件中域的顺序与表 A 所示的文件是相同的。你还可以注意到第二条记录的 age 域含有一个非数字的值。)表 B: 一个非常简单的用 tab 字符定界的文件Jimmy Carter 52 10/01/1924Ronald Reagan sixty-nine 02/06/1911George Bush 64 06/12/1924如表 B
5、所示,大多数文件都使用 tab 作为定界符。不过,定界符也可以是任意字符。因此,最好的解决方案应该能够处理任何定界符。解决方案表 C 出了这个问题的一种可能的解决方案。这是一个Visual Basic 函数,它能够读取带有定界符的文本文件并且将数据加入到指定的数据库表中。为了尽可能灵活,该函数带有几个不同的参数: dbName-指明目标表所在的数据库名称。(如果用户使用的数据库系统不使用数据库名,只需要传给这个参数一个空字符串。) tableName-指定目标表的名称。 sourceText-存有待导入的数据的定界符文本文件,如表 B 所示。 descriptors-含有目标数据库表的描述信息
6、的文件的名称。 errorLog-记录错误信息的文件的名称。 tCon-一个起关联作用的对象,将 dbName 参数中的数据库名称和 tableName 参数中设置的表名称联系起来。原理本函数代码中包含了详细的关于操作细节的注释,因此我们仅仅粗略的介绍一下各个对象是如何工作的。在进入函数之前,我们必须为 Web 服务器设置server.scripttimeout 属性。这个属性告知 Web 服务器经过多久(以秒为单位)后放弃运行的脚本。这个值需要根据导入数据量的多少进行相应的调整。好了,完成这些琐碎的管理工作之后,我们可以开始研究真正的函数了。函数做的第一件事是打开包含着目标数据库表的描述信息
7、的描述文件。用该文件中的信息建立一个数组,来存放我们所需了解的数据库表的所有信息。完成这一步后,所建立的数组中有表中各个域的名称、类型和长度。然后,打开错误日志文件,令其准备就绪接受我们生成的一切错误信息。现在可以打开定界符文件,然后开始将数据从其中“拽“出了。文件一旦打开,就从中读取记录并将记录一次一个域地进行分解。同时,我们检验每个域中的数据,查看它们是否符合描述文件中的标准设置。如果描述文件将一个域标志为 n(数字型),我们就使用isNumeric()函数来查看读取的值是否真的是一个数字。如果是的话,将该值插入到 SQL 语言的 Insert 语句中。否则,输出一条错误信息并且将插入到
8、SQL 语言 Insert 语句中的值改为 NULL(这是很重要的一点:即使一个或者多个域中含有错误的数据,我们仍然可以试图添加这条记录!仅仅需要在添加前将坏数据除去就可以了。)当所有的域都经过处理之后,我们利用刚才创建好的SQL Insert 语句将数据加入到目标表中。如果这一过程中出现了错误,将错误记录到错误日志中。到此为止,处理一条记录的工作就完成了。接着处理下一条。当源文件空了之后,打印一些信息,然后向函数的调用者返回插入的记录数。尾声当然,上面的技术不光可以仅仅用来存取数据库表而已。比如,可以很简单的将这个函数中生成 SQL 语言 Insert 语句的部分改为生成 HTML 表格的一行。(这是一个将不完备的带定界符的文本文件加入到 Web 站点上的绝佳的方式。)其实,最关键的一点是要明白 ASP 是一个优秀的工具,而不是仅仅可以作为 HTML 生成器。实际上,一旦将 ASP 用在其它事物上,你会发现它可以用于任何生僻的小型编程任务。如果你发现了更好的主意,请通知我们。