Witam.
Czy da się w jakiś sposób przypisać do zmiennej typu String, wartości typu variant - NULL? Potrzebuję ze względu na to, iż w bazie danych mam pola typu integer, które są kluczami obcymi, ale mogą przyjmować wartość NULL. Pustego ciągu nie chcą łyknąć.
to się po prostu nie podaje tego pola w insert
No faktycznie. Dzięki. Zaćmienie umysłowe. Heh. No dobrze. Ale załóżmy, że jednak muszę. Po prostu sytuacje mam taką, że importuję masę rekordów, z tym że część to pole ma wpisane, a część nie. I co wtedy?? A import robię automatem (napisałem sobie programik) z pliku CSV. Nazwy pół również pobieram automatem z pliku CSV.
No to zmień ten programik ;). Jeśli pole jest wypełnione, to daj w zapytaniu wartość, w przeciwnym razie - nie.
a nie możesz dać samego NULL w zapytaniu insert ?
To ja może pokażę kod procedury:
procedure TForm1.Button1Click(Sender: TObject);
var f : TextFile;
s : String;
temp : TTableString;
plik : TTableString;
sql : String;
sql2 : String;
sql3 : String;
tabela : String;
i : Integer;
begin
if OpenDialog1.Execute then
begin
plik := explode(OpenDialog1.FileName, '.');
sql3 := 'delete from ' + ExtractFileName(plik[0]) + ';' + #13;
AssignFile(f, OpenDialog1.FileName);
Reset(f);
readln(f, s);
temp := explode(s, ';');
sql := sql + 'insert into ' + ExtractFileName(plik[0]) + ' (';
for i := Low(temp) to High(temp) do
begin
if i <> High(temp) then sql := sql + temp[i] + ', '
else sql := sql + temp[i] + ') values (';
end;
while not eof(f) do
begin
readln(f, s);
SetLength(temp, 0);
temp := explode(s, ';');
sql2 := sql;
for i := Low(temp) to High(temp) do
begin
if i <> High(temp) then
begin
if i = 3 then
if temp[i] = '' then temp[i] := '31';
<font color="red"> if i = 7 then
if temp[i] = '' then temp[i] := NULL;
if i = 9 then
if temp[i] = '' then temp[i] := NULL;
if i = 12 then
if temp[i] = '' then temp[i] := NULL;</font>
sql2 := sql2 + '"' + temp[i] + '", ';
end
else sql2 := sql2 + '"' + temp[i] + '");' + #13;
end;
sql3 := sql3 + sql2;
end;
CloseFile(f);
AssignFile(f, ExtractFileName(plik[0]) + '.sql');
Rewrite(f);
write(f, sql3);
CloseFile(f);
end;
Label1.Caption := 'Tworzenie skryptu SQL z danymi ukończone';
end;
Kolorem czerwonym zaznaczyłem newralgiczny punkt. Program, może nie jest wysokich lotów, ale działa poprawnie w przypadku, gdy w pliku CSV wszystkie dane są.
if i <> High(temp) then
begin
if i = 3 then
if temp[i] = '' then temp[i] := '"31"'
else if i = 7 then
if temp[i] = '' then temp[i] := 'NULL'
else if i = 9 then
if temp[i] = '' then temp[i] := 'NULL'
else if i = 12 then
if temp[i] = '' then temp[i] := 'NULL'
else
temp[i] := '"' + temp[i] + '"';
sql2 := sql2 + temp[i] + ', ';
end
else sql2 := sql2 + temp[i] + ');' + #13;
i powinno być ok
Zaraz sprawdzę to co napisałeś.
zapomniałem cudzysłowi, teraz już powinno być ok
Dzięki, działa.