【问题标题】:Why is my returned DataSet instance has no tables?为什么我返回的 DataSet 实例没有表?
【发布时间】:2014-03-10 15:27:18
【问题描述】:

当我连接到数据库并想从表中读取数据时,它不起作用并显示这些 异常详情:

System.IndexOutOfRangeException:找不到表 0。 第 141 行出错

我在数据集中只有一个表。你知道为我从表中阅读的最佳方式吗?我只返回一张桌子。使用foreach时,如何读取一行数据?

       internal DataSet read(string query)
        {
        DataSet nds = new DataSet();
        try
        {

            string connectionString = "...";
            try
            {

                SqlConnection nsqlc = new SqlConnection(connectionString);
                SqlCommand get = new SqlCommand(query, nsqlc);
                nsqlc.Open();
                SqlDataAdapter nsda = new SqlDataAdapter(get);
                nsda.Fill(nds);
                nsqlc.Close();
            }
            catch (Exception)
            {


            }

            return nds;
        }
        catch (Exception)
        {

            return nds;
        }
    }

主要形式:

            links = links + t.Tables[0].Rows[i][0].ToString() + "%";

           String links = "";
            links = "movie%";
            DataSet t = n.read("select id , poster from Movie order by id desc");
            for (int i = 0; i < 10; i++)
            {
                links = links + t.Tables[0].Rows[i][0].ToString() + "%";
                links = links + t.Tables[0].Rows[i][1] + "%";

            }

【问题讨论】:

  • 很难说不知道 n.read() 是什么以及做什么......
  • 您是否考虑过将其插入调试器(是的,我知道,没有人使用它们)并检查为什么这个变量为空,可能是单步执行代码?这是你一开始就应该学习的东西 - 使用工具和基本调试。
  • 是的。需要显示n.read 的代码。它显然没有像您认为的那样将表格添加到数据集中......
  • 在捕获异常时不要试图悄悄地返回您的DataSet。例外是要处理的事情,而不是你试图铺平的事情。我在想你埋在那里的有用信息。如果是这样,你能告诉我们吗?
  • fwiw:你的 read(string query) 方法迫使你编写非常不安全的代码,容易受到 sql 注入攻击,最终导致你的应用被黑了。

标签: c# database ado.net


【解决方案1】:

这里最接近答案的是n.read 方法返回一个没有表的DataSet 实例。您需要使用调试器单步执行该方法,并弄清楚它为什么会这样。

如果您发现问题所在,请修复它。如果没有,请分享read 方法代码,有人可以进一步帮助您。

查看您更新后的帖子,我发现您正在吞下尝试获取数据时可能发生的所有异常。从您的 read 方法中删除 catch 块。这将使您了解真正的问题是什么。

异常吞咽是您希望在全球范围内从您的代码中删除的东西。我建议你做一些谷歌搜索,找出为什么这是一个糟糕的习惯。

关于“从表格中读取的更好方法”,您应该考虑使用IDataReader

string links = "movie%";

using (var connection = new SqlConnection("your connection string");
{
    using (var command = someExistingConnection.CreateCommand())
    {
        command.CommandText = "select id, poster from Movie order by id desc";
        command.Connection = connection;

        connection.Open();

        try
        {
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    var idValue = reader.GetObject(0).ToString(); // would be better to use actual field type, which is unknown at the time I'm writing this
                    var posterValue = reader.GetString(1);

                    // perform concatenation here using the two variables declared above
                    links += String.Format("{0}%{1}%", idValue, posterValue);
                }
            }
        }
        finally
        {
            connection.Close();
        }
    }
}

这将远胜于使用DataSet

【讨论】:

  • 谢谢...当我删除捕获时,我发现了问题。我无法连接到数据库。你知道我的连接字符串有什么问题:connectionString = "Server=.;Database=irt;User Id=irt;Password=124;" + "集成安全=true;";
  • 我不可能知道您的连接字符串可能有什么问题,因为 1)您没有显示它,并且 2)即使您这样做了,我也无法正确诊断那一点信息的连接问题。除非它的构建方式存在一些非常明显的缺陷(例如缺少实际的服务器名称 :p )。
  • 我的代码上传到主机,我想连接到主机数据库.. !! :(
  • 正如我所说,如果没有更多细节,我几乎无能为力。此外,如果您在连接数据库时遇到问题,我认为您应该就该特定问题发布另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2012-09-07
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多