【问题标题】:i cant add data from sql to list of string我无法将数据从 sql 添加到字符串列表
【发布时间】:2015-08-01 05:43:22
【问题描述】:

在这个程序中,我尝试从 SQL 获取数据到字符串列表中,并在 messageBox 中显示它们。当我在textBox 中键入一个字符并在查询中使用它时,程序应该开始搜索,如下所示:

string sql = " SELECT * FROM general WHERE element='" + textBox1.Text + "'  OR element='" + textBox2.Text + "' OR element='" + textBox3.Text + "' OR element='" + textBox4.Text + "'";


        MySqlConnection con = new MySqlConnection("host=localhost;user=mate;password=1234;database=element_database");
        MySqlCommand cmd = new MySqlCommand(sql, con);
        con.Open();


        MySqlDataReader reader = cmd.ExecuteReader();
        string rd;
        rd = reader.ToString();

        int i=0;
        List<string>  item = new List<string>();


        while (reader.Read())
        {
            item.Add(rd["element"].ToString());//i got error in this line


        }

        for (i = 0; i < item.Count;i++ )
        {
            MessageBox.Show(item[i]);

        }

我做错了什么?

【问题讨论】:

  • 请添加语言标签!
  • 上述代码出现什么错误?
  • 改用参数 + textbox.text +!可能你的元素是空的,不能转换成字符串。检查表上的数据。
  • [check this][1] [1]: stackoverflow.com/questions/8370927/… 我也在学习 C#,它可以帮助我理解循环。

标签: c# sql string


【解决方案1】:

我冒昧地修改了 SQL 以使用 IN 而不是多个 or 语句,以及在查询中使用参数而不是基于字符串的方法。这应该可以解决您的问题。

    string elem1 = "@elem1";
    string elem2 = "@elem2";
    string elem3 = "@elem3";
    string elem4 = "@elem4";
    List<string> parameters = new List<string>{ elem1, elem2, elem3, elem4 };

    string sql = string.Format(" SELECT * FROM general WHERE element IN ({0})", string.Join(',', parameters.ToArray()));

    using(MySqlConnection con = new MySqlConnection("host=localhost;user=mate;password=1234;database=element_database"))
    {
        con.Open();
        MySqlCommand cmd = new MySqlCommand(sql, con);
        cmd.Parameters.AddWithValue(elem1, textBox1.Text);
        cmd.Parameters.AddWithValue(elem2, textBox2.Text);
        cmd.Parameters.AddWithValue(elem3, textBox3.Text);
        cmd.Parameters.AddWithValue(elem4, textBox4.Text);

        MySqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            string message = reader["element"] as string;
            if(!string.IsNullOrEmpty(message))
            {
                MessageBox.Show(message);
            }
        }
    }

【讨论】:

  • List 处的表达式术语字符串无效且表达式术语“params”无效
  • 您完全正确,无法将列表命名为参数。我的道歉。该帖子现已更正。
  • 这里有一些错误 'string.Join(string, params string[])' has some invalid arguments
  • 糟糕,我的错。忘了那个字符串。加入不要将列表作为参数。它必须是一个数组。
【解决方案2】:

你做错了什么?一堆东​​西:

在您的问题中,您写了一个错误,但没有告诉我们它是什么。
Exceptions 有消息是有原因的:这样您就可以知道出了什么问题。

关于你的代码:

  • 您将值连接到您的 select 语句中,而不是使用 parameterized queries. 这会为 sql injection attacks. 创建一个开口
  • 您在 using 语句之外使用了 SqlConnection
    在处理IDisposable 对象时,您应该始终使用using 语句。
  • 您假设rd["element"] 总是有一个值。
    如果它从数据库返回为null,则在对它使用 .ToString() 时会得到一个空引用异常。正确的方法是将其值放入局部变量中,并在使用.ToString() 方法之前检查该变量是否不为空。
  • 您在代码中使用rd 而不是readerrd 变量没有意义,因为它只包含 MySqlDataReader 对象的字符串表示形式。

【讨论】:

  • 将我的回答视为建设性的批评。每个程序员都曾经是新手 :-)
【解决方案3】:

您已将rd 声明为字符串。您可能打算在此循环中使用 reader 对象:

while (reader.Read())
    {
        item.Add(reader["element"].ToString());// change "rd" to "reader"
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 2013-02-06
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2021-03-15
    相关资源
    最近更新 更多