在 C# Winforms 应用程序中键入时如何搜索 SQL Server 数据库?

     2023-02-24     292

关键词:

【中文标题】在 C# Winforms 应用程序中键入时如何搜索 SQL Server 数据库?【英文标题】:How can i search SQL Server Database while typing in C# Winforms application? 【发布时间】:2019-12-27 10:04:19 【问题描述】:

我在 winforms 应用程序的数据网格视图中显示了一些 sql 表结果。我通常使用 DbEntities,但我必须在查询中使用 join 来从多个结果中获取结果,所以我使用了这段代码。

我想在输入时添加一个查询和一个文本框来搜索结果。我怎样才能从我已经开始的地方做到这一点?

        SqlConnection con = new SqlConnection("server=.; Initial 

        Catalog=winforms;Integrated Security=SSPI");

        DataTable dt = new DataTable();

        string sql = "SELECT Personel.ad, Personel.soyad, Personel.tc, Personel.dogum, Personel.isgiris, Birim.birimad AS [Birim], Sube.subead AS [Şube] FROM Personel JOIN Birim ON Birim.birimid = Personel.birimid JOIN Sube ON Sube.subeid = Personel.subeid";

        con.Open();
        SqlDataAdapter da = new SqlDataAdapter(sql, con);
        da.Fill(dt);
        dataGridView1.DataSource = dt;

【问题讨论】:

您好 Mert,欢迎来到 ***。到目前为止,除了 SQL 设置之外,您还尝试过哪些代码? 您的意思是您启动屏幕时网格已填满,并且您想要进行客户端过滤/搜索,还是您想要每次都从 sql 中检索数据?不管怎样,我觉得这个问题有点太笼统了。 您好,很抱歉,如果我无法正确解释我的问题。 usselite,我尝试了存储过程。 AsheraH,你的第一句话正是我想要的。我已经开始屏幕填满了网格,我想做一个客户端过滤/搜索以在我输入时显示结果。 只需在文本框的TextChanged事件中过滤数据表dt 【参考方案1】:

找到this在DataTable中搜索的答案。

因此,对于您的解决方案,您需要实施

public static DataTable SearchInAllColums(this DataTable table, string keyword, StringComparison comparison)

    if(keyword.Equals(""))
    
        return table;
    
    DataRow[] filteredRows = table.Rows
       .Cast<DataRow>()
       .Where(r => r.ItemArray.Any(
       c => c.ToString().IndexOf(keyword, comparison) >= 0))
       .ToArray();

    if (filteredRows.Length == 0)
    
        DataTable dtProcessesTemp = table.Clone();
        dtProcessesTemp.Clear();
        return dtProcessesTemp;
    
    else
    
        return filteredRows.CopyToDataTable();
    

然后你可以在你的 changeevent 中使用它:

void textBox1_TextChanged(object sender, EventArgs e)

    SqlConnection con = new SqlConnection("server=.; Initial 

    Catalog=winforms;Integrated Security=SSPI");

    DataTable dt = new DataTable();

    string sql = "SELECT Personel.ad, Personel.soyad, Personel.tc, Personel.dogum, Personel.isgiris, Birim.birimad AS [Birim], Sube.subead AS [Şube] FROM Personel JOIN Birim ON Birim.birimid = Personel.birimid JOIN Sube ON Sube.subeid = Personel.subeid";

    con.Open();
    SqlDataAdapter da = new SqlDataAdapter(sql, con);
    da.Fill(dt);

    dataTable.SearchInAllColums(textBox1.Text, StringComparison.OrdinalIgnoreCase);

    dataGridView1.DataSource = dataTable;

但是:这样做会导致大量流量流向您的 sql 服务器。我强烈建议你在这里也实现某种形式的缓存来获取所有可搜索的数据。如果这是一个选项。

【讨论】:

感谢您的回答。我要试试。但是我创建了一个用于搜索的存储过程,用于在 winforms 中填充 DataGridView。我在我的 TextChanged 事件中使用了该函数并且它起作用了。你认为我的方式会在我的 Sql Server 中造成大量流量,或者这会以任何方式不安全吗? @Mert 当然会。每次触发更改事件(添加字符或删除字符)时,您都会从数据库中获取数据。至于“不安全”,如果您使用 SqlParameters 将是安全的。前任。 da.SelectCommand.Parameters.Add( "@searchText", SqlDbType.VarChar).Value = textBox1.Text; 然后你当然需要在你的 sql 查询中将 @searchText 定义为一个参数 我明白了。我还有两个问题。 1)我的目标是为一家小公司开发一个小应用程序。您谈到的 sql server 中的流量,它会显着影响我的应用程序吗? 2) 我使用 AddWithValue 而不是 Add,这在安全方面类似于 Add 吗?再次感谢 @Mert ,这取决于您的服务器。同样从长远来看,如果公司发展壮大并且每个人都使用它,那么它必然会变慢。 2、阅读this。不确定安全差异,但可能会导致其他问题 目前看来只有一个人会使用它,而且公司的员工不超过 50 人。我认为这应该不是问题。【参考方案2】:

