2014-01-24 5 views
0

EDIT: Я использую SharpDevelopкод не работает за пределами петли

Я новичок в C#, так что ответ может быть легко один ... У меня есть некоторый код (ниже) и цикл WHILE работает просто отлично. Проблема в том, что после завершения обработки в цикле WHILE больше не выполняется код. Если я поставлю точку останова на свой 'cn.Open(); и запускать программу, я никогда не попадал в эту точку останова. Если я поставлю точку останова на фигурной скобке '}' чуть выше 'cn.Open(); line, код будет останавливаться каждый раз, когда я удаляю эту точку останова. Я не уверен, как запустить мой дополнительный код.

void MainFormLoad(object sender, EventArgs e) 
{ 
    DataTable dt = new DataTable(); 
    string line = null; 
    int i = 0; 
    SqlConnection cn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Sandbox;Data Source=test"); 

    StreamReader sr = File.OpenText(@"C:\Users\rl\Desktop\TEST_I~1.CSV"); 

      while ((line = sr.ReadLine()) != null) 
      { 
       string[] data = line.Split(','); 
       if (data.Length > 0) 
       { 
         if (i == 0) 
         { 
          foreach (var item in data) 
          { 
          dt.Columns.Add(item.ToString()); 
          } 
          i++; 
        } 
       DataRow row = dt.NewRow(); 
       row.ItemArray = data; 
       dt.Rows.Add(row); 
       } 
      } 
    cn.Open(); 
    SqlBulkCopy copy = new SqlBulkCopy(cn); 
    { 
    //   copy.ColumnMappings.Add(0, 0); 
    //   copy.ColumnMappings.Add(1, 1); 
    //   copy.ColumnMappings.Add(2, 2); 
    //   copy.ColumnMappings.Add(3, 3); 
    //   copy.ColumnMappings.Add(4, 4); 
    copy.DestinationTableName = "Member2"; 
    copy.WriteToServer(dt); 
    } 
+0

Щелкните правой кнопкой мыши на решении, нажмите «Очистить», затем перестройте решение и повторите попытку. Вы также можете попробовать перезапустить визуальную студию. – Habib

+1

Вы уверены, что цикл while завершается так, как ожидалось? Или, возможно, это грохот и жжение - что бы объяснить, почему вы не попадаете в эту точку останова. –

+0

Убрал решение, а затем перестроил решение (JIC), не имело никакого значения. Кроме того, перезапуск не изменил ситуацию. Если мой цикл является ошибкой, я должен получать сообщение во время отладки, но я этого не делаю. Я только что отредактировал OP, чтобы добавить, что я делаю это в SharpDevelop. – Baub

ответ

-3

Я думаю, что у вас есть бесконечный цикл происходит потому, что ваш while чек не совсем верно. Вы спрашиваете, имеет ли значение line = sr.ReadLine() значение null, а не если line - null. Результат установки line на результат функции чтения никогда не вернет значение null.

+2

'ReadLine()' возвращает 'Следующая строка из входного потока или null, если достигнут конец входного потока. " [Источник] (http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline (v = vs.110) .aspx) Результат операции присваивания - это значение, присвоенное левой операнд. –

+0

Да, и они устанавливают это переменной, называемой строкой. Булевая проверка, затем смотрит, можно ли установить строку, а не значение, которое она содержит. –

+2

В C# результат присваивания не является истинным/ложным относительно того, может ли он быть установлен, это значение, назначенное левому операнду (комментарий, отредактированный выше). –

1

У вас есть несколько вопросов, которые вы можете адресовать. Они могут или не могут быть связаны с тем, что вы отлаживаете с помощью #develop.

  1. Декларирование вещи долго, прежде чем использовать их (руководящие принципы стиля)
  2. Не выбрасывайте вещи, которые реализуют IDisposable (используйте using заявления!)
  3. Внутренний блок области видимости; переменная copy используются в его собственной области видимости, не по-видимому уважительной причины (я могу ошибаться, но это может быть то, что бросает # разработать-х отладчик для цикла)

Вместо этого, ваш код должен быть ближе к этому:

void MainFormLoad(object sender, EventArgs e) 
{ 
    var dt = new DataTable(); 

    // You may want to pass other parameters to OpenText for read mode, etc. 
    using (var sr = File.OpenText(@"C:\Users\rl\Desktop\TEST_I~1.CSV")) 
    { 
     var first = true; 
     string line = null; 

     while ((line = sr.ReadLine()) != null) 
     { 
      string[] data = line.Split(','); 
      if (data.Length > 0) 
      { 
       if (first) 
       { 
        foreach (var item in data) 
        { 
         dt.Columns.Add(item.ToString()); 
        } 
        first = false; 
        // Don't add the first row's data in the table (headers?) 
        continue; 
       } 
       var row = dt.NewRow(); 
       row.ItemArray = data; 
       dt.Rows.Add(row); 
      } 
     } 
    } 

    using (var cn = new SqlConnection("<connection string>")) 
    { 
     cn.Open(); 
     using (var copy = new SqlBulkCopy(cn)) 
     { 
      // copy.ColumnMappings.Add(0, 0); 
      // copy.ColumnMappings.Add(1, 1); 
      // copy.ColumnMappings.Add(2, 2); 
      // copy.ColumnMappings.Add(3, 3); 
      // copy.ColumnMappings.Add(4, 4); 
      copy.DestinationTableName = "Member2"; 
      copy.WriteToServer(dt); 
     } 
    } 

} 
+0

Также выглядит, что OP создает столбец для каждого элемента из split, для * every * line .... который может быть по дизайну, хотя я бы ожидал, что единое количество столбцов будет объявлено перед добавлением данных. – Tim

+0

Я думаю, что это 'i' или' first' (как у меня есть) для проверки. Он читает строку заголовка или что-то еще и определяет столбцы на основе этого. Тем не менее, я не уверен, что они хотели бы, чтобы имена заголовков были добавлены как фактическая строка данных. Я мог бы добавить 'continue' после' first = false; 'здесь. –

+0

А ... не поймал эту часть. Многозадачность слишком много вещей :) – Tim

0

Код немного нечетный, но похоже, что он должен работать. Вероятно, файл заблокирован, либо вы запускаете старые сборки, либо входите в открытую линию .csv.

Cory's suggestions для убора кода довольно хорошо.

Смежные вопросы