SQL语句内容处理——给每行内容都添加单引号和逗号
一、需求描述
当我们在日常开发或者运维过程中,会遇到业务人员提出给她们查询大量编号对应的数据内容,此时我们需要在SQL语句里面使用in函数包含这些需要查询的编号,此时就需要给每个编号的收尾添加单引号和逗号才能够查询,如果手工给这些编号添加那么效率太低了,且容易出错;具体需求如下:
二、需求分析
现有大量的编号需要给每个编号的收尾添加单引号和逗号,方便在执行sql语句查询。
三、编写工具实现
3.1、实现功能
《1》可以使用快捷键Ctrl+C复制内容然后在工具这里按下Ctrl+V粘贴内容;或者直接点击鼠标右键粘贴内容【使用.NET5.0框架开发】;
《2》可以选用2种方法给每行内容添加单引号和逗号;
《3》可以选择是否需要给每行内容的收尾空格剔除,然后在收尾添加单引号和逗号;
《4》可以直接清空剪贴板的内容;
《5》一键复制所有处理好的内容;
3.2、实现该工具功能的一些核心技术
1、获取剪贴板内容并让鼠标光标移动到最后
/// <summary>/// 获取剪贴板的文本数据/// </summary>/// <param name="textBox">需要显示粘贴板数据的TextBox控件</param>private void GetClipboardTextDatas(TextBox textBox){if (Clipboard.ContainsText()){textBox.Text = Clipboard.GetText();让光标显示在内容最后//textBox_Datas1.SelectionStart= textBox_Datas1.Text.Length;//光标定位到文本最后textBox.Select(textBox.TextLength, 0);//滚动到光标处textBox.ScrollToCaret();}}
2、实现拦截默认快捷键的事件,单独编写快捷键内容
//自定义事件委托方法private delegate void TextBoxPaste(bool use);//声明委托方法private TextBoxPaste textBoxPaste;private const Keys CopyKeys = Keys.Control | Keys.C;private const Keys PasteKeys = Keys.Control | Keys.V;protected override bool ProcessCmdKey(ref Message msg, Keys keyData){if ((keyData == CopyKeys) || (keyData == PasteKeys)){int keyNum = msg.WParam.ToInt32();//keyNum=86是Ctrl+V的数字if (keyNum == 86){//使用委托方法textBoxPaste(true);}return true;}else{return base.ProcessCmdKey(ref msg, keyData);}}private void textBox_Datas1_KeyDown(object sender, KeyEventArgs e){禁用默认的Ctrl+V粘贴//textBox_Datas1.ShortcutsEnabled = false;同时按下Ctrl+V粘贴数据到Text控件中//if (e.Modifiers == Keys.Control && e.KeyCode == Keys.V)//{// isCopyClipboard = false;// GetClipboardTextDatas(textBox_Datas1);//}//注册委托方法textBoxPaste += textBox_Datas1_KeyDown;}//定义委托方法private void textBox_Datas1_KeyDown(bool use){if (use){GetClipboardTextDatas(textBox_Datas1);isCopyClipboard = false;}}
3、对TextBox文本控件内容进行处理添加首尾单引号和逗号方法
/// <summary>/// 获取数据并添加前后单引号末尾添加逗号方法2/// </summary>/// <param name="OriginalDataTextBox">原始数据的TextBox控件</param>/// <param name="acceptTextBox">接收处理后数据的TextBox控件</param>/// <param name="isClearFirstAndLastSpace">是否去除每行内容的首尾空格</param>private void HandleDataMethod2(TextBox OriginalDataTextBox, TextBox acceptTextBox, bool isClearFirstAndLastSpace = false){StringBuilder sb = new StringBuilder();sb.Append(OriginalDataTextBox.Text);if (sb.ToString().Contains('\r')){acceptTextBox.Text = "";try{string[] strArray = sb.ToString().Split('\r');StringBuilder sb2 = new StringBuilder();int len = strArray.Length;for (int i = 0; i < len - 1; i++){string strTmp = strArray[i];if (strTmp.Contains('\n')){if (isClearFirstAndLastSpace){strTmp = strTmp.Replace('\n', ' ').Trim();}else{strTmp = strTmp.Split('\n')[1];}}string str = $"'{strTmp}'";if (i < len - 2){str += ",";}sb2.AppendLine(str);//System.Threading.Thread.Sleep(10);}acceptTextBox.Text = sb2.ToString();sb2.Clear();Array.Clear(strArray, 0, strArray.Length);}catch (Exception ex){throw new Exception(ex.Message);}finally{sb.Clear();}}else{MessageBox.Show("当前需处理的数据1不包含[\t]字符不用不符合处理规则,无法处理!!!", "错误提示",MessageBoxButtons.OK, MessageBoxIcon.Warning);}}
/// <summary>/// 获取数据并添加前后单引号末尾添加逗号方法3/// </summary>/// <param name="OriginalDataTextBox">原始数据的TextBox控件</param>/// <param name="acceptTextBox">接收处理后数据的TextBox控件</param>/// <param name="isClearFirstAndLastSpace">是否去除每行内容的首尾空格</param>private void HandleDataMethod3(TextBox OriginalDataTextBox,TextBox acceptTextBox,bool isClearFirstAndLastSpace=false){if (!string.IsNullOrEmpty(OriginalDataTextBox.Text)){int len = OriginalDataTextBox.Lines.Length;string[] tmpArray = OriginalDataTextBox.Lines;StringBuilder sb = new StringBuilder();try{acceptTextBox.Text = "";string strTmp = "";string str = "";for (int i = 0; i < len - 1; i++){strTmp = tmpArray[i];if (isClearFirstAndLastSpace){strTmp = strTmp.Trim();}if (i == len - 2){str = $"'{strTmp}'";}else{str = $"'{strTmp}',";}sb.AppendLine(str);}acceptTextBox.Text = sb.ToString();}catch (Exception ex){throw new Exception(ex.Message);}finally{Array.Clear(tmpArray, 0, tmpArray.Length);sb?.Clear();}}else{MessageBox.Show("当前需处理的数据1不能为空,请检查后重试!", "错误提示",MessageBoxButtons.OK, MessageBoxIcon.Warning);}}
四、项目源码与相关资料
该工具项目源码开源地址https://github.com/kafeiweimei/WinFormTool
Clipboard 类 (System.Windows) | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/api/system.windows.clipboard?view=windowsdesktop-8.0TextBox 类 (System.Windows.Forms) | Microsoft Learn
https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.textbox?view=windowsdesktop-9.0Control.ProcessCmdKey(Message, Keys) 方法 (System.Windows.Forms) | Microsoft Learn
https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.control.processcmdkey?view=windowsdesktop-7.0