您可以对文本框使用 TextChanged 事件并将文本作为参数发送到函数。然后将文本添加到 SQL 查询的 WHERE 子句中。

注意查询 SQL 的用户输入。这只是一个例子,不是很安全。

void textBox1_TextChanged(object sender, EventArgs e)

    CallSQL(textBox1.Text);


void CallSQL(string filterText)

...
...
 string sql = string.Format("SELECT ... WHERE Personel.Ad = 0", filterText);
...
...

【讨论】:

你也可以只过滤数据表 在 sql 中的位置肯定更好,但您也可以搜索 DataTable DataTable dtResult= tb.Select("Personel.Ad LIKE '%"+searchstring+"%'").CopyToDataTable(); 我会试试的,谢谢。当我在文本框中输入名称时,它会起作用吗? 如果你使用sql过滤,那么永远不要在这里教任何人使用不带参数的查询 您对参数的看法是对的,但这只是基于相关代码的示例。【参考方案3】:

只是添加到问题和未来类似的问题:

不要将 SQL 用作 textchanged 属性的“insta-search”。如上所述,由于许多原因,它很糟糕。但首先,您可能会因为锁定 SQL 表而遇到问题,让人们尝试搜索某些内容并因此产生大量流量,甚至对于一个用户来说,它也不安全且对资源不友好。此外,您的流量很高用于 SQL 注入。有一些好的编程实践可以让它更安全,我会尝试解释更多。

好的,你已经知道这条信息了。但是正确的方法是如何做到的呢?

使用对象、DAL 和缓存信息,直到它足够旧并且必须更新它。

如何:

首先,您应该创建一个仅用于 sql 查询和操作的 DAL/DAO 类。对该主题进行一些搜索,为什么将您的业务规则和 sql 代码加扰在一起是一个坏主意。这里有一些简短的文字:About DAL/DAO

然后,创建一个对象类。例如:个人信息。其中包含您需要的所有属性,例如:名称、文档等。

这里有一些关于对象处理的信息:Using Objects with C#

在完成您的对象后,使用列表存储并将其传递给数据表或直接传递给 datagridview。

List<Objectname> listname = new List<Objectname>();

然后,使用一些循环遍历 SQL 数据并填写您的列表。

例子:

while(dataReader.Read())

Object objectname = new Object();

objectname.attribute1 = dataReadet["columname"].ToString();
objectname.attribute2 = dataReadet["columname"].ToString();
objectname.attribute3 = dataReadet["columname"].ToString();
listname.Add(objectname);

最后返回您的对象列表:

Return listname;

这样你就有了完整的有组织的对象列表,你可以:

用作缓存的基础。该列表包含该用户的所有信息 需要寻找。使用 foreach 循环搜索列表并返回 用户期望的值。只要记住在它得到时更新它 旧的。 将其用作 Datagridview 或 Datatable 的源代码,价格便宜。 与 JSON 一起使用,可以通过 API 或简单的 UDP/TCP 连接发送

希望这篇简短的评论能让您对数据处理有所了解。

请注意,并非所有数据都可以安全保存。密码和受保护的东西不应存储在内存或其他可被利用的方式中。

【讨论】:

C# Combobox (Dropdownstyle = Simple) -- 如何在键入时选择项目

...02-1019:59:05【问题描述】:我的表单上有一个Combobox控件(WinForms,.NET3.5),它的DropDownStyle属性设置为Simple。假设它填充了字母表中的字母, 查看详情

如何抑制运行 C# Winforms 应用程序时弹出的黑壳?

】如何抑制运行C#Winforms应用程序时弹出的黑壳?【英文标题】:HowCanISuppresstheBlackShellthatPopsUpWhenIRunmyC#WinformsApplication?【发布时间】:2020-11-0400:09:54【问题描述】:当我通过单击.exe文件运行我的C#应用程序(在VS中编译,发布版... 查看详情

如何在 C# Winforms 的下拉列表控件中获取数据源名称

...】:2014-01-0310:52:59【问题描述】:您好,我正在开发一个应用程序来将数据从一个系统检索到另一个远程系统。为此,我首先通过下面的屏幕设置应用程序的连接字符串。当我从第一个dropdownlist选择SQLServer时,我需要 查看详情

如何在 .NET 4.0 C# WinForms 应用程序中播放 SWF 文件?

】如何在.NET4.0C#WinForms应用程序中播放SWF文件?【英文标题】:HowtoplaySWFfilein.NET4.0C#WinFormsapplication?【发布时间】:2014-06-2007:54:25【问题描述】:我有一个SWF文件,我希望它也可以离线使用。我已经搜索了如何播放SWF文件。但是... 查看详情

如何在 C# Winforms 程序的文本框中突出显示文本?

】如何在C#Winforms程序的文本框中突出显示文本?【英文标题】:HowdoIhighlightTextinaTextboxinaC#Winformsprogram?【发布时间】:2011-01-2515:24:26【问题描述】:我有一个带有多个文本框的C#Winforms程序。我使用每个框的属性在其中放置文本... 查看详情

