【问题标题】:C# MySQL retrieving a value from a column matching anotherC# MySQL 从与另一个匹配的列中检索值
【发布时间】: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)。

标签: c# mysql datareader


【解决方案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();
    }

【讨论】:

  • 您的介绍性文字我们很难理解。您应该考虑修改/改进它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2023-03-30
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多