【问题标题】:Show whether the record is find by Name or EmpID显示记录是按名称还是 EmpID 查找的
【发布时间】:2013-05-23 18:41:33
【问题描述】:
using (SqlConnection myDatabaseConnection = new SqlConnection(myConnectionString.ConnectionString))
{
    myDatabaseConnection.Open();
    using (SqlCommand mySqlCommand = new SqlCommand("Select EmpID, Name from Employee WHERE EmpID = @EmpID OR Name = @Name ", myDatabaseConnection))
    {
        mySqlCommand.Parameters.AddWithValue("@EmpID", textBox1.text);
        mySqlCommand.Parameters.AddWithValue("@Name", textBox1.text);
        DataSet ds = new DataSet();
        SqlDataAdapter adapter = new SqlDataAdapter(mySqlCommand);
        adapter.Fill(ds);
        dataGridView1.DataSource = ds.Tables[0];  
    }
}

示例数据库

EmpID          Name
4001           Johnny Bravo
4002           Bruce Smith
4003           Vince Walker

当我在 textBox1 上输入 4001 这是结果

EmpID          Name
4001           Johnny Bravo

当我在 textBox1 上输入 Bruce Smith 时,结果是这样的

EmpID          Name
4002           Bruce Smith

我需要显示记录是通过 EmpID 还是 Name 找到的。例如,我输入 4003 文本框或标签等将类似于 "The record is found by EmpID" 。当我输入 Vince Walker 时,它会像 "The record is found by Name" 。

【问题讨论】:

  • 你可能想要使用 SQL 参数,否则你很容易受到 SQL 注入的攻击。

标签: c# sql sql-server winforms ado.net


【解决方案1】:

添加到 Abe Miessler 的答案,一个快速提示 -> 使用参数化查询:

using (var mySqlCommand = new SqlCommand("Select EmpID, Name from Employee WHERE EmpID = @EmpID OR Name = @Name", myDatabaseConnection))
{
    mySqlCommand.Parameters.AddWithValue("@EmpID", textBox1.text);
    // etc..
}

它可以保护您免受 SQL 注入的影响,并且作为奖励,您可以获得正确的值解析。

【讨论】:

    【解决方案2】:

    首先,您有一个需要修复的 SQL 注入漏洞。This article 应该让您关注参数化查询。

    其次,您可以在查询中插入一个 case 语句来指示匹配的值。示例:

    SELECT CASE WHEN EmpID = @EmpId 
               THEN 1 
               ELSE 0
           END AS MatchedEmpId
    FROM Whatever
    

    【讨论】:

    • 哦!这是漫长的一天 :) 完全是的,这应该可行 :) +1,伙计
    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多