2013-04-05 69 views
-3

我在使用dbi sqlite3使用Perl創建的數據庫中創建表時遇到問題。使用下面的代碼,我希望表中包含端口探測器,每個源IP和端口一行。我不知道如果我正確地做,下面的代碼不起作用,任何幫助將不勝感激。我擁有的代碼如下。使用SQLite3從Perl創建數據庫表

#!/usr/bin/perl 

use strict; 
use DBI; 

my $dbh = DBI->connect(   
    "dbi:SQLite:dbname=test.db", 
    "", 
    "", 
    { RaiseError => 1} 
) or die $DBI::errstr; 


$dbh->do(CREATE TABLE probes (
    source CHAR(15) NOT NULL, 
    port CHAR(5) NOT NULL, 
    PRIMARY KEY (source,port))); 


$dbh->disconnect(); 
+0

你的問題是什麼? – Borodin 2013-04-05 01:29:12

+0

我有的代碼不起作用,你能看到它有什麼問題 – user218001 2013-04-05 01:31:01

+3

*不起作用*不是一個非常明確的描述。什麼告訴你它不起作用? – Borodin 2013-04-05 01:33:18

回答

1

你忘了引用參數$dbh->do。有many方式來做到這一點。

$dbh->do("CREATE TABLE probes (..."); 
$dbh->do('CREATE TABLE probes (...'); 
$dbh->do(qq[ CREATE TABLE probes (... ]); 
$dbh->do(<<"END_SQL"); 
CREATE TABLE probes (
    ... 
END_SQL 

補充:來解決這個問題,你只需要把引號的東西在$dbh->do函數調用。

$dbh->do("CREATE TABLE probes (
  source CHAR(15) NOT NULL, 
  port CHAR(5) NOT NULL, 
  PRIMARY KEY (source,port))"); 
+0

你可以將其中的一個添加到我的代碼或提供的代碼borodin中,以便我可以看到它是如何完成的,比如如何定位參數。 – user218001 2013-04-05 02:15:14

+0

在「創建」一詞前加上引號。在最後一個括號後面加一個匹配的引號。如果報價跨越多行,則可以。 – mob 2013-04-05 02:21:39

+0

我不明白你的意思,我是這種類型的初學者。你可以向我展示我已經擁有的代碼或者其他人提供的額外代碼 – user218001 2013-04-05 02:28:23

1

你也應該有use warnings在每個程序的頂部。

您需要提供一個SQL字符串給do方法。通常使用這裏的文檔來編碼多行字符串,就像這樣。

$dbh->do(<<'END_SQL'); 
CREATE TABLE probes (
    source CHAR(15) NOT NULL, 
    port CHAR(5) NOT NULL, 
    PRIMARY KEY (source, port)) 
END_SQL 

當心的是,END_SQL行不能含有任何空白在任開頭或行結束。

+0

我得到了以下錯誤DBD :: SQLite ::數據庫做失敗:「 」附近:語法錯誤在C:\ Users \ Abdullah \ Documents \ Perl文件\ test.pl行14.你是什麼意思的空白? DBD :: SQLite :: db失敗:接近「 」:語法錯誤在C:\ Users \ Abdullah \ Documents \ Perl files \ test.pl第14行。 – user218001 2013-04-05 01:56:07

+0

該代碼適用於我。空格基本上是指在這種情況下的空格或製表符。 'END_SQL'必須位於左邊距並且不縮進,並且在行末尾之前必須沒有空格或製表符。 – Borodin 2013-04-05 02:31:03

+0

根據以下我們後面的內容,我沒有添加自變量,您對 – user218001 2013-04-05 02:35:44