mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
Implement rfe #792: Copy grid data as SQL
This commit is contained in:
BIN
res/icons/script_lightning.png
Normal file
BIN
res/icons/script_lightning.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 879 B |
@@ -1623,6 +1623,9 @@ object MDIChild: TMDIChild
|
||||
object CopyasXMLdata1: TMenuItem
|
||||
Action = MainForm.actCopyAsXML
|
||||
end
|
||||
object CopygriddataasSQL2: TMenuItem
|
||||
Action = MainForm.actCopyAsSQL
|
||||
end
|
||||
end
|
||||
object Exportdata2: TMenuItem
|
||||
Action = MainForm.actExportData
|
||||
@@ -1709,6 +1712,9 @@ object MDIChild: TMDIChild
|
||||
object CopyasXMLdata2: TMenuItem
|
||||
Action = MainForm.actCopyAsXML
|
||||
end
|
||||
object CopygriddataasSQL1: TMenuItem
|
||||
Action = MainForm.actCopyAsSQL
|
||||
end
|
||||
object Exportdata1: TMenuItem
|
||||
Action = MainForm.actExportData
|
||||
end
|
||||
|
||||
@@ -262,6 +262,8 @@ type
|
||||
menuViewSave: TMenuItem;
|
||||
N25: TMenuItem;
|
||||
menuViewDefault: TMenuItem;
|
||||
CopygriddataasSQL1: TMenuItem;
|
||||
CopygriddataasSQL2: TMenuItem;
|
||||
procedure menuRenameColumnClick(Sender: TObject);
|
||||
procedure ListColumnsNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
||||
Column: TColumnIndex; NewText: WideString);
|
||||
@@ -2180,6 +2182,7 @@ begin
|
||||
MainForm.actCopyAsCSV.Enabled := inDataOrQueryTabNotEmpty;
|
||||
MainForm.actCopyAsHTML.Enabled := inDataOrQueryTabNotEmpty;
|
||||
MainForm.actCopyAsXML.Enabled := inDataOrQueryTabNotEmpty;
|
||||
MainForm.actCopyAsSQL.Enabled := inDataOrQueryTabNotEmpty;
|
||||
MainForm.actExportData.Enabled := inDataOrQueryTabNotEmpty;
|
||||
MainForm.actHTMLView.Enabled := inDataOrQueryTabNotEmpty;
|
||||
setNull1.Enabled := inDataTab and Assigned(DataGrid.FocusedNode);
|
||||
|
||||
@@ -113,6 +113,7 @@ type
|
||||
procedure GridToHtml(Grid: TVirtualStringTree; GridData: PGridResult; Title: WideString; S: TStream);
|
||||
procedure GridToCsv(Grid: TVirtualStringTree; GridData: PGridResult; Separator, Encloser, Terminator: String; S: TStream);
|
||||
procedure GridToXml(Grid: TVirtualStringTree; GridData: PGridResult; root: WideString; S: TStream);
|
||||
procedure GridToSql(Grid: TVirtualStringTree; GridData: PGridResult; Tablename: WideString; S: TStream);
|
||||
function esc2ascii(str: String): String;
|
||||
function StrCmpBegin(Str1, Str2: string): Boolean;
|
||||
function Max(A, B: Integer): Integer; assembler;
|
||||
@@ -1013,6 +1014,69 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{***
|
||||
Converts a TDataSet to XML.
|
||||
@param Grid Object which holds data to export
|
||||
@param string Text used as tablename in INSERTs
|
||||
}
|
||||
procedure GridToSql(Grid: TVirtualStringTree; GridData: PGridResult; Tablename: WideString; S: TStream);
|
||||
var
|
||||
i: Integer;
|
||||
tmp, Data: WideString;
|
||||
Node: PVirtualNode;
|
||||
begin
|
||||
// Avoid reloading discarded data before the end.
|
||||
Grid.Visible := false;
|
||||
Node := Grid.GetFirst;
|
||||
while Assigned(Node) do begin
|
||||
if (Node.Index+1) mod 100 = 0 then
|
||||
ExportStatusMsg(Node, Grid.RootNodeCount, S.Size);
|
||||
tmp := 'INSERT INTO '+Mainform.Mask(Tablename)+' (';
|
||||
for i:=0 to Grid.Header.Columns.Count-1 do begin
|
||||
// Skip hidden key columns
|
||||
if not (coVisible in Grid.Header.Columns[i].Options) then
|
||||
Continue;
|
||||
tmp := tmp + Mainform.mask(Grid.Header.Columns[i].Text)+', ';
|
||||
end;
|
||||
Delete(tmp, Length(tmp)-1, 2);
|
||||
tmp := tmp + ') VALUES (';
|
||||
// Data:
|
||||
for i:=0 to Grid.Header.Columns.Count-1 do begin
|
||||
// Skip hidden key columns
|
||||
if not (coVisible in Grid.Header.Columns[i].Options) then
|
||||
Continue;
|
||||
// Ensure basic data is loaded.
|
||||
Mainform.Childwin.EnsureChunkLoaded(Grid, Node);
|
||||
if GridData.Rows[Node.Index].Cells[i].IsNull then
|
||||
tmp := tmp + 'NULL'
|
||||
else begin
|
||||
// Load remainder of large fields.
|
||||
Mainform.Childwin.EnsureFullWidth(Grid, i, Node);
|
||||
Data := Grid.Text[Node, i];
|
||||
// Remove 0x.
|
||||
if GridData.Columns[i].IsBinary then Delete(Data, 1, 2);
|
||||
// Unformat float values
|
||||
if GridData.Columns[i].IsFloat then Data := FloatStr(Data);
|
||||
// Add data and cell end tag.
|
||||
tmp := tmp + esc(Data);
|
||||
end;
|
||||
tmp := tmp + ', ';
|
||||
end;
|
||||
Delete(tmp, Length(tmp)-1, 2);
|
||||
tmp := tmp + ');' + CRLF;
|
||||
StreamWrite(S, tmp);
|
||||
// Release some memory.
|
||||
Mainform.Childwin.DiscardNodeData(Grid, Node);
|
||||
Node := Grid.GetNext(Node);
|
||||
end;
|
||||
// footer:
|
||||
tmp := CRLF;
|
||||
StreamWrite(S, tmp);
|
||||
Grid.Visible := true;
|
||||
Mainform.showstatus(STATUS_MSG_READY);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{***
|
||||
Return ASCII-Values from MySQL-Escape-Sequences
|
||||
|
||||
@@ -605,6 +605,14 @@ object MainForm: TMainForm
|
||||
Hint = 'Copy|Copy to Clipboard'
|
||||
ImageIndex = 3
|
||||
end
|
||||
object actCopyAsSQL: TAction
|
||||
Category = 'Export/Import'
|
||||
Caption = 'Copy grid data as SQL'
|
||||
Enabled = False
|
||||
Hint = 'Copy grid data as SQL'
|
||||
ImageIndex = 114
|
||||
OnExecute = actCopyAsSQLExecute
|
||||
end
|
||||
object actPaste: TEditPaste
|
||||
Tag = 58
|
||||
Category = 'Various'
|
||||
@@ -4429,6 +4437,42 @@ object MainForm: TMainForm
|
||||
0049454E44AE426082}
|
||||
Name = 'PngImage113'
|
||||
Background = clWindow
|
||||
end
|
||||
item
|
||||
PngImage.Data = {
|
||||
89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
|
||||
610000001974455874536F6674776172650041646F626520496D616765526561
|
||||
647971C9653C0000036F4944415478DA4D930D6C535514C7FFF7BDBE7EAD5D5B
|
||||
F6B6E0D6D05A3E034160BAC918B2A9894641D785652E3295405408601A64C684
|
||||
84440209A08B9B128711020435C628C8571650E26640D9DCC2E23473800EB7D0
|
||||
8CAD5DD78EF5E37D7ADE0B106EF27BE7E6BEDCFF3DE77FEE65BAAEC3186F7C37
|
||||
524EA125E4B557A4650D06B2A621A368495A9F2262844A2488387182B8C8EE0B
|
||||
BCF6CDD0B625335D9FECA82EC4C3635A223122915521C9402AA7E256EC2EDA6F
|
||||
4E4FD0EFC80381755FDED85315F2ED7C6B85889149150263B03080B7103C60E5
|
||||
28721C049A67151D5787D2F8A22B3AFE40A0F5CCE15361FFCF61B7A0234727EA
|
||||
2AA118918E451ED88266522942898747E4D87F38D01840F34FB7600AC4FB9EE6
|
||||
AFC5170D2C0FD9E7F2422174593151A50C32137F2329AE872EAE06CF38840A79
|
||||
BC7BA41FE1A7FC38D8311C350562BD55C19C6CB92906C3BC92EC01675F06251D
|
||||
4726F617465D0DC889B5A0CCCD52163F22A0B1A50759414FD1521D1BEF5965A5
|
||||
7477D9BC8FEDB4E52F82347A1A9CFB19C4AF9F424CDC82A98206B3441E3A040B
|
||||
87C7FD16ACFBAC0B19492E38B37DE504BBD355F9A42E6BE7BCA17A515755C889
|
||||
7E70C21C8CFDD38E29D78BC63640C942636E28C56BB174EE2C34B474222B2BDE
|
||||
F3EF3F9B64A3972BBAEDE21365BA2C4123D3ACCE59609A056A769A4AB80195D6
|
||||
53D13EA4667F002E5083852579A8DD7751A1A4AC1776BDA0B36847F98EC9B463
|
||||
DED5B1D2375F2E2B4672E8340AFCD5503293488F0D20CE2DC6DDE016E8CE0066
|
||||
3819F2AD12D637FF78FBD2DE1ABF519A696275D3B70B8A7CEE81AF9B5662F8EC
|
||||
2A385C41241377902ADE864CC95AE81AA30E007E6A612299C0F643977EEFF8B0
|
||||
BEDC14A87CE78448B12D5C555A57E739004B7604A3CA7C8C3FBA1B56879B8C03
|
||||
2C3C071B7520E8E3D13B781BBB8F759EBBDCDAF89229B07CD39157281E7D6EFE
|
||||
84A3B6E80774E6366250A9404E6690C813852E944659CEF078B0F9F999E81BF8
|
||||
176D27AF1CFDAD6DC30653A06CE3A1FD35D54BDE6B5AE323C7196CDE7966DB54
|
||||
BAA0327D24C32E9A1F6C8FA2BEB208177EFD13C7CF777FD47DF8ED2653A0F4F5
|
||||
4F37AD5836A7AD7C61005E97035E8F1DBE3C1B3C84DB69858D1E818DFA3F1C57
|
||||
28029F7F7F05677FE98FF41EDFDA6A0A2C7DF563C3830811200AEEE1BB87C76E
|
||||
1504BB5D407E1E89E73BF1C7E0C875E3ED5DFB2AD26308FC0FDF3573A18B3D62
|
||||
A30000000049454E44AE426082}
|
||||
Name = 'PngImage114'
|
||||
Background = clWindow
|
||||
end>
|
||||
PngOptions = [pngBlendOnDisabled, pngGrayscaleOnDisabled]
|
||||
Left = 8
|
||||
|
||||
@@ -214,6 +214,7 @@ type
|
||||
actDataCancelChanges: TAction;
|
||||
ToolButton1: TToolButton;
|
||||
actRemoveFilter: TAction;
|
||||
actCopyAsSQL: TAction;
|
||||
procedure refreshMonitorConfig;
|
||||
procedure loadWindowConfig;
|
||||
procedure saveWindowConfig;
|
||||
@@ -296,6 +297,7 @@ type
|
||||
procedure HandleWMRefill(var msg: TMessage); message WM_REFILL_SPAREBUF;
|
||||
procedure ReplaceDialogQueryFind(Sender: TObject);
|
||||
procedure ReplaceDialogQueryReplace(Sender: TObject);
|
||||
procedure actCopyAsSQLExecute(Sender: TObject);
|
||||
private
|
||||
FDelimiter: String;
|
||||
function GetChildwin: TMDIChild;
|
||||
@@ -1195,6 +1197,30 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
procedure TMainForm.actCopyAsSQLExecute(Sender: TObject);
|
||||
var
|
||||
S: TMemoryStream;
|
||||
Tablename: WideString;
|
||||
GridData: PGridResult;
|
||||
begin
|
||||
// Copy data in focused grid as SQL
|
||||
Screen.Cursor := crHourglass;
|
||||
S := TMemoryStream.Create;
|
||||
if ChildWin.ActiveGrid = Childwin.DataGrid then Tablename := Childwin.SelectedTable
|
||||
else Tablename := 'unknown';
|
||||
try
|
||||
GridData := ChildWin.ActiveData;
|
||||
GridToSql(ChildWin.ActiveGrid, GridData, Tablename, S);
|
||||
StreamToClipboard(S);
|
||||
finally
|
||||
ShowStatus('Freeing data...');
|
||||
S.Free;
|
||||
ShowStatus(STATUS_MSG_READY);
|
||||
Screen.Cursor := crDefault;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TMainForm.actExportDataExecute(Sender: TObject);
|
||||
var
|
||||
Grid: TVirtualStringTree;
|
||||
|
||||
Reference in New Issue
Block a user