【问题标题】:Error: You have specified an invalid column ordinal错误:您指定了无效的列序号
【发布时间】:2013-12-11 18:50:36
【问题描述】:

我在将数据从我的数据库加载到我的 Windows 窗体时遇到问题。我正在使用下面的代码通过数据读取器检索信息,然后将检索到的信息设置为适当的标签和图片框,但是当显示 AirSpace 表单时,我在标题中得到异常。我对此进行了一些研究,并得出结论,当应用程序尝试访问边界之外的序数时会给出此异常,但在此示例中无效(我不认为)。

如果您需要任何进一步的解释或详细信息,请询问。提前致谢。

代码:

private void AirSpace_Shown(object sender, EventArgs e)
    {
        string connectionString = "datasource=localhost;port=3306;username=********;password=********";
        Login login = new Login();
        using (MySqlConnection conn = new MySqlConnection(connectionString))
        {
            using (MySqlCommand cmd = conn.CreateCommand())
            {
                string select = "SELECT username, premium, picture FROM userinfo.users WHERE username = @username;";
                //                        (0)       (1)      (2)
                conn.Open();
                cmd.CommandText = select;
                cmd.Parameters.AddWithValue("@username", login.UsernameTextBox.Text);
                using (MySqlDataReader Reader = cmd.ExecuteReader())
                {
                        While(Reader.read())
                        {
                        //Set the user's profile picture to the user's profile picture.
                        ProfilePicture.Load(Reader.GetString(2));
                        //Set the username to the user's username
                        Username.Text = Reader.GetString(0);
                        //Set the app version to the user's version
                        if (Reader.GetString(1) == "1")
                        {
                            AppVersionLabel.Text = "Premium";
                        }
                        else
                        {
                            AppVersionLabel.Text = "Free";
                        }
                     }
                }
            }
        }

【问题讨论】:

标签: c# mysql database winforms sqldatareader


【解决方案1】:

0 而非1 开头的列序号

string select = "SELECT username, premium, picture FROM userinfo.users WHERE username = @username;";
 //                        (0)       (1)      (2)

所以下面一行

ProfilePicture.Load(Reader.GetString(3));

应该是:

ProfilePicture.Load(Reader.GetString(2));

见:25.2.3.5. MySqlDataReader

25.2.3.5.5。获取字符串

获取指定列的值作为字符串对象。

参数:从零开始的列序号。

返回:指定列的值。

编辑:

您需要像这样通读 DataReader:

using (MySqlDataReader Reader = cmd.ExecuteReader())
{
    while (Reader.Read())
    {
        //Set the user's profile picture to the user's profile picture.
        ProfilePicture.Load(Reader.GetString(2));
        //Set the username to the user's username
        Username.Text = Reader.GetString(0);
        //Set the app version to the user's version
        if (Reader.GetString(1) == "1")
        {
            AppVersionLabel.Text = "Premium";
        }
        else
        {
            AppVersionLabel.Text = "Free";
        }
    }
}

【讨论】:

  • 哇,我简直不敢相信我居然这么用力。感谢您的快速回答。
  • 使用问题中的更新代码我得到了异常Invalid attempt to access a field before calling Read()
  • @NoahCordoba,只需用一些代码更新答案,您需要通过方法读取您的 DataReader,就像上面的代码一样
  • 在 Reader.Read() 为真时运行代码会导致代码根本不执行任何操作。我不确定这是为什么,也许你可以给我解释一下。另外,更新了问题中的代码。
  • @NoahCordoba,你确定你正在从数据库中取回一些东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多