commit e40702dd8143dcf093c65f4505ab15e043f2938c Author: richie Date: Tue May 29 09:18:56 2018 +0800 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..898321d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +lib/report/*.jar diff --git a/README.md b/README.md new file mode 100644 index 0000000..d33fa61 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# SQL全屏编辑 +操作界面 +![1](effect/better.png) +全屏界面 +![2](effect/full.png) diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..37eff34 --- /dev/null +++ b/build.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/install/fr-plugin-better-sql-editor-2.4.zip b/install/fr-plugin-better-sql-editor-2.4.zip new file mode 100644 index 0000000..aa03e52 Binary files /dev/null and b/install/fr-plugin-better-sql-editor-2.4.zip differ diff --git a/lib/report/.gitkeep b/lib/report/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugin-bettersqleditor.iml b/plugin-bettersqleditor.iml new file mode 100644 index 0000000..648ed75 --- /dev/null +++ b/plugin-bettersqleditor.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..301dd68 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,23 @@ + + com.fr.solution.plugin.better.sql.editor + + yes + 2.4 + 8.0 + 2015-12-20 + solution + + + [2015-12-20]修复在新版本中无法使用的情况。
+ [2016-03-25]国际化。
+ ]]> +
+ + + + + + + +
\ No newline at end of file diff --git a/shop/full12_200.png b/shop/full12_200.png new file mode 100644 index 0000000..6ae5f28 Binary files /dev/null and b/shop/full12_200.png differ diff --git a/shop/full12_400.png b/shop/full12_400.png new file mode 100644 index 0000000..753aeab Binary files /dev/null and b/shop/full12_400.png differ diff --git a/src/com/fr/solution/plugin/better/sql/editor/BetterConstants.java b/src/com/fr/solution/plugin/better/sql/editor/BetterConstants.java new file mode 100644 index 0000000..b470bea --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/BetterConstants.java @@ -0,0 +1,9 @@ +package com.fr.solution.plugin.better.sql.editor; + +/** + * Created by richie on 16/3/25. + */ +public class BetterConstants { + + public static final String PLUGIN_ID = "com.fr.solution.plugin.better.sql.editor"; +} diff --git a/src/com/fr/solution/plugin/better/sql/editor/BetterDBTableDataImpl.java b/src/com/fr/solution/plugin/better/sql/editor/BetterDBTableDataImpl.java new file mode 100644 index 0000000..d1d4103 --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/BetterDBTableDataImpl.java @@ -0,0 +1,46 @@ +package com.fr.solution.plugin.better.sql.editor; + +import com.fr.base.TableData; +import com.fr.data.impl.DBTableData; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.fun.ServerTableDataDefineProvider; +import com.fr.design.fun.impl.AbstractTableDataDefineProvider; +import com.fr.general.Inter; + +/** + * @author richie + * @date 2015-06-04 + * @since 8.0 + */ +public class BetterDBTableDataImpl extends AbstractTableDataDefineProvider implements ServerTableDataDefineProvider { + + @Override + public Class classForTableData() { + return DBTableData.class; + } + + @Override + public Class classForInitTableData() { + return DBTableData.class; + } + + @Override + public Class appearanceForTableData() { + return BetterDBTableDataPane.class; + } + + @Override + public String nameForTableData() { + return Inter.getLocText("DS-Database_Query"); + } + + @Override + public String prefixForTableData() { + return "ds"; + } + + @Override + public String iconPathForTableData() { + return "/com/fr/design/images/data/database.png"; + } +} \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/BetterDBTableDataPane.java b/src/com/fr/solution/plugin/better/sql/editor/BetterDBTableDataPane.java new file mode 100644 index 0000000..bfbea6a --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/BetterDBTableDataPane.java @@ -0,0 +1,379 @@ +package com.fr.solution.plugin.better.sql.editor; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.Parameter; +import com.fr.base.ParameterHelper; +import com.fr.data.core.db.TableProcedure; +import com.fr.data.impl.DBTableData; +import com.fr.data.impl.NameDatabaseConnection; +import com.fr.design.actions.UpdateAction; +import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.UIConstants; +import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.datapane.sqlpane.SQLEditPane; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.data.tabledata.tabledatapane.MaxMemRowCountPanel; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; +import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.SeparatorDef; +import com.fr.design.menu.ToolBarDef; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.script.Calculator; +import com.fr.stable.ArrayUtils; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.util.ArrayList; + +/** + * @author richie + * @date 2015-06-04 + * @since 8.0 + */ +public class BetterDBTableDataPane extends AbstractTableDataPane { + private static final String PREVIEW_BUTTON = Inter.getLocText("Preview"); + private static final String REFRESH_BUTTON = Inter.getLocText("Refresh"); + private ConnectionTableProcedurePane connectionTableProcedurePane; + private UITableEditorPane editorPane; + + private SQLEditPane sqlTextPane; + private RTextScrollPane sqlTextScrollPane; + private UICheckBox isShareCheckBox; + private MaxMemRowCountPanel maxPanel; + private String pageQuery = null; + + + public BetterDBTableDataPane() { + this.setLayout(new BorderLayout(4, 4)); + + Box box = new Box(BoxLayout.Y_AXIS); + + sqlTextPane = new SQLEditPane(); + sqlTextPane.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_SQL); + JPanel northPane = new JPanel(new BorderLayout(4, 4)); + JToolBar editToolBar = createToolBar(); + northPane.add(editToolBar, BorderLayout.CENTER); + northPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 6, 0)); + + sqlTextScrollPane = new RTextScrollPane(sqlTextPane); + sqlTextScrollPane.setLineNumbersEnabled(true); + sqlTextScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + sqlTextScrollPane.setPreferredSize(new Dimension(680, 600)); + + JPanel paraMeanPane = new JPanel(new BorderLayout()); + paraMeanPane.setPreferredSize(new Dimension(680, 90)); + UILabel paraMean = new UILabel(Inter.getLocText("Datasource-Param_DES")); + paraMeanPane.add(paraMean, BorderLayout.CENTER); + + ParameterTableModel model = new ParameterTableModel() { + @Override + public UITableEditAction[] createAction() { + return (UITableEditAction[]) ArrayUtils.add(super.createDBTableAction(), new RefreshAction()); + } + }; + editorPane = new UITableEditorPane(model); + + box.add(northPane); + box.add(sqlTextScrollPane); + box.add(paraMeanPane); + box.add(editorPane); + + JPanel sqlSplitPane = new JPanel(new BorderLayout(4, 4)); + sqlSplitPane.add(box, BorderLayout.CENTER); + + // 左边的Panel,上面是选择DatabaseConnection的ComboBox,下面DatabaseConnection对应的Table + connectionTableProcedurePane = new ConnectionTableProcedurePane(); + connectionTableProcedurePane.addDoubleClickListener(new ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener() { + + @Override + public void actionPerformed(TableProcedure target) { + Document document = sqlTextPane.getDocument(); + try { + document.insertString(sqlTextPane.getCaretPosition(), target.toString(), null); + } catch (BadLocationException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + // 这里开始作色,本来可以给sqlTextPane添加DocumentListener来实现的, + // 后来发现insertString的时候,锁定了JTextPane,不能调用setXXX来作色,先这样了. +// sqlTextPane.syntaxTexts(); + sqlTextPane.requestFocus(); + } + }); + sqlTextPane.addFocusListener(new FocusListener() { + public void focusGained(FocusEvent e) { + + } + + public void focusLost(FocusEvent e) { + if (isPreviewOrRefreshButton(e)) { + checkParameter(); + } + } + }); + + this.add(connectionTableProcedurePane, BorderLayout.WEST); + this.add(sqlSplitPane, BorderLayout.CENTER); + } + + private boolean isPreviewOrRefreshButton (FocusEvent e) { + if (e.getOppositeComponent() != null) { + String name = e.getOppositeComponent().getName(); + return ComparatorUtils.equals(name, PREVIEW_BUTTON) || ComparatorUtils.equals(name, REFRESH_BUTTON); + } + return false; + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("DS-Database_Query"); + } + + private void refresh() { + String[] paramTexts = new String[2]; + paramTexts[0] = sqlTextPane.getText(); + paramTexts[1] = pageQuery; + + java.util.List existParameterList = editorPane.update(); + Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]); + + editorPane.populate(ParameterHelper.analyzeAndUnionSameParameters(paramTexts, ps)); + } + + private JToolBar createToolBar() { + // p:工具栏. + ToolBarDef toolBarDef = new ToolBarDef(); + toolBarDef.addShortCut(new PreviewAction()); + toolBarDef.addShortCut(SeparatorDef.DEFAULT); + toolBarDef.addShortCut(new EditPageQueryAction()); + toolBarDef.addShortCut(SeparatorDef.DEFAULT); + toolBarDef.addShortCut(new FullScreenAction()); + + isShareCheckBox = new UICheckBox(Inter.getLocText("Is_Share_DBTableData")); + maxPanel = new MaxMemRowCountPanel(); + maxPanel.setBorder(null); + UIToolbar editToolBar = ToolBarDef.createJToolBar(); + toolBarDef.updateToolBar(editToolBar); + editToolBar.add(isShareCheckBox); + editToolBar.add(maxPanel); + + return editToolBar; + } + + private void checkParameter() { + String[] paramTexts = new String[2]; + paramTexts[0] = sqlTextPane.getText(); + paramTexts[1] = pageQuery; + + Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); + + if (parameters.length < 1 && editorPane.update().size() < 1) { + return; + } + boolean isIn = true; + java.util.List list = editorPane.update(); + java.util.List name = new ArrayList(); + for (int i = 0; i < list.size(); i++) { + name.add(list.get(i).getName()); + } + for (int i = 0; i < parameters.length; i++) { + if (!name.contains(parameters[i].getName())) { + isIn = false; + break; + } + } + if (list.size() == parameters.length && isIn) { + return; + } + // bug:34175 删了是否刷新对话框, 均直接刷新 + refresh(); + } + + @Override + public void populateBean(DBTableData dbtabledata) { + ParameterProvider[] parameters = null; + + Calculator c = Calculator.createCalculator(); + + parameters = dbtabledata.getParameters(c); + editorPane.populate(parameters); + + com.fr.data.impl.Connection db = null; + String query = null; + boolean isShare = false; + int maxMemeryRow = -1; + + db = dbtabledata.getDatabase(); + query = dbtabledata.getQuery(); + isShare = dbtabledata.isShare(); + maxMemeryRow = dbtabledata.getMaxMemRowCount(); + this.pageQuery = dbtabledata.getPageQuerySql(); + + this.connectionTableProcedurePane.setSelectedDatabaseConnection(db); + this.sqlTextPane.setText(query); + this.sqlTextPane.requestFocus(); + this.sqlTextPane.moveCaretPosition(this.sqlTextPane.getCaretPosition()); + + isShareCheckBox.setSelected(isShare); + maxPanel.setValue(maxMemeryRow); + } + + @Override + public DBTableData updateBean() { + String dbName = this.connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); + if (StringUtils.isBlank(dbName) || StringUtils.isBlank(this.sqlTextPane.getText())) { + try { + throw new Exception(Inter.getLocText("Connect_SQL_Cannot_Null") + "."); + } catch (Exception e) { + // JOptionPane.showMessageDialog(DBTableDataPane.this, + // Inter.getLocText("Connect_SQL_Cannot_Null") + "."); + } + } + + java.util.List parameterList = editorPane.update(); + Parameter[] parameters = parameterList.toArray(new Parameter[parameterList.size()]); + + DBTableData dbTableData = new DBTableData(); + dbTableData.setDatabase(new NameDatabaseConnection(dbName)); + + // p:必须先设置Parameters数组,因为setQuery里面会自动设置的 + + dbTableData.setParameters(parameters); + dbTableData.setQuery(this.sqlTextPane.getText()); + + dbTableData.setShare(isShareCheckBox.isSelected()); + dbTableData.setMaxMemRowCount(maxPanel.getValue()); + dbTableData.setPageQuerySql(this.pageQuery); + + return dbTableData; + } + + protected class RefreshAction extends UITableEditAction { + public RefreshAction() { + this.setName(REFRESH_BUTTON); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + } + + public void actionPerformed(ActionEvent e) { + refresh(); + } + + @Override + public void checkEnabled() { + } + } + + private class FullScreenAction extends UpdateAction { + public FullScreenAction() { + this.setName(Inter.getLocText("Plugin-Better_SQL_Editor")); + this.setMnemonic('P'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/solution/plugin/better/sql/editor/images/full.png")); + } + + public void actionPerformed(ActionEvent evt) { + final FullScreenSQLPane fullScreenSQLPane = new FullScreenSQLPane(sqlTextPane.getText()); + FullScreenSQLEditorDialog dialog = new FullScreenSQLEditorDialog(DesignerContext.getDesignerFrame(), fullScreenSQLPane); + dialog.setSize(Toolkit.getDefaultToolkit().getScreenSize()); + dialog.addDialogActionListener(new DialogActionAdapter() { + @Override + public void doOk() { + sqlTextPane.setText(fullScreenSQLPane.getText()); + } + + @Override + public void doCancel() { + + } + }); + dialog.setVisible(true); + } + } + + private class PreviewAction extends UpdateAction { + public PreviewAction() { + this.setName(PREVIEW_BUTTON); + this.setMnemonic('P'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + } + + public void actionPerformed(ActionEvent evt) { + checkParameter(); + PreviewTablePane.previewTableData(BetterDBTableDataPane.this.updateBean()); + } + } + + private class EditPageQueryAction extends UpdateAction { + public EditPageQueryAction() { + this.setName(Inter.getLocText("LayerPageReport_PageQuery")); + this.setMnemonic('L'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/text.png")); + } + + public void actionPerformed(ActionEvent e) { + final PageQueryPane pane = new PageQueryPane(); + pane.populate(pageQuery); + BasicDialog dialog = pane.showWindow(DesignerContext.getDesignerFrame()); + dialog.addDialogActionListener(new DialogActionAdapter() { + public void doOk() { + pageQuery = pane.update(); + checkParameter(); + } + }); + dialog.setVisible(true); + } + } + + private class PageQueryPane extends BasicPane { + private SQLEditPane pageQueryPane; + + public PageQueryPane() { + this.initComponents(); + } + + public void initComponents() { + this.setLayout(new BorderLayout()); + pageQueryPane = new SQLEditPane(); + this.add(new JScrollPane(pageQueryPane)); + } + + public void populate(String text) { + if (StringUtils.isBlank(text)) { + return; + } + pageQueryPane.setText(text); + } + + public String update() { + String text = pageQueryPane.getText(); + if (StringUtils.isBlank(text)) { + return null; + } else { + return text; + } + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("LayerPageReport_Define_PageQuerySQL"); + } + } +} \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/FullScreenSQLEditorDialog.java b/src/com/fr/solution/plugin/better/sql/editor/FullScreenSQLEditorDialog.java new file mode 100644 index 0000000..9e9dbdf --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/FullScreenSQLEditorDialog.java @@ -0,0 +1,27 @@ +package com.fr.solution.plugin.better.sql.editor; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.UIDialog; + +import java.awt.*; + +/** + * @author richie + * @date 2015-06-04 + * @since 8.0 + */ +public class FullScreenSQLEditorDialog extends UIDialog { + + public FullScreenSQLEditorDialog(Frame parent, BasicPane pane) { + super(parent, pane); + } + + public FullScreenSQLEditorDialog(Dialog parent, BasicPane pane) { + super(parent, pane); + } + + @Override + public void checkValid() throws Exception { + + } +} \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/FullScreenSQLPane.java b/src/com/fr/solution/plugin/better/sql/editor/FullScreenSQLPane.java new file mode 100644 index 0000000..9ca7e28 --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/FullScreenSQLPane.java @@ -0,0 +1,61 @@ +package com.fr.solution.plugin.better.sql.editor; + +import com.fr.design.data.datapane.sqlpane.SQLEditPane; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane; +import com.fr.general.Inter; +import com.fr.plugin.ExtraClassManager; +import com.fr.stable.fun.FunctionHelper; +import com.fr.stable.fun.FunctionProcessor; +import com.fr.stable.fun.impl.AbstractFunctionProcessor; + +import java.awt.*; + +/** + * @author richie + * @date 2015-06-04 + * @since 8.0 + */ +public class FullScreenSQLPane extends BasicPane { + + private static final FunctionProcessor SQL = new AbstractFunctionProcessor() { + @Override + public int getId() { + return FunctionHelper.generateFunctionID(BetterConstants.PLUGIN_ID); + } + + public String getLocaleKey() { + return Inter.getLocText("Plugin-Better_SQL_Editor"); + } + + @Override + public String toString() { + return Inter.getLocText("Plugin-Better_SQL_Editor"); + } + }; + + private SQLEditPane sqlTextPane; + + public FullScreenSQLPane(String text) { + FunctionProcessor processor = ExtraClassManager.getInstance().getFunctionProcessor(); + if (processor != null) { + processor.recordFunction(SQL); + } + setLayout(new BorderLayout()); + sqlTextPane = new SQLEditPane(); + sqlTextPane.setText(text); + RTextScrollPane sqlTextScrollPane = new RTextScrollPane(sqlTextPane); + sqlTextScrollPane.setLineNumbersEnabled(true); + + add(sqlTextScrollPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Plugin-Better_SQL_Editor"); + } + + public String getText() { + return sqlTextPane.getText(); + } +} \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/images/full.png b/src/com/fr/solution/plugin/better/sql/editor/images/full.png new file mode 100644 index 0000000..645d597 Binary files /dev/null and b/src/com/fr/solution/plugin/better/sql/editor/images/full.png differ diff --git a/src/com/fr/solution/plugin/better/sql/editor/locale/BetterLocaleFinder.java b/src/com/fr/solution/plugin/better/sql/editor/locale/BetterLocaleFinder.java new file mode 100644 index 0000000..f1bb94f --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/locale/BetterLocaleFinder.java @@ -0,0 +1,13 @@ +package com.fr.solution.plugin.better.sql.editor.locale; + +import com.fr.stable.fun.impl.AbstractLocaleFinder; + +/** + * Created by richie on 16/3/25. + */ +public class BetterLocaleFinder extends AbstractLocaleFinder { + @Override + public String find() { + return "com/fr/solution/plugin/better/sql/editor/locale/better"; + } +} diff --git a/src/com/fr/solution/plugin/better/sql/editor/locale/better.properties b/src/com/fr/solution/plugin/better/sql/editor/locale/better.properties new file mode 100644 index 0000000..4203848 --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/locale/better.properties @@ -0,0 +1 @@ +Plugin-Better_SQL_Editor=Better SQL Editor \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/locale/better_en_US.properties b/src/com/fr/solution/plugin/better/sql/editor/locale/better_en_US.properties new file mode 100644 index 0000000..4203848 --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/locale/better_en_US.properties @@ -0,0 +1 @@ +Plugin-Better_SQL_Editor=Better SQL Editor \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/locale/better_ja_JP.properties b/src/com/fr/solution/plugin/better/sql/editor/locale/better_ja_JP.properties new file mode 100644 index 0000000..3a04096 --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/locale/better_ja_JP.properties @@ -0,0 +1 @@ +Plugin-Better_SQL_Editor=SQL\u30A8\u30C7\u30A3\u30BF\u30FC \ No newline at end of file diff --git a/src/com/fr/solution/plugin/better/sql/editor/locale/better_zh_CN.properties b/src/com/fr/solution/plugin/better/sql/editor/locale/better_zh_CN.properties new file mode 100644 index 0000000..6cdaa83 --- /dev/null +++ b/src/com/fr/solution/plugin/better/sql/editor/locale/better_zh_CN.properties @@ -0,0 +1 @@ +Plugin-Better_SQL_Editor=SQL\u7F16\u8F91\u5668 \ No newline at end of file