C# MySQL 从与另一个匹配的列中检索值

Posted

技术标签:

【中文标题】C# MySQL 从与另一个匹配的列中检索值【英文标题】:C# MySQL retrieving a value from a column matching another 【发布时间】:2013-07-14 03:29:33 【问题描述】:

所以我有一个包含以下列的表格: ID、姓名、地址等。

我一直在做一些研究,但我找不到正确的关键字来找出我想做的事情。我希望能够获取名称值(可以说...“John Doe”,它肯定已经在数据库中了..)并检索它的 ID(来自 int mysql 值 ID)。

我遇到了以下代码,但我似乎无法弄清楚如何扩展其限制以满足我的需求。

  connection2.Open();
        cmd.ExecuteNonQuery();
        try
        
            MySqlDataReader myReader = cmd.ExecuteReader();
            while (myReader.Read())
            
                Console.WriteLine(myReader.GetString(myReader.GetOrdinal("id")));
            
            myReader.Close();
        
        finally
        
            connection2.Close();
         

这也是我力所能及的办法。

        MySqlConnection connection2 = new MySqlConnection("Server=" + server + ";" + "Port=" + port + ";" + "Database=" + database + ";" + "Uid=" + uid + ";" + "Password=" + password + ";");
        string query = @"SELECT id FROM caregiverdatabse WHERE name Like '%" + caregiverNameDisp.Text + "%'";
        MySqlCommand cmd = new MySqlCommand(query, connection2);

【问题讨论】:

不清楚您所说的“获取名称值并从中检索 id”是什么意思。那么,您有一个包含name 列中的值的变量,并且您想查询数据库以从同一记录上的id 列中获取值?对于初学者,name 是唯一的还是会有多个记录?此外,显示的代码不包括cmd 对象或任何参数中的实际 SQL 命令,因此我们无法真正看到那里需要更改的内容。本质上,该命令将选择id,其中name 匹配给定值。 是的,完全正确。我已经尽我所能编辑了这篇文章。希望对您有所帮助! 这有几个潜在的问题。首先是查询对所谓的 SQL 注入攻击完全开放。在此处阅读它们:owasp.org/index.php/SQL_Injection 本质上,您永远不想在不先“清理”它的情况下将用户输入直接添加到查询中。考虑使用称为参数化查询的东西来帮助解决这个问题。然而,更重要的是,查询中的caregiverdatabase 是什么?在您使用该术语的地方,您应该使用表的名称,而不是数据库。 是的,我必须调查一下。对不起命名。确实是表的名字,我只是把它命名为(caregiverdatabse)。 【参考方案1】:

您应该用 sql 参数替换硬编码参数,但这里是您需要在此处执行的操作的一般概念。使用您当前的 sql 查询。

    MySqlConnection sqlConn = new MySqlConnection();
    MySqlCommand sqlCmd = new MySqlCommand();
    string sSql = "SELECT id FROM caregiverdatabse WHERE name Like '%" + caregiverNameDisp.Text + "%'";
    sqlConn.ConnectionString = "Server=" + server + ";" + "Port=" + port + ";" + "Database=" + database + ";" + "Uid=" + uid + ";" + "Password=" + password + ";";
    sqlCmd.CommandText = sSql;
    sqlCmd.CommandType = CommandType.Text;
    sqlConn.Open();
    sqlCmd.Connection = sqlConn;
    MySqlDataReader reader = sqlCmd.ExecuteReader();
    List<string> results = new List<string>();

    while (reader.Read())
    

        results.Add((reader["id"].ToString());

    

    reader.Close();
    sqlConn.Close();

请记住,您可以将阅读器结果添加到字符串,添加到类似上面的列表中,无论您想对它做什么。

【讨论】:

我按照以下方式进行操作,并将其更改为 results = reader["id"].ToString();。问题是它似乎总是显示最后一个值(现在是 ID 8)。有什么想法吗? 是的,因为你需要 results = results + reader["id"].ToString(); 我收到以下错误:无法将类型'string'隐式转换为'System.Collections.Generic.List' 哦,我以为你改成字符串了,它仍然是一个列表。您必须执行我在答案中建议的代码,除非您删除 List results = new List();并将其更改为字符串 results = ""; 你确定这些不是真正的行 ID 号吗?在字符串 sSql 上放一个断点并复制调试器中显示的字符串,然后在 sql 查询窗口中运行它并在那里查看结果【参考方案2】:

这是如何 id en name pawe

        clsMySQL.sql_con.Open();
        string id = ID;
       
        sql = "SELECT *FROM test";
        cmd = new MySqlCommand(sql, clsMySQL.sql_con);
        
        
        sql_cmd = new MySqlCommand(sql, clsMySQL.sql_con);
        MySqlDataReader dr = cmd.ExecuteReader();
        if (dr.Read())
        
            id = dr["id"].ToString();
            user = dr["user_name"].ToString();
            pass = dr["password"].ToString();
             
            if (name.Text == user && passw.Text == pass)
            
                string depart = id;
                Hide();

                MessageBox.Show("it works");
                // Then show the main form
                cracker form = new cracker(name.Text);
                form.sid = depart;
                form.Show();
                MessageBox.Show(ID);
            
        
        else
        
            MessageBox.Show("Invalid Login please check username and password");
        
        clsMySQL.sql_con.Close();
    

【讨论】:

您的介绍性文字我们很难理解。您应该考虑修改/改进它。

以上是关于C# MySQL 从与另一个匹配的列中检索值的主要内容,如果未能解决你的问题,请参考以下文章

返回与另一列中的最小值匹配的 ID 行 [重复]

返回查询的所有行,其中一列中的字符串值与另一列中的字符串值匹配

返回值的公式,其中一列中的第一个单词与另一列的最后四位匹配

查询以从与给定值相同的列中选择值,但不同的行

如果属性与另一个数组匹配,则检索数组中的对象

我需要使用索引和匹配从另一列条件匹配的列中提取数据