Für mein Projekt habe ich eine Kopier Funktion erstellt. Klappt inzwischen auch soweit. Jedoch würde ich gerne, wie bisher im Projekt auf
"prepared statements" setzten.
Ich nutzte eine MariaDB(mysql57conn) als Datenbank.
Ich habe natürlich auch gesucht im Internet, jedoch scheinen das viele so zu machen.
Code: Alles auswählen
procedure TPLNoteManager2.AddNote2(Items: TObjectList; const aTargetDirectory: Integer);
var
str:String;
TempID,i:Integer;
DirectoryItem:TPLNoteManager2DirectoryItem;
NoteItem:TPLNoteManager2NoteItem;
begin
str:='INSERT INTO NoteTable ('+
'DirectoryID, ' +
'Title, ' +
'Text, ' +
'CreateDateTime, ' +
'LastReadDateTime, ' +
'LastwriteDateTime, ' +
'ReadCount, ' +
'WriteCount, ' +
'UserID, ' +
'EncryptByUserPassword'+
') ' +
'VALUES ';
MariaDB.Query2.Prepare;
for i:=0 to Items.Count-1 do begin
NoteItem:=Items[i] as TPLNoteManager2NoteItem;
str:=str+'('+
IntToStr(NoteItem.DirectoryID)+','+
QuotedStr(NoteItem.Title)+','+
QuotedStr(NoteItem.Text)+','+
QuotedStr(DateTimeToStr(NOW,DefaultSQLFormatSettings))+','+
QuotedStr('0')+','+
QuotedStr('0')+','+
// QuotedStr(DateTimeToStr(NoteItem.LastReadDateTime,DefaultSQLFormatSettings))+','+
// QuotedStr(DateTimeToStr(NoteItem.LastWriteDateTime,DefaultSQLFormatSettings))+','+
IntToStr(NoteItem.ReadCount)+','+
IntToStr(NoteItem.WriteCount)+','+
IntToStr(NoteItem.UserID)+','+
BoolToStr(NoteItem.EncryptByUserPassword)+''+
')';
if i < Items.Count-1 then
str:=str+',';
end;
writeln();
writeln(str);
writeln();
MariaDB.Query.SQL.Text:=str;
MariaDB.Query.ExecSQL;
MariaDB.Query.Close;
MariaDB.ATransaction.Commit;
DirectoryItem:=FindDirectoryByDirectoryID(aTargetDirectory,DirectoryItemlist);
if Assigned(DirectoryItem) then begin
if not DirectoryItem.Used then begin
DirectoryItem.Used:=UpdatetUsedDirectory(DirectoryItem.DirectoryID);
end;
end;
end; // TPLNoteManager2.AddNote2
Code: Alles auswählen
var
str:String;
TempID:Integer;
DirectoryItem:TPLNoteManager2DirectoryItem;
begin
str:='INSERT INTO NoteTable (' +
'NoteID, ' +
'DirectoryID, ' +
'Title, ' +
'Text, ' +
'CreateDateTime, ' +
'LastReadDateTime, ' +
'LastwriteDateTime, ' +
'ReadCount, ' +
'WriteCount, ' +
'UserID, ' +
'EncryptByUserPassword' +
') VALUES (' +
':NoteID, ' +
':DirectoryID, ' +
':Title, ' +
':Text, ' +
':CreateDateTime, ' +
':LastReadDateTime, ' +
':LastwriteDateTime, ' +
':ReadCount, ' +
':WriteCount, ' +
':UserID, ' +
':EncryptByUserPassword' +
');';
MariaDB.Query.SQL.Text:=str;
MariaDB.Query.ParamByName('NoteID').AsInteger:=aNote.NoteID;
MariaDB.Query.ParamByName('DirectoryID').AsInteger:=aNote.DirectoryID;
MariaDB.Query.ParamByName('Title').AsString:=aNote.Title;
MariaDB.Query.ParamByName('Text').AsString:=aNote.Text;
MariaDB.Query.ParamByName('CreateDateTime').AsDateTime:=aNote.CreateDateTime;
MariaDB.Query.ParamByName('LastReadDateTime').AsDateTime:=aNote.LastReadDateTime;
MariaDB.Query.ParamByName('LastwriteDateTime').AsDateTime:=aNote.LastWriteDateTime;
MariaDB.Query.ParamByName('ReadCount').AsInteger:=aNote.ReadCount;
MariaDB.Query.ParamByName('WriteCount').AsInteger:=aNote.WriteCount;
MariaDB.Query.ParamByName('UserID').AsInteger:=aNote.UserID;
MariaDB.Query.ParamByName('EncryptByUserPassword').AsBoolean:=aNote.EncryptByUserPassword;
MariaDB.Query.ExecSQL;
// Die NoteID gleich ändern. Das geht aber erst nach dem Hinzufügen. Da voher die ID nicht bekannt ist.
aNote.NoteID:=MariaDB.AConnection.GetInsertID;
MariaDB.ATransaction.Commit;
DirectoryItem:=FindDirectoryByDirectoryID(aNote.DirectoryID,DirectoryItemlist);
if Assigned(DirectoryItem) then begin
if not DirectoryItem.Used then begin
DirectoryItem.Used:=UpdatetUsedDirectory(DirectoryItem.DirectoryID);
end;
end;