没有在c#中获取mysql中的所有记录

分享于2022年07月17日 c# mysql 问答
【问题标题】:没有在c#中获取mysql中的所有记录(Not getting all records in mysql in c#)
【发布时间】:2022-01-23 05:19:00
【问题描述】:

我有一个带有 MySQL 数据库的 wordpress 网站。我创建了一个自定义表来创建此页面 https://www.my-pocket.cc/test-store-list/ 我正在创建一个 c# 桌面应用程序来更改表。问题出在站点名称下,我只得到最后一条记录,而不是它们两个。我正在使用 MySqlDataReader。我将 select 语句复制到 MySQL 并得到了正确的答案(请参阅 SQL select 语句)我还包括了我得到的输出和代码。

sql select statments c# output

enter code here

string connStr = "server=127.0.0.1;user=root;database=mypocket;port=3306;password=green2Apple#"; MySqlConnection conn = new MySqlConnection(connStr); conn.Open();

        try
        {
            
            MySqlCommand cmd = new MySqlCommand("select Heading_id,Heading_Name, Heading_Order,Group_Class from button_headings order by Heading_Order", conn);


            MySqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                string connStr2 = "server=127.0.0.1;user=root;database=mypocket;port=3306;password=green2Apple#";
                MySqlConnection conn2 = new MySqlConnection(connStr2);
                conn2.Open();
                txtOutput.Text += $"{reader.GetString("Heading_Name")} ";
                string StoreId = $"{reader.GetString("Group_Class")}";
                txtOutput.Text += "\r\n";
                try
                {
                    MySqlCommand cmd2 = new MySqlCommand("select Site_Url, FullName FROM siteinfo  where StoreId = " + StoreId + " and showsite = 0", conn2);
                    MySqlDataReader reader1 = cmd2.ExecuteReader();
                    txtOutput.Text += "\t";
                    if (reader1.Read()) {

                        while (reader1.Read())

                        {
                            txtOutput.Text += "\t";
                            txtOutput.Text += $"{reader1.GetString("FullName")}";
                            txtOutput.Text += "\r\n";
                        }
                    }
                    else
                    {
                        txtOutput.Text += "\t";
                        txtOutput.Text += "No Records";
                        txtOutput.Text += "\r\n";
                    }
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error Getting Records" + ex.ToString());
                }


            }



        }
        catch (Exception ex)
        {
            MessageBox.Show("Error Getting Records" + ex.ToString());
        }

        btnReturn.Focus();
    }
}

  • 请使用 参数化查询 - 通过连接等方式构建 SQL 查询是灾难的根源。它不仅是许多难以调试的语法错误的来源,而且还是 SQL Injection attacks 的敞开大门。
  • @FranzGleichmann 对 SQL 注入的反对在这种情况下并不令人担忧,因为它是您自己的桌面应用程序,但请检查您的网站以了解这种模式。引用: xkcd.com/327
  • 为什么不像 EF 那样使用 ORM?它将解决注入潜力并允许 LINQ 用于查询逻辑。

【解决方案1】:

您调用了两次 read() ,但丢弃了一个结果

if (reader1.Read()) {
    while (reader1.Read())

if 语句将读取第一条记录,然后 while 循环将读取第二条(以及任何后续)记录并实际显示它们。

我会摆脱 if 语句,并创建在进入循环时设置为 true 的布尔变量。如果变量为 false,则您知道没有检索到任何记录,您可以显示未找到记录的消息。

bool hasRecords = false;   

while (reader1.Read())
{
    hasRecords = true;
    txtOutput.Text += "\t";
    txtOutput.Text += $"{reader1.GetString("FullName")}";
    txtOutput.Text += "\r\n";
}

if(!hasReords)
{
    txtOutput.Text += "\t";
    txtOutput.Text += "No Records";
    txtOutput.Text += "\r\n";
}