2016-09-16 3 views
0

У меня возникли проблемы с добавлением поля даты в мой оператор SQL - нет синтаксической ошибки, но это сохраняет дату как 1905-06-17 какие-либо советы, пожалуйста?Добавление даты в базу данных доступа с помощью инструкции SQL INSERT

Значение переменной является

ExpireDate : String; 

Значение

ExpireDate := DateToStr(IncYear(Today,1)); 

Заявление

datamodule1.qryDB1.SQL.Text := 'INSERT INTO table SET Member_ExpireDate = '+ ExpireDate +' WHERE Member_ID = .................'; 
+0

Вам нужно вставить 'DateTime'? – Sami

+0

Насколько вы старались выглядеть, прежде чем задавать этот вопрос? Google нашел это достаточно легко: http://stackoverflow.com/questions/27271448/inserting-current-date-and-time-into-access-database – MartynA

ответ

1

Вы используете версию DateToStr(), которая опирается на текущие настройки ОС локали пользователя. БД имеют определенные форматы, в которых они ожидают, что строки даты/времени будут выражены, а настройки локали ОС могут не соответствовать этим форматам. Вы можете использовать перегруженную версию DateToStr(), которая принимает TFormatSettings в качестве входных данных, так что вы можете указать точное форматирование строки вывода (через TFormatSettings.ShortDateFormat члена):

var 
    fmt: TFormatSettings; 
    ExpireDate: string; 

fmt := TFormatSettings.Create; 
fmt.ShortDateFormat := 'yyyy-mm-dd'; 
ExpireDate := DateToStr(IncYear(Today,1), fmt); 

Кроме того, даты/время строке должны быть завернут в цитаты в операторах SQL. Вы можете использовать функцию QuotedStr() для этой цели.

Но что еще более важно, ваш INSERT заявление искажен в любом случае.

Если вы пытаетесь добавить новую запись, он должен выглядеть следующим образом, вместо:

datamodule1.qryDB1.SQL.Text := 'INSERT INTO table (Member_ID, Member_ExpireDate) VALUES (' + SomeIDValue + ', ' + QuotedStr(ExpireDate) + ')'; 

В противном случае, если вы пытаетесь изменить существующую запись, вам нужно использовать UPDATE заявление вместо:

datamodule1.qryDB1.SQL.Text := 'UPDATE table SET Member_ExpireDate = ' + QuotedStr(ExpireDate) + ' WHERE Member_ID = ' + SomeIDValue; 

в любом случае, было бы лучше использовать параметризованный запрос вместо. Пусть сама БД обрабатывать все необходимые форматирования для вас:

datamodule1.qryDB1.SQL.Text := 'INSERT INTO table (Member_ID, Member_ExpireDate) VALUES (:MemberID, :ExpireDate)'; 
datamodule1.qryDB1.ParamByName('MemberID').AsInteger := SomeIDValue; // or whatever data type your field uses 
datamodule1.qryDB1.ParamByName('ExpireDate').AsDate := IncYear(Today,1); 
datamodule1.qryDB1.ExecSQL; 

datamodule1.qryDB1.SQL.Text := 'UPDATE table SET Member_ExpireDate = :ExpireDate WHERE Member_ID = :MemberID'; 
datamodule1.qryDB1.ParamByName('ExpireDate').AsDate := IncYear(Today,1); 
datamodule1.qryDB1.ParamByName('MemberID').AsInteger := SomeIDValue; // or whatever data type your field uses 
datamodule1.qryDB1.ExecSQL; 
0

Спасибо за проблемы реагирования на решаемой ... следовало бы использовать # «+ EXPIREDATE +» # все работает прекрасно теперь благодаря ,

+1

Это не совсем точно. вам нужен конкретный формат даты, кроме '#' префикса/суффикса. я.e ''#' + FormatDateTime ('yyyy-MM-dd', DT) + '#'' read @ Ответ Remy для деталей. Ваше решение может завершиться неудачно в других ОС с использованием разных языков. – kobik

1

Не конвертируйте дату в строку. Вставьте данные в качестве даты и используйте параметры, чтобы свести к минимуму ошибки. Используя параметры, компонент форматирует формат данных как правильный формат.

var 
    ExpireDate : TDate; 
begin 
    ExpireDate := IncYear(Today,1); 
    datamodule1.qryDB1.SQL.Text := 
    'INSERT INTO table SET Member_ExpireDate = :expireDate WHERE Member_ID = ..'; 
    datamodule1.qryDB1.Params.ParamByName('expireDate').Value := ExpireDate; 

В зависимости от используемых компонентов, ParamByName может быть какой-то другой, но все TQuery потомок компоненты имеют этот метод.

С уважением.