【问题标题】:How can i search SQL Server Database while typing in C# Winforms application?在 C# Winforms 应用程序中键入时如何搜索 SQL Server 数据库?
【发布时间】: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,欢迎来到 stackoverflow。到目前为止,除了 SQL 设置之外,您还尝试过哪些代码?
  • 您的意思是您启动屏幕时网格已填满,并且您想要进行客户端过滤/搜索,还是您想要每次都从 sql 中检索数据?不管怎样,我觉得这个问题有点太笼统了。
  • 您好,很抱歉,如果我无法正确解释我的问题。 usselite,我尝试了存储过程。 AsheraH,你的第一句话正是我想要的。我已经开始屏幕填满了网格,我想做一个客户端过滤/搜索以在我输入时显示结果。
  • 只需在文本框的TextChanged事件中过滤数据表dt

标签: c# sql database winforms search


【解决方案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 连接发送

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 2010-12-28
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2016-06-25
    • 2014-02-26
    相关资源
    最近更新 更多