2009-07-13 3 views
1

Можно создать дубликат:
Query Syntax errorВставить заявление с тем, где пункт

Я хочу, чтобы вставить значение с помощью следующей команды

DoCmd.RunSQL = "insert into tblContract(
Empid, 
Start1, 
Finish1, 
Store1, 
Start2, 
Finish2, 
Store2) 
values ('" & Me.txtEmpNo.Value & "','" 
    & Me.txtContSunStart1.Value & "', '" 
    & Me.txtContSunFinish1.Value & "','" 
    & Me.txtContSunStore1.Value & "','" 
    & Me.txtContSunStart2.Value & "', '" 
    & Me.txtContSunFinish2.Value & "','" 
    & Me.txtContSunStore2.Value & "')" 

Но при вставке его следует вставить в строку, где значение столбца (testid) в той же таблице является max (testid) другой таблицы.

Этот запрос не работает:

SQL = "INSERT INTO tblContract (EmpId, TestID, Start1, Finish1, store1, Start2, Finish2, store2) SELECT" & Me.txtEmpNo.Value & «», MAX (TestID), '& Me.txtContSunStart1.Value & "', ' "& Me.txtContSunFinish1.Value &"', ' "& Me.txtContSunStore1.Value &"', '» & Me.txtContSunStart2. Значение & " '' "& Me.txtContSunFinish2.Value &" ''»& Me.txtContSunStore2.Value & " '" & " ИЗ tbltesting'

Я найти альтернативу для этого. В ms-доступе он дает ошибку компиляции

+0

Вы должны немного уточнить, что вы имеете в виду ... Вы не можете вставить что-либо в существующую строку, это будет обновление. – Guffa

+2

Точный дубликат http://stackoverflow.com/questions/1119246/query-syntax-error – gbn

+0

Вы также можете захотеть просмотреть хранимые процедуры или параметризованные запросы, это было бы очень небезопасно, особенно если это было открыто, он очень открыт для sql инъекций. –

ответ

3

Вы можете использовать INSERT SELECT вместо INSERT VALUES. такие как.

INSERT INTO MyTable (ColumnA, ColumnB, ColumnC) SELECT 'A', 'B', MAX(ColumnC) FROM MyOtherTable 

На другой ноте, хотя вы не должны создавать свой SQL так, как есть. Это подвержено SQL-инъекции. Кто-то может легко ввести «; DROP TABLE tblContract» в одно из ваших текстовых полей!

+0

Er, Access не будет выполнять несколько операторов с помощью команды DoCmd.RunSQL - это даст вам сообщение об ошибке «недопустимые символы после завершения SQL-запроса». –

+0

Кстати, это не значит, что вы не должны проверять ввод пользователя, просто, что приведенный пример SQL-инъекции не может произойти в Access (или в любой форме Jet/ACE, ни одна из которых не поддерживает пакетные SQL-запросы). –

1

Сначала вам нужно будет извлечь значение из другой таблицы, а затем использовать его для вставки в эту таблицу, вы также можете использовать триггер для этого. Имейте в виду, что вы можете иметь такое же значение дважды, если два пользователя одновременно выполняют один и тот же запрос ... вам понадобится заблокировать другую таблицу в этом случае ... max() проблематично

почему бы не использовать идентификатор а затем функцию scope_identity() для захвата после вставки в другую таблицу?

вы также понимаете, что вы делаете это SQL-инъекции нападение чтобы случиться

+2

SQL-инъекция в приложении VBA не может быть такой большой проблемой. –

+0

Да, но как долго это будет приложение VBA? Эти вещи часто получают жизнь от их собственных и портированы – n8wrl

+0

mgroves, некоторые люди используют Access как веб-интерфейс. Кроме того, разве вы не думаете, что вам следует защищать свои данные от недовольных сотрудников, а также посторонних? SQl Injection не должен поступать извне компании. Кроме того, научиться думать о таких вещах, как «Является ли это открытым для атаки», поможет карьере этого человека, когда он уйдет из Access. – HLGEM

0

Если я читаю ваш вопрос правильно вы хотите

INSERT INTO tblContract(col1..., testId) values 
    ('value1',..., (SELECT MAX(testID) FROM tblOther)); 

Будьте осторожны это может привести к проблемам с параллелизмом

+0

Вот как я думал, что это нужно сделать. – Powerlord

+3

А потом некоторые! Это не очень хорошая практика, и ее следует отпечатать сейчас! Либо знайте значение внешнего ключа заранее и вставляйте ему значение, либо вставляйте обе таблицы в одну транзакцию. – Randolpho

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