2016-12-13 2 views
2

Я добавляю новые детали заказа к таблице в моем db. Один из столбцов имеет имя email, в форме, которую я создал для добавления нового заказа в моем приложении delphi, а затем в db, я использую TEdit s для передачи данных.Нулевое поле, не вставляющее NULL из пустого TEdit

Это код:

procedure TForm2.actAddComandaExecute(Sender: TObject); 
begin 
if dbmodule.comenziConnection.Connected then 
begin 
    if addOrderForm.ShowModal=mrok then 
begin 
    dbmodule.comenziQuery.SQL.Clear; 
    dbmodule.comenziQuery.SQL.Add('insert into `r33758pi_tipotask`.`comenzi` (stare, client, telefon, email, detalii, livrare, pret, user, status, observatii) values (:stare, :client, :telefon, :email, :detalii, :livrare, :pret, :user, :status, :observatii) ') ; 
    dbmodule.comenziQuery.Params.ParamByName('stare').AsString := addOrderForm.ComboBoxEx1.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('client').AsString := addOrderForm.Edit2.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('telefon').AsString := addOrderForm.Edit3.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('email').AsString := addOrderForm.Edit4.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('detalii').AsString := addOrderForm.Edit5.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('livrare').AsString := addOrderForm.ComboBoxEx6.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('pret').AsString := addOrderForm.Edit7.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('user').AsString := addOrderForm.ComboBoxEx8.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('status').AsString := addOrderForm.ComboBoxEx9.Text ; 
    dbmodule.comenziQuery.Params.ParamByName('observatii').AsString := addOrderForm.Edit10.Text ; 
    dbmodule.comenziQuery.ExecSQL ; 
end; 
end; 
end; 

Если я оставлю Edit4 пустые на форме все, вкладышах, но поле email для этого порядка не имеет значения Null, он показывает, как пустой - не пустой но нет данных.

Столбец email установлен как Null по умолчанию в db, так что это не проблема.

Screenie от верстака: enter image description here

Там должно быть 2 NULL, показывая между значениями там, но это просто пустой.

Любые идеи, почему?

Использование Rad Studio 10 Сиэтл и DBEXPRESS компоненты


EDIT

  • comenziQuery является TSQLQuery
  • dbmodule это имя data module, который держит дб компоненты
  • набор данных является TSimpleDataSet
  • comenziConnection это имя TSQLConnection

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

ответ

8

Пустая строка - это не то же самое, что строка NULL. Когда дело доходит до SQL, вам нужно понять разницу.

Вам нужно добавить какую-то логику, чтобы писать строковые значения Vs нулевые значения, такие как ...

if addOrderForm.Edit5.Text <> '' then 
    dbmodule.comenziQuery.Params.ParamByName('detalii').AsString := addOrderForm.Edit5.Text 
else 
    dbmodule.comenziQuery.Params.ParamByName('detalii').Value := NULL; 

Таким образом, если элемент управления редактирования является пустым, то NULL будут записаны в таблицу вместо пустой строки.

Как было предложено, это может также быть обернуты внутри общей функции, чтобы спасти вас на написание тонны кода:

function NullIfEmpty(const S: string): Variant; 
begin 
    if S <> '' then 
    Result := S 
    else 
    Result := NULL; 
end; 

И затем использовать его как ...

dbmodule.comenziQuery.Params.ParamByName('detalii'):= 
    NullIfEmpty(addOrderForm.Edit5.Text); 
+0

Получение следующей ошибки: Драйвер dbExpress не поддерживает тип данных TDBXTypes.UNKNOWN. Сообщение об ошибке поставщика:. – Petzy

+0

@tcsh Сложно сказать, потому что из вашего описания я принимал компоненты ADO. Я также не очень хорошо знаком с MySQL, в отличие от MSSQL. Но концепция такая же. –

+0

Yup, похоже, проблема с компонентами dbExpress, я посмотрю на это, спасибо! :) – Petzy

2

Проблема у Вас возникают из-за использования ParamByName('email').AsString, который будет установлен столбец электронной почты в пустую строку. Если вы хотите, чтобы оставаться нулевой Я хотел бы использовать такой код, чтобы очистить параметр,

if Trim(addOrderForm.Edit4.Text) = '' then 
    dbmodule.comenziQuery.Params.ParamByName('email').Clear 
else 
    dbmodule.comenziQuery.Params.ParamByName('email').AsString := Trim(addOrderForm.Edit4.Text); 
+0

Спасибо за ответ! – Petzy

-6

Вы должны использовать TDB * компоненты, которые автоматически обрабатывать такие проблемы.

+2

А? Стандартные компоненты, поддерживающие db, устанавливают поля в Null? – MartynA

+0

Это неправда. – Andreas

+0

Hello Downvoter: Это то, что я делаю в своих программах (ado, access). Когда вы устанавливаете источник данных и поле данных и оставляете элемент управления пустым, таблица содержит NULL в поле данных, и вы можете после проверки почты указать NULL, например. VARISNULL() –

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