Читатель не читает данные - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть такая функция

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 не читает данные.

Кто-нибудь может указать, где ошибка !!

Ответы [ 3 ]

0 голосов
/ 10 декабря 2010

Попробуйте разместить sConnection.Open () перед созданием sCommand.

0 голосов
/ 29 декабря 2010

Ваш код совпадает с тем, который вы используете?

Странное поведение «работает» при отладке, но не во время выполнения, обычно происходит, если вы сами инициализируете свойства get. Примерно так:

private string _name;

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

Таким образом, если вы используете _name напрямую и отладчик отображает такое свойство, он «случайно» инициализирует ваше свойство перед использованием.

0 голосов
/ 10 декабря 2010

Здесь в MSDN: Читатель

    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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...