如何在 C# Winforms 应用程序中发送 PayPal REST API 退款?

】如何在C#Winforms应用程序中发送PayPalRESTAPI退款?【英文标题】:HowdoyousendaPayPalRESTAPIRefundinaC#Winformsapp?【发布时间】:2018-08-0712:15:21【问题描述】:我在网上找到的用于在C#中实现PayPalRESTAPI的文档非常少。我已经完成了获取访问... 查看详情

如何在 C# Winforms 应用程序中取消执行长时间运行的异步任务

】如何在C#Winforms应用程序中取消执行长时间运行的异步任务【英文标题】:Howtocancelexecutionofalong-runningasynctaskinaC#Winformsapp【发布时间】:2016-05-0518:41:48【问题描述】:我是一个缺乏经验的C#程序员,需要帮助管理我的程序流程。... 查看详情

如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?

】如何在C#控制台或WinForms应用程序中使用Windows安全的确认证书弹出窗口选择证书?【英文标题】:HowtoselectaCertificateusingtheWindowsSecurity\'sConfirmCertificatepopupinC#consoleorWinFormsapplication?【发布时间】:2020-07-0922:56:26【问题描述】:我... 查看详情

如何在 C# 中使用实例引用?

...-1101:34:56【问题描述】:我正在开发一个用C#编写的Winforms应用程序,该应用程序在匹配静态项时遇到问题。这是我的代码InitializeComponent();stringpnumber=Calculate.Peoplenumber.Text;intpeoplenumber=int.Pa 查看详情

在 C# winforms 应用程序中使用文本框过滤 Treeview

】在C#winforms应用程序中使用文本框过滤Treeview【英文标题】:FilteraTreeviewwithaTextboxinaC#winformsapp【发布时间】:2012-01-0519:34:10【问题描述】:我的C#winform中有一个TreeView。我希望能够通过搜索框添加搜索功能。基本上当用户输入字... 查看详情

如何在 VB.Net winforms 应用程序中找到 main() 入口点?

】如何在VB.Netwinforms应用程序中找到main()入口点?【英文标题】:Howtofindthemain()entrypointinaVB.Netwinformsapp?【发布时间】:2012-12-2717:33:33【问题描述】:当我在C#中创建WinForms应用程序时,输出类型为WindowsApplication,我得到一个带有st... 查看详情

在winforms c#中自动调整项目/控件的大小显示错误

...-01-0503:41:51【问题描述】:我一直在尝试让我的windows窗体应用程序自动调整大小,即当用户调整应用程序大小时,它的控件也会相应地调整大小,在网上搜索后,我遇到了以下.cs文件形式的代码:usingSystem;usingSyst 查看详情

如何在 C# (Winforms) 中复制或读取假脱机文件

】如何在C#(Winforms)中复制或读取假脱机文件【英文标题】:HowtocopyorreadSpoolfileinC#(Winforms)【发布时间】:2017-01-0713:09:34【问题描述】:我需要复制或读取假脱机文件。但是当我尝试阅读/复制它时。我收到以下错误。System.Unauthorize... 查看详情

如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段

】如何在C#WinForms中使用LINQ从DataGridView中选择多个字段【英文标题】:HowtoSelectMultipleFieldsfromDataGridViewusingLINQinC#WinForms【发布时间】:2021-11-1515:04:13【问题描述】:技术细节:VisualStudio2017(社区版)LINQC#(WinForms)我正在尝试使用LIN... 查看详情

如何在随机生成的数字中添加逗号 C# winforms [重复]

】如何在随机生成的数字中添加逗号C#winforms[重复]【英文标题】:HowtoaddcommainrandomgeneratednumbersC#winforms[duplicate]【发布时间】:2015-11-2818:29:18【问题描述】:目前我有这个代码:privatevoidbutton1_Click(objectsender,EventArgse)label1.Text=(newRan... 查看详情

在 C# Winforms 应用程序中嵌入 CMD 终端

】在C#Winforms应用程序中嵌入CMD终端【英文标题】:EmbeddingaCMDterminalinaC#Winformsapplication【发布时间】:2015-10-1210:37:48【问题描述】:我打算做的是构建一个应用程序,除其他外,它将像某些IDE一样嵌入一个命令行(我觉得这非常... 查看详情

在 C# (WinForms) 中拦截应用程序中所有控件的单击事件

】在C#(WinForms)中拦截应用程序中所有控件的单击事件【英文标题】:InterceptingclickeventforallcontrolsinanappinC#(WinForms)【发布时间】:2011-05-1520:24:01【问题描述】:我想制作一个应用程序来拦截我应用程序所有形式的所有UI事件并将它... 查看详情

如何使用c#在winforms中为每个用户授予权限

】如何使用c#在winforms中为每个用户授予权限【英文标题】:Howtogivethepermissiontoeachuserinwinformsusingc#【发布时间】:2013-12-2413:30:13【问题描述】:如何在winform中给用户权限?举例我的应用是基于零售商店的,所以每个员工都有用户... 查看详情