显示记录是按名称还是 EmpID 查找的

Posted

技术标签:

【中文标题】显示记录是按名称还是 EmpID 查找的【英文标题】:Show whether the record is find by Name or 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 注入的攻击。 【参考方案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,伙计

以上是关于显示记录是按名称还是 EmpID 查找的的主要内容,如果未能解决你的问题,请参考以下文章

Spring @Autowired 是按名称还是按类型注入 bean?

二分查找

java中的参数传递是按引用传递还是按值传递

如何检查从服务器收到的响应是 html 还是 json 并在 extjs 中按名称查找 html 表单?

JavaScript 是按引用传递还是按值传递? [复制]

Swift 函数是按值还是按引用分配/传递?