2014-11-09 2 views
0

У меня возникла проблема с моей операцией mysql.Sql Синтаксис, дающий неизвестную ошибку синтаксиса

в основном код отлично работает при вставке, но как только addnew variable = false и он переключается на обновление, он дает мне ошибку, которую я не могу решить.

Кодекс:

procedure Tadddomain.BitBtn2Click(Sender: TObject); 
Var 
PrevSql:String; 
ID:String; 
begin 
With Datalive.domains Do 
Begin 
    id:=fieldbyname('id').AsString; 
    Active:=False; 
    prevsql:=sql.Text; 
    Sql.Clear; 
    Params.Clear; 
    Addparam(Datalive.domains,'client_id',ftinteger,datalive.clients.FieldByName('id').AsString); 
    Addparam(Datalive.domains,'domain_name',ftString,Edit1.Text); 
    Addparam(Datalive.domains,'register_date',ftdate,DateTimePicker1.Date); 
    Addparam(Datalive.domains,'registered_until',ftdate,DateTimePicker2.Date); 
    if addnew=true then 
    Sql.Text:='Insert into domains (client_id,domain_name,register_date,registered_until) VALUES (:client_id,:domain_name,:register_date,:registered_until)' 
    Else if addnew=False then 
    Sql.Text:='Update domains (domain_name=:domain_name, register_date=:register_date, registered_until=:registered_until) where id='''+id+''''; 
    Showmessage(sql.text); 
    execsql; 
    sleep(100); 
    sql.Text:=prevsql; 
    active:=True; 
    done:=True; 
    adddomain.Close; 
End; 
end; 

Ошибка:

Project project1.exe raised exception class EZSQLException with message 'SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near '(domain_name='asd',register_date='2014-11-09',registered_until='2015-11-09') w' at line 1'.

Любая помощь будет большим, я искал и искал и не может найти неисправность.


Update:

Я изменил код редактирования, как предложено ниже, а теперь нет ошибок появляться, что так всегда. Но и ничего не происходит. Он не редактирует запись.

if addnew=true then 
    Sql.Text:='Insert into domains (client_id,domain_name,register_date,registered_until) VALUES (:client_id,:domain_name,:register_date,:registered_until)' 
    Else if addnew=False then 
    Begin 
    sql.Add('Update domains'); 
    sql.Add('set domain_name=:domain_name,'); 
    sql.Add('register_date=:register_date,'); 
    sql.Add('registered_until=:registered_until'); 
    sql.Add('where id=:id'); 
    End; 
+1

команда обновления в mysql идет как 'набор команд обновления col1 =: col1, col2 =: col2, где id =: id', используя подготовленный оператор. –

+0

Я не уверен в добавлении значений параметров до того, как запрос разобран (или скомпилирован базовой СУБД). Но в вашем коде есть и другие проблемы. Параметр типа 'ftInteger' вы заполняете строковым значением. 'AddNew', так как некоторая глобальная переменная области видимости не может быть чем-то еще, кроме' False', если ее проверка на 'True' терпит неудачу. Бессмысленный 'Сон', используя' with' ... – TLama

+0

Привет @Tlama Я не замечал целую и строчную ошибку. Но это не вызвало проблемы с вставкой. Переменная addNew - это логическое значение, которое просто указывает код, следует ли вставить, если он является ложным, а затем пытается обновить. Но вы не решили проблему. Вы упомянули все, кроме основной проблемы. – Marcel

ответ

0

Я нашел эту проблему. Если я определяю параметры, прежде чем использовать функцию sql.add(), параметры будут отброшены. Когда я переехал

Addparam(Datalive.domains,'client_id',ftinteger,datalive.clients.FieldByName('id').AsString); 
    Addparam(Datalive.domains,'domain_name',ftString,Edit1.Text); 
    Addparam(Datalive.domains,'register_date',ftdate,DateTimePicker1.Date); 
    Addparam(Datalive.domains,'registered_until',ftdate,DateTimePicker2.Date); 

только перед execsql; проблема была решена.

+0

В этом проблема с движущимися целевыми вопросами, название не соответствует окончательному решению. – bummi

0

синтаксис Обновление как этот

Update domains 
set domain_name = :domain_name, 
    register_date = :register_date, 
    registered_until = :registered_until 
where id = :id 
+0

та же ошибка @juergend – Marcel

+1

@Marcel. , , Вы не можете получить * точно * ту же ошибку, потому что в ваших сообщениях об ошибках говорится, что проблема близка к «(имя_домена ...», и это не относится к запросу Юргена. –

+0

@Gordonlinoff благодарит вас за указание разницы в строке. – Marcel

0

Вы объявляете параметр «client_id» не параметр «идентификатор» используется в операторе обновления.

where id = :id 

должен быть

where id = :client_id 
Смежные вопросы