Perl可以通过ADO组件读写数据库。

lookmai 2002-12-09 11:41:34
此程序在ActivePerl环境通过,是利用ADO组件读写,
而且只要asp/vb能操作的com组件,perl一样可以操作。
例一
use strict;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
...
...

my $adcnn=Win32::OLE->new('ADODB.Connection');
my $adrs=Win32::OLE->new('ADODB.Recordset');
my $sConn= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=".$filename.";Extended Properties=Excel 8.0";
#my $sConn= "Provider=SQLOLEDB.1;Password=ispasswd;Persist Security Info=True;User ID=lookmai;Initial Catalog=BOM_dev;Data Source=swr017;Connect Timeout=300"
$adcnn->Open($sConn);
my $sSQL = "SELECT * FROM [Sheet1\$]";
$adrs = $adcnn->Execute($sSQL);
while(not $adrs->eof)
{
my $AA=$adrs->fields(0)->value;
my $BB=$adrs->fields(1)->value;
my $CC=$adrs->fields(2)->value;
my $DD=$adrs->fields(3)->value;
...
...
$adrs->MoveNext;
}
$adcnn->close();
$adrs->close();
例二:'BOM_pogoods.Update'为本人用VB设计的COM组件
use strict;
use Win32::OLE;
my $checkSQL="SELECT count(*) total FROM Assembly_Bill WHERE Proj_Code='ttt'";
my $strSql="insert INTO Assembly_Bill values('ttt','AA','BB','CC','DD')";
my $Obj=Win32::OLE->new('BOM_pogoods.Update');
my $aa=$Obj->insertSQL($strSql,$checkSQL);
$Obj->close();
print $aa;
...全文
101 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wildhorse01 2003-01-18
  • 打赏
  • 举报
回复
搞定,谢谢
我从来没这样用过set nocount on
lookmai 2003-01-18
  • 打赏
  • 举报
回复
CREATE PROCEDURE DBO.sptestAS
as
set nocount on
delete from 房间
select te='aaaaaa',name='lookmai',sex='man'
set nocount off
lookmai 2003-01-17
  • 打赏
  • 举报
回复
CREATE PROCEDURE DBO.sptestAS
as
delete from 房间
select te='aaaaaa'
wildhorse01 2003-01-17
  • 打赏
  • 举报
回复
ALTER PROCEDURE sptestAS
delete from 房间;
select te='aaaaaa'
这样的存储过程执行后,并不返回记录集呀???
我这里是这样的!
WINXP,SQL SERVER2K,ACTIVEPERL
wildhorse01 2003-01-17
  • 打赏
  • 举报
回复
这样肯定行了:
CREATE PROCEDURE DBO.sptestAS
as
select te='aaaaaa',name='lookmai',sex='man'
但是我的是这样的呀:
CREATE PROCEDURE DBO.sptestAS
as
delete from 房间
select te='aaaaaa',name='lookmai',sex='man'
就不行了呀!!!
socketref 2003-01-17
  • 打赏
  • 举报
回复
perl 就是oo对象包装像是一盘十锦菜,不如python
lookmai 2003-01-17
  • 打赏
  • 举报
回复
(看了贴子以后我就试了一遍)不是吧????????!!!!!!!!!还用我试吗?
在我的代码基础上修改!!!!
CREATE PROCEDURE DBO.sptestAS
as
select te='aaaaaa',name='lookmai',sex='man'

use strict;
use Win32::OLE;
my $adcnn=Win32::OLE->new('ADODB.Connection');
my $adrs=Win32::OLE->new('ADODB.Recordset');
my $adCmd=Win32::OLE->new('ADODB.Command');
my $sConn= "Provider=SQLOLEDB.1;Password=nsteam;Persist Security Info=True;User ID=ns00004;Initial Catalog=CIS_dev;Data Source=swr017;Connect Timeout=300";
$adcnn->{'ConnectionString'} = $sConn;
$adcnn->Open;
$adCmd->{'ActiveConnection'} = $adcnn;
$adCmd->{'CommandText'} = "sptestAS";
my $adCmdStoredProc=4;
my $adVarChar=200;
my $adParamInput=1;
$adCmd->{'CommandType'} = $adCmdStoredProc;
$adCmd->Parameters->Append($adCmd->CreateParameter());
$adrs = $adCmd->Execute;
#while(not $adrs->eof)
#{
my $temp=$adrs->{'te'}->value;
my $name=$adrs->{'name'}->value;
my $sex=$adrs->{'sex'}->value;
print "$temp\n$name\n$sex";
# $adrs->MoveNext;
#}
$adcnn->close();
$adrs->close();
$adCmd->close();
wildhorse01 2003-01-17
  • 打赏
  • 举报
回复

to lookmai:
真的不行呀,你试验过吗?
wildhorse01 2003-01-16
  • 打赏
  • 举报
回复
我试试
lookmai 2003-01-03
  • 打赏
  • 举报
回复
绝对没错,注意adCmdStoredProc之类一定要赋值。
use strict;
use Win32::OLE;
my $adcnn=Win32::OLE->new('ADODB.Connection');
my $adrs=Win32::OLE->new('ADODB.Recordset');
my $adCmd=Win32::OLE->new('ADODB.Command');
my $sConn= "Provider=SQLOLEDB.1;Password=nsteam;Persist Security Info=True;User ID=ns00004;Initial Catalog=CIS_dev;Data Source=swr017;Connect Timeout=300";
$adcnn->{'ConnectionString'} = $sConn;
$adcnn->Open;
$adCmd->{'ActiveConnection'} = $adcnn;
$adCmd->{'CommandText'} = "sp_LoadPO";
my $adCmdStoredProc=4;
my $adVarChar=200;
my $adParamInput=1;
$adCmd->{'CommandType'} = $adCmdStoredProc;
$adCmd->Parameters->Append($adCmd->CreateParameter('inPONo', $adVarChar, $adParamInput, 8, '1'));
$adrs = $adCmd->Execute;
while(not $adrs->eof)
{
my $temp=$adrs->fields('Cost_Centre')->value;
print "$temp\n";
$adrs->MoveNext;
}
$adcnn->close();
$adrs->close();
$adCmd->close();
lookmai 2003-01-03
  • 打赏
  • 举报
回复
ALTER PROCEDURE sptestAS
delete from 房间;
select te='aaaaaa'

用Recordset的方法就可以取到它的值了,为什么一定要通过output返参数值?Recordset的方法还可以返回多几个参数值,如:
select te='aaaaaa',name='lookmai',sex='man'
灵活多了。
wildhorse01 2003-01-03
  • 打赏
  • 举报
回复
你的存储过程参数都是input的
而我要求的ALTER PROCEDURE sptest
(@te varchar(50) output)
AS
delete from 房间;
set @te='aaaaaa'
RETURN
是output的,不能通过output返回参数值???
wildhorse01 2003-01-03
  • 打赏
  • 举报
回复
存储是执行了,不过,无论如何不能返回存储过程修改参数的值!
存储过程如下:
ALTER PROCEDURE sptest
(@te varchar(50) output)
AS
delete from 房间;
set @te='aaaaaa'
RETURN
程序如下:
use strict;
use Win32::OLE;
use Win32::ADO;

my $adocon=Win32::OLE->new('ADODB.Connection');
my $qry=Win32::OLE->new('ADODB.Recordset');
my $adocmd=Win32::OLE->new('ADODB.Command');
my $adopa=Win32::OLE->new('ADODB.Parameter');
my $sConn= "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=ZhengYTNet;Data Source=localhost;Connect Timeout=300";
$adocon->Open($sConn);
$adocmd->{'ActiveConnection'}=$adocon;
$adocmd->{'CommandType'}=adCmdStoredProc;
$adocmd->{'CommandText'}="sptest";
$adopa=$adocmd->CreateParameter('te',200,2, 50,'');
$adocmd->Parameters->Append($adopa);
$qry=$adocmd->Execute;
#my $AA=$adopa->{'Value'};
#print $AA."\r\n";
my $aa=$adocmd->Parameters->Item(0)->{'Value'}; #改为Direction或者Size等其他属性,均能正确输出值,唯独Value不能正确输出
print $aa."\r\n";
$adocmd->close();
$adocon->close();
lookmai 2003-01-03
  • 打赏
  • 举报
回复
这样写比较简洁些:
my $temp=$adrs->{'Cost_Centre'}->value;
wildhorse01 2003-01-02
  • 打赏
  • 举报
回复
为什么我调用存储过程不执行,而且也不能返回值!!!
存储过程绝对没错!
我用C++BUILDER调用该存储过程没错!
use strict;
use Win32::OLE;
use Win32::ADO;

my $adocon=Win32::OLE->new('ADODB.Connection');
my $qry=Win32::OLE->new('ADODB.Recordset');
my $sConn= "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=ZhengYTNet;Data Source=localhost;Connect Timeout=300";
$adocon->Open($sConn);
my $sSQL = "SELECT * FROM 消费项目";
$qry = $adocon->Execute($sSQL);
while(not $qry->eof)
{
my $AA=$qry->fields(0)->value;
my $BB=$qry->fields(1)->value;
my $CC=$qry->fields(2)->value;
my $DD=$qry->fields(3)->value;
print $AA."\t".$BB."\t".$CC."\t".$DD."\r\n";
$qry->MoveNext;
}
$qry->close();
my $adocmd=Win32::OLE->new('ADODB.Command');
my $adopa=Win32::OLE->new('ADODB.Parameter');
$adocmd->{'ActiveConnection'}=$adocon;
$adocmd->{'CommandType'}=adCmdStoredProc;
$adocmd->{'CommandText'}="sptest";
$adopa=$adocmd->Parameters->CreateParameter("\@te",adInteger,adParamOutput,8,0);
$adocmd->Execute();
my $AA=$adopa->{'Value'};
print $AA."\r\n";
$adocon->close();
lookmai 2003-01-02
  • 打赏
  • 举报
回复
呵呵,以前我也是用ODBC,性能差强人意,
后来我改成OLE DB直接连SQL Server,不通过ODBC,
竟然快了...,我不说出了,免得别人以为我在吹牛,
你自己测试下就知道了。如:
my $sConn= "Provider=SQLOLEDB.1;Password=ispasswd;Persist Security Info=True;User ID=lookmai;Initial Catalog=BOM_dev;Data Source=swr017;Connect Timeout=300"

还有如果你要用事务的话,加上:
adcnn.BeginTrans
........
........
adcnn.CommitTrans
hoowa 2003-01-01
  • 打赏
  • 举报
回复
Win32::ADO模块就是把OLE放在里面了而已。

其实我觉得DBD:ODBC不错
IceboundRock 2002-12-31
  • 打赏
  • 举报
回复
学习学习,祝大家新年快乐!!
cangwu_lee 2002-12-28
  • 打赏
  • 举报
回复
Yeah!
mymmsc 2002-12-22
  • 打赏
  • 举报
回复
我来学习一下
加载更多回复(3)

37,742

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