sid*_*com 1 sql perl casting dbi
我的希望是,DBI::sql_type_cast用DBIstcf_DISCARD_STRING-flag会将$ sv从'4.8g'修改为4.8.
(DBIstcf_DISCARD_STRING:"如果指定了该标志,则当驾驶员成功注塑结合perl的标量的非字符串类型,然后标量的串部分将被丢弃.")
返回值sv could not be case and DBIstcf_STRICT was not used是什么意思?
#!/usr/bin/env perl
use warnings;
use 5.012;
use DBI qw(:sql_types);
my $dsn = "DBI:Proxy:hostname=horst;port=2000;dsn=DBI:ODBC:db1.mdb";
my $dbh = DBI->connect( $dsn, undef, undef, { RaiseError => 1, PrintError => 0 } )
or die $DBI::errstr;
my $sv = '4.8g';
my $sql_type = SQL_DOUBLE;
my $flags = DBIstcf_DISCARD_STRING;
my $sts = DBI::sql_type_cast( $sv, $sql_type, $flags );
say $sts; # 1 (sv could not be case and DBIstcf_STRICT was not used)
say $sv;
# Argument "4.8b" isn't numeric in subroutine entry at ./perl6.pl line 14.
# 1
# 4.8b
Run Code Online (Sandbox Code Playgroud)
文档中包含一个拼写错误 - $sts== 1 的描述应该是"sv无法强制转换 " - 即SQL_DOUBLE对于您提供的值无法进行强制转换,因此没有进行任何操作.
DBIstcf_DISCARD_STRING意味着与你想要的不同.在Perl内部术语中,这意味着如果你通过带有POKand NOK和PV部分"1.23"和NV部分1.23的SV,你将获得带有!POKand NOK和NV部分的SV 1.23- 也就是说,标量的存储字符串部分将被无效,留下数字部分完好无损,因此将来尝试将标量用作字符串将强制将其从数字重新转换为字符串.但请注意,它表示只有在强制转换成功时才会发生这种情况,SQL_DOUBLE如果值不是一个有效的数字,则转换为不成功."4.8g"未通过测试.
你可以自己清理字符串部分的值几乎与DBI一样有效,这样做$sv = 0 + $sv;会清除POK并强制以相同的方式重新转换为字符串.这与DBI之间的区别在于,它实际上并没有以DBI的方式清除 PV,只是将其标记为无效.要以与DBI相同的方式强制立即清除值,您需要执行类似的操作
$sv = do { my $tmp = 0 + $sv; undef $sv; $tmp };
但除非你有一些非常好的解释,为什么你需要它,你没有 - 所以不要使用它.:)
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |