标签: dbi

如何在不运行两个单独的进程调用的情况下获取DBI中的行数?

我在Perl中运行DBI并且无法弄清楚当我运行预准备语句时,我可以判断返回的行数是否为0.

我意识到我可以在我的while循环中设置一个计数器来获取我的行,但我希望有一个不那么难看的方法.

perl dbi

12
推荐指数
3
解决办法
4万
查看次数

为什么DBD :: SQLite不能通过我的Perl CGI脚本插入数据库?

我在Perl CGI脚本中运行SQLite数据库,DBD :: SQLite正在访问该脚本.这是在Apache上作为直接CGI运行的.

DBI连接正常,选择能够运行.但是,当我尝试插入时,我得到一个带有以下错误的骰子:

DBD::SQLite::st execute failed: unable to open database file(1) at dbdimp.c line 402 at index.cgi line 66
Run Code Online (Sandbox Code Playgroud)

我已经尝试将数据库文件权限更改为666以尝试修复此问题,但我仍然收到错误.

有什么建议?

apache sqlite perl dbi

11
推荐指数
1
解决办法
1万
查看次数

如何在Strawberry Perl中安装DBD :: Oracle

我正在尝试使用Strawberry Perl中的CPAN shell 安装DBD :: Oracle.我最初遇到错误,因为Makefile找不到OCI库,所以我从Oracle安装了即时客户端.我认为这将解决这个问题,但现在我得到的错误和警告的大混合物中Oracle.h,dbdimp.h,Oracle.c,Oracle.xsi,和Oracle.xs.

有关如何进行的任何建议?我的计算机上现有的Oracle软件是否存在问题?我对Perl相当新,所以任何帮助都表示赞赏.

编辑 - 我将以下整个输出包括在内:

cpan> install DBD::Oracle
Database was generated on Fri, 04 Dec 2009 16:12:46 GMT
Running install for module 'DBD::Oracle'
Running make for P/PY/PYTHIAN/DBD-Oracle-1.23.tar.gz
Checksum for C:\strawberry\cpan\sources\authors\id\P\PY\PYTHIAN\DBD-Oracle-1.23.tar.gz ok
Scanning cache C:\strawberry\cpan\build for sizes
...............................................................-------------DONE

  CPAN.pm: Going to build P/PY/PYTHIAN/DBD-Oracle-1.23.tar.gz

Multiple copies of Driver.xst found in: C:/strawberry/perl/site/lib/auto/DBI/ C:\strawberry\perl\vendor\lib/auto/DBI/ at Makefile.PL line 37
Using DBI 1.609 (for perl …
Run Code Online (Sandbox Code Playgroud)

oracle perl dbi dbd strawberry-perl

11
推荐指数
1
解决办法
2万
查看次数

AutoCommit设置为0的DBI数据库句柄没有用SELECT返回正确的数据?

这是一个难以解释的(并且非常奇怪),所以请耐心等待.我将解释这个问题,并解决它,但我想看看是否有人可以解释为什么它的工作方式:)

我有一个使用mod_perl的Web应用程序.它使用MySQL数据库,我定期将数据写入数据库.它是模块化的,因此它也有自己的"数据库"类型的模块,我处理连接,更新等.database :: db_connect()子例程用于连接数据库,并AutoCommit设置为0.

我创建了另一个Perl应用程序(独立守护程序),它定期从数据库中提取数据,并根据返回的数据执行各种任务.我在其中包含了database.pm模块,所以我不必重写/复制所有内容.

我遇到的问题是:

应用程序在启动时连接到数据库,然后永远循环,每隔X秒从数据库中获取数据.但是,如果数据库中的数据被更新,我的应用程序仍然会返回"旧"数据,这是我对数据库的初始连接/查询.

例如 - 我有3行,"Name"列的值为'a','b'和'c' - 用于每条记录.如果我更新其中一行(例如,从命令行使用mysql客户端)并将名称从"c"更改为"x",我的独立守护程序将无法获取该数据 - 它仍然会返回/ b/c MySQL的.我用tcpdump捕获了数据库流量,我肯定可以看到MySQL确实正在返回那些数据.我也尝试过将SQL_NO_CACHE与SELECT一起使用(因为我不知道发生了什么),但这也无济于事.

然后,我修改了我的独立守护进程中的数据库连接字符串,并设置AutoCommit为1.突然,应用程序开始获取正确的数据.

我很困惑,因为我认为AutoCommit只影响INSERT/UPDATE类型的语句,并且对SELECT语句没有影响.但它看起来确实如此,我不明白为什么.

有没有人知道为什么SELECT语句在AutoCommit设置为0 时不会从数据库返回'updated'行,为什么在AutoCommit设置为1 时它会返回更新的行?

这是我在独立守护程序中使用的简化(取出错误检查等)代码,并且不返回更新的行.

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Data::Dumper;
$|=1;

my $dsn = "dbi:mysql:database=mp;mysql_read_default_file=/etc/mysql/database.cnf";
my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 0, AutoCommit => 0});
$dbh->{mysql_enable_utf8} = 1;

while(1)
{
    my $sql = "SELECT * FROM queue";
    my $stb = $dbh->prepare($sql);
    my $ret_hashref = $dbh->selectall_hashref($sql, "ID");
    print Dumper($ret_hashref);
    sleep(30); …
Run Code Online (Sandbox Code Playgroud)

mysql perl select autocommit dbi

11
推荐指数
1
解决办法
5668
查看次数

perl DBI和占位符

我有这个问题 select * from table where ID in (1,2,3,5...)

如何使用占位符与DBI构建此查询?

例如 :

my @list = (1, 2, 3, 4, 5);
my $sql = "select * from table where ID in (?)";

$sth->prepare($sql);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

我应该发送什么参数来执行?它是一个由,其他东西分隔的列表或字符串吗?

perl dbi

11
推荐指数
4
解决办法
7071
查看次数

如何查找特定于 ODBC 驱动程序的参数

有没有办法以编程方式发现 ODBC 连接的命名参数?

例如,使用“ODBC Driver 17 for SQL Server”,ODBC 数据源管理器(在 Windows 中)允许使用“登录 ID”和“密码”进行身份验证,但是在以编程方式连接时,我们需要分别使用uid=pwd=。这两个配置点在配置文档(例如https://db.rstudio.com/databases/microsoft-sql-server/)中明确列出,但驱动程序支持的其他几个配置选项较少或不- 记录。

(对于 SQL Server,还有更多文档,包括https://docs.microsoft.com/en-us/sql/connect/odbc/windows/driver-aware-connection-pooling-in-the-odbc-driver-for -sql-server?view=sql-server-ver15,列出了其他几个参数(尽管不是它们可能的值)。这适用于这个驱动程序,但由于此页面尚未针对驱动程序 17 更新,我们必须假设所有选项不变。)

可以通过编程方式了解哪些驱动程序可用,以及哪些预定义数据源可用:

odbc::odbcListDrivers()
#                             name        attribute value
# ...truncated...
# 33 ODBC Driver 17 for SQL Server       UsageCount     1
# 34 ODBC Driver 17 for SQL Server         APILevel     2
# 35 ODBC Driver 17 for SQL Server ConnectFunctions   YYY
# 36 ODBC Driver 17 for SQL Server        CPTimeout    60 …
Run Code Online (Sandbox Code Playgroud)

odbc r dbi nanodbc

11
推荐指数
1
解决办法
684
查看次数

何时使用$ sth-> fetchrow_hashref,$ sth-> fetchrow_arrayref和$ sth-> fetchrow_array?

我知道:

  • $sth->fetchrow_hashref 从数据库返回获取的行的hashref,
  • $sth->fetchrow_arrayref 从数据库返回获取的行的arrayref,和
  • $sth->fetchrow_array 从数据库返回获取的行的数组.

但我想知道有关这些的最佳实践.我们什么时候应该使用fetchrow_hashref?什么时候应该使用fetchrow_arrayref?什么时候应该使用fetchrow_array?

perl dbi

10
推荐指数
2
解决办法
2万
查看次数

如何将Perl连接到SQL Server?

我有用户ID,密码,数据库名称和数据源详细信息.我想与Perl连接到MSSQL服务器.我刚刚使用了以下代码段,但是我收到了错误消息.

#!/usr/bin/perl -w
use strict;

use DBI;

my $data_source = q/dbi:ODBC:192.168.3.137/;
my $user = q/bharani/;
my $password = q/123456/;

# Connect to the data source and get a handle for that connection.
my $dbh = DBI->connect($data_source, $user, $password)
    or die "Can't connect to $data_source: $DBI::errstr";
Run Code Online (Sandbox Code Playgroud)

我的错误是:

DBI connect('192.168.3.137','bharani',...) failed: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (SQL-IM002) at my sqlconnect.pl line 14
Can't connect to dbi:ODBC:192.168.3.137: [Microsoft][ODBC Driver Manager] Data source name not found …
Run Code Online (Sandbox Code Playgroud)

perl dbi

10
推荐指数
1
解决办法
4万
查看次数

%ENV不起作用,我不能使用共享库

我不能%ENV在我的Perl脚本上使用var来使用Oracle库.

BEGIN {
    $ORACLE_HOME = "/usr/lib/oracle/10.2.0.3/client64";
    $LD_LIBRARY_PATH = "$ORACLE_HOME/lib";
    $ORACLE_SID="prod";
    $ENV{ORACLE_SID}=$ORACLE_SID;
    $ENV{ORACLE_HOME}= $ORACLE_HOME;
    $ENV{LD_LIBRARY_PATH}= $LD_LIBRARY_PATH;
};
Run Code Online (Sandbox Code Playgroud)

如果我打印$ENV{'ORACLE_HOME'},$ENV{'LD_LIBRARY_PATH'}一切似乎没问题但是,当我运行我的脚本时,我有错误:

install_driver(Oracle)失败:无法为模块DBD加载'/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so':: Oracle:libclntsh.so.10.1:无法打开共享对象文件:否这样的文件或目录位于/usr/lib64/perl5/DynaLoader.pm第200行.(eval 3)第3行编译在(eval 3)第3行的require中失败.也许在预期的地方没有安装所需的共享库或dll在persistence.perl第22行

在网上搜索我发现在Perl上设置env变量的正确方法是使用%ENVhash.

导出ORACLE_HOMELD_LIBRARY_PATH通过unix shell(export LD_LIBRARY_PATH=...)它可以正常工作.有什么建议?

oracle perl env dbi dbd

10
推荐指数
1
解决办法
6506
查看次数

执行语句是否总是占用结果集的内存?

一位同事告诉我,执行SQL语句总是将数据放入RAM/swap由数据库服务器.因此,选择大的结果集是不实际的.

我以为这样的代码

my $sth = $dbh->prepare('SELECT million_rows FROM table');
while (my @data = $sth->fetchrow) {
    # process the row
}
Run Code Online (Sandbox Code Playgroud)

逐行检索结果集,而不将其加载到RAM.但我在DBI或MySQL文档中找不到任何引用.结果集是如何真正创建和检索的?它对简单的选择和连接是否有效?

mysql perl resources prepared-statement dbi

9
推荐指数
2
解决办法
1358
查看次数