2015-04-06 3 views
0

я получаю следующие ошибки:Perl: DBD :: ODBC :: ул Execute не удалось

Use of uninitialized value $_ in substitution (s///) at test.pl line 29, <$fh> line 2. 
Use of uninitialized value $col in split at test.pl line 40, <$fh> line 2. 
Use of uninitialized value $k in hash element at test.pl line 41, <$fh> line 2. 
DBD::ODBC::st execute failed: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ' 
,'. (SQL-42000) 
[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (SQL-42000) at da 
ve.pl line 63, <$fh> line 2. 
Can't execute statement: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ','. (
SQL-42000) 
[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (SQL-42000) at te 
st.pl line 63, <$fh> line 2. 

и я не могу понять, как решить эту проблему.

My code is here с входными данными.

Или любое другое лучшее решение для этой задачи (чтение данных из файла ввода, обработки данных и вставить значение в соответствующий столбец в таблице базы данных.)

ответ

1

SQL, INSERT INTO Синтаксис:

INSERT INTO table_name (column1,column2,column3,...) 
VALUES (value1,value2,value3,...); 

И вы получаете Incorrect syntax near the keyword 'VALUES' потому что вы забыли закрыть скобку ) в $sql после имен столбцов,

попробовать это:

my $sql = 'INSERT INTO table_name (' . 
      join(', ', keys %data) . 
      ') VALUES (' . 
      join(', ', map { qq['$_'] } values %data) . 
      ')'; 

или, еще лучше, используйте RaiseError для удобства и безопасности, identifier quoting за правильность и безопасность, query parameterization для обеспечения эффективности и безопасности, а также, возможно, do() его, а не prepare/execute:

my $dbh = DBI->connect(..., { RaiseError => 1 }); 
my $sql = 'INSERT INTO table_name (' . 
      join(', ', map { $dbh->quote_identifier($_) } keys %data) . 
      ') VALUES (' . 
      join(', ', map { '?' } keys %data . 
      ')'; 

my $num_inserted = $dbh->do($sql, undef, values %data); # We don't really need a distinct $sth 

DBD :: ODBC также поддерживает other placeholder syntax тоже.

+0

Эй, это работает :) –

+0

Но мой код вставляет в базу одну лишнюю строку с 0 значением для всех столбцов. Можете ли вы сказать мне, почему это происходит? –

+1

+1 Я добавил немного о параметризации запроса и т. Д. К вашему ответу. Откат или изменение, если вы считаете, что это неуместно. – pilcrow

0

Я не могу понять, как решить эту проблему.

В строке 27, добавьте

warn "[$_]"; 

И понять, почему parse_line возвращается undef.

Кроме того, поскольку некоторые строки, похоже, цитируются, возможно, лучше перейти на quotewords вместо parse_line.

+0

Не знаю, почему значение undef, оно должно принимать '0' для' flapPreventionWaitCycles', но его не принимать. –

+0

@ user4752537: Что возвращает 'warn'? – choroba

+0

Пустые '[]' или '[]' более важны для этой проблемы. – choroba

Смежные вопросы