免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2503 | 回复: 7

如何把文本中的内容写进access? [复制链接]

论坛徽章:
0
发表于 2009-08-04 16:50 |显示全部楼层
想把a.txt中的内容写进access数据库里,比如a.txt只有一列多行数据如下:

xxx有限公司
sss水泥厂
xxx有限公司
sss水泥厂
xxx有限公司
sss水泥厂
xxx有限公司
sss水泥厂
xxx有限公司
sss水泥厂

用ODBC连接access数据库,首先设置好DSN为myacc,perl脚本如下:

  1. use OLE;

  2. $conn = CreateObject OLE "ADODB.Connection" || die "Error on ADO CreateObject:$!";

  3. $conn->Open('myacc');

  4. if ($conn->{state} !=1) {
  5. die ("Connection Not Open.\n\n");
  6. }

  7. while ( <> ) {
  8. $rs=$conn->prepare("insert into Enterprise(companyname) values('$_')");
  9. $rs=$conn->execute;
  10. }

  11. $rs->Close;
  12. $conn->Close;
复制代码



保存为db.pl,然后运行db.pl a.txt,为什么不行啊?
提示:Can't call method "Close" on an undefined value at D:\db.pl line 15, <> line 344
09.

如果我把$_改成一个具体值就会写进去,问题在哪里?本人perl初学者,google找不到答案了。

论坛徽章:
0
发表于 2009-08-04 17:21 |显示全部楼层
没人理啊,自己顶下!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-08-04 18:25 |显示全部楼层
你这不是 ODBC 啊。你这是 OLE 啊。

论坛徽章:
0
发表于 2009-08-04 19:22 |显示全部楼层
终于有人来了,原来是版主;

应该是ODBC吧,总之是用系统提供的接口来连接的数据库,我这段代码也是从一教程上“描”来的,

问题是连接没有问题,我测试了select 语句并print出来,没问题,然后就换成了insert into的语句,觉得关键是在里面的变量上。我改成常量就能写进去。

[ 本帖最后由 gingerhot 于 2009-8-4 19:23 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-08-05 09:37 |显示全部楼层
你知道你的程序为什么不对吗?
因为你连基本的概念都分不清,OLE 就是 OLE,ODBC 就是 ODBC,ADO 就是 ADO。
只言片语的代码还是网上抄来的,
如果随随便便都能抄对,那我们这些专业程序员还怎么混啊。

论坛徽章:
0
发表于 2009-08-05 10:41 |显示全部楼层
哈哈,你们专业程序员怎么混我不知道,因为我的确没做过专业程序员,我只是想用一个工具解决我要解决的问题而已;
这个问题我想用perl解决,于是就找了本书,看到讲perl数据库的部分,就抄了些代码下来;
我觉得perl希望它的程序员都最好别是专业的perl程序员,因为它更想成为使用者众多的一个最有用的工具;
它同样站在门口用hello world的简单招呼大家进入它的世界;

至于ODBC,OLE那些概念我确实不是很清楚,但是照葫芦画瓢也许不需要太清楚,大体明白就行,总之能和数据库连上就好,如果是它们之间的差别导致程序出错,我再去了解它们。
版主站在高处,也许用心良苦;但是我目前是想解决眼前的问题而已;

昨晚折腾了一下,最终还是写进去了,但是仍不知所以然,再把描来的片段代码写在下面:

  1. use OLE;

  2. $conn = CreateObject OLE "ADODB.Connection" || die "Error on ADO CreateObject:$!";

  3. $conn->Open('myacc');

  4. if ($conn->{state} !=1) {
  5. die ("\t Connection Not Open.\n\n");
  6. }

  7. while ( <> ) {
  8. $rs=$conn->execute("insert into KS_Enterprise(companyname) values('$_')");
  9. }

  10. $conn->Close;
复制代码

[ 本帖最后由 gingerhot 于 2009-8-5 10:43 编辑 ]

论坛徽章:
0
发表于 2009-08-05 11:35 |显示全部楼层
原帖由 gingerhot 于 2009-8-4 16:50 发表
想把a.txt中的内容写进access数据库里,比如a.txt只有一列多行数据如下:

xxx有限公司
sss水泥厂

用 ...


贴个以前写的闷门闷骚程序出来吧

use strict;
use warnings;
use Win32::OLE;

my $conn = 'Provider=Microsoft.Jet.OLEDB.4.0;' . 'Data Source=C:\Scripts\pool.mdb';
my $pool_db = Win32::OLE->new( "ADODB.Connection" ) or die $!;
$pool_db->Open( $conn );
my $rs = $pool_db->Execute( 'SELECT * FROM SwimmingPool' ) or die join "\n",  map { $pool_db->Errors->Item( $_ )->Description } ( 0 .. $pool_db->Errors->Count - 1 );
while( !$rs->EOF ){
&nbsp;&nbsp;&nbsp;&nbsp;print "Name: ", $rs->Fields('Customer')->Value(), "\n";
&nbsp;&nbsp;&nbsp;&nbsp;if( $rs->Fields('Slope')->Value() ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "    Volume of Water: ", $rs->Fields('Length')->Value() * $rs->Fields('Width')->Value() * ( ( $rs->Fields('SStart')->Value() + $rs->Fields('SEnd')->Value() ) / 2 ) * 1000, "\n\n";
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "    Volume of Water: ", $rs->Fields('Length')->Value() * $rs->Fields('Width')->Value() * $rs->Fields('Depth')->Value() * 1000, "\n\n";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;$rs->MoveNext();
}
$rs->close();
$pool_db->close();

论坛徽章:
0
发表于 2009-08-05 17:26 |显示全部楼层
贴个以前写的闷门闷骚程序出来吧


哈哈,是读取数据的。谢谢分享。

我对这个抄来的程序想做进一步扩展,譬如有“水泥”两个字我就把它分类到建材行业,“电子”的字样就分到通讯的行业,这个用规则表达式和 if 条件控制语句已经简单的分了几个类。
但是我想再用规则表达式分析一下地区,也就是说里面有“深圳”字样就分到广东省,有“廊坊”字样就分到河北省;因为地区众多,是不是应该用个hash什么的,具体该怎么写呢?最好能把按行业分类的也扩展成这个写法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP