【问题标题】:Reader is not reading the data阅读器没有读取数据
【发布时间】:2010-12-10 11:32:42
【问题描述】:

我有这样的功能

try
    {


        using(var sConnection = new SqlConnection(ConnectionString))
        using(var sCommand = sConnection.CreateCommand())
        {
            sCommand.CommandText = @"SELECT 
                                           TABLE_NAME
                                          AS
                                           TABLES
                                        FROM 
                                           INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                                       WHERE 
                                           CONSTRAINT_TYPE = 'PRIMARY KEY'
                                         AND
                                           TABLE_NAME <> 'dtProperties'
                                    ORDER BY
                                           TABLE_NAME";
            sConnection.Open();
            using(var reader = sCommand.ExecuteReader()) // Troublesome line
            {                    
                while(reader.Read())
                {
                    sb.AppendLine(reader.GetString(0));
                }
            }
        }

    }
    catch(Exception ex)
    {
        //All the exceptions are handled and written in the EventLog. 
        EventLog log = new EventLog("Application");
        log.Source = "MFDBAnalyser";
        log.WriteEntry(ex.Message);
    }
    return sb.ToString();
}

在调试时,它会给出结果,直到连接打开但 var Reader 没有读取数据。

谁能指出错误在哪里!!

【问题讨论】:

  • 你的意思是它毫无例外地执行,但没有给出数据? SQL Profiler 显示了什么?
  • 您能否详细说明您遇到的异常情况
  • 谁能告诉我为什么会这样。
  • 你有“var reader”而不是“SQLDataReader reader”的原因吗?
  • 改变我也看到了..它对我也不起作用!1

标签: c# sql winforms


【解决方案1】:

您提供的代码与您运行的代码相同吗?

如果您有自初始化 get 属性,通常会在调试中出现“工作”的奇怪行为,但在运行时不会出现这种行为。像这样的:

private string _name;

public string Name
{
  get {
    if (_name == null)
    {
      name = string.Empty;
    }
    return _name;
  }
  set {_name = value;}
}

因此,如果您直接使用 _name 并且调试器显示这样的属性,它会在使用前“意外”初始化您的属性。

【讨论】:

    【解决方案2】:

    尝试在创建 sCommand 之前放置 sConnection.Open()

    【讨论】:

      【解决方案3】:

      在 MSDN 中看到这里:Reader

          while (reader.Read())
          {
              Console.WriteLine(String.Format("{0}", reader[0]));
          }
      

      所以也许尝试使用reader[0] 而不是reader.getString(0)

      编辑

      试试这个:

          public Form1()
          {
              InitializeComponent();
      
              String ConnectionString = @"Data Source=SERVER\SQLEXPRESS;Initial Catalog=DBNAME;User ID=USER;Password=PWD";
      
              StringBuilder sb = new StringBuilder();
              using (SqlConnection sConnection = new SqlConnection(ConnectionString))
              {
                  String query = @"SELECT TABLE_NAME AS TABLES FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME <> 'dtProperties' ORDER BY TABLE_NAME";
                  SqlCommand comand = new SqlCommand(query, sConnection);
                  sConnection.Open();
                  SqlDataReader reader = comand.ExecuteReader();
      
                  if (reader.HasRows)
                  {
                      Console.WriteLine("reader.hasRows == true !");
                  }
                  else
                  {
                      Console.WriteLine("reader.hasRows == FALSE !");
                  }
      
                  while (reader.Read())
                  {
                      sb.AppendLine(reader.GetString(0));
                  }
              }
      
              Console.WriteLine(sb.ToString());
          }
      }
      

      看看它是否有效。

      我创建了一个新的 Winform 应用程序,试了一下,它对我有用。

      这是我的输出:

      reader.hasRows == true !
      Categorie
      Chantier
      ...
      And all my table names.
      

      【讨论】:

      • @Srivastava 啊,抱歉...好吧,我有几个问题(有些听起来可能很愚蠢): 1. 当您的代码运行时是否有异常? 2. 您的查询在 SQL 客户端中执行时是否有行? 3.如果一步步调试,是不是在Reader.read()里面循环了很多次,意思是读到了什么?
      • @Srivastava 好的,那么您的答案是 1. 不,2. 是和 3. 不,它会立即从循环中退出?
      • @Srivastava 编辑了我的帖子,尝试使用此代码,这是我在需要时使用的代码,而不是您的代码,看看它是否有效以及 reader.Hasrows 怎么说。
      • @Srivastava 如果您在我编写的代码中遇到任何问题,请告诉我;)
      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      相关资源
      最近更新 更多