Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не видит переменные создаваемые конструктором, А вот почиму - вапроссс.... 
V
    Опции темы
kaa
  Дата 19.11.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Создаю в конструкторе соединене с БД, объект DataAdpter и объект DataSet

Код

string command_str = @"SELECT * FROM [Sheet1$A1:E2]";
            string conn_str = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\bd.xls; Extended Properties=Excel 8.0";
            OleDbConnection cn = new OleDbConnection(conn_str);
            OleDbDataAdapter da = new OleDbDataAdapter(command_str, cn);
            DataSet ds = new DataSet("Excell");



Пытаюсь залить из дата-адаптера в дата-сет базу в обработчике:

Код

private void button3_Click(object sender, System.EventArgs e)
        {
            da.Fill(ds,"Кроссировка");
        }


Так он ругается что ни da ни ds невидит smile
ПОчему? Может их нельзя в конструкторе определять?
Знаю конечно что код кривлват, но эт пробная прога, потому очень хочется заставить её работать smile
PM MAIL   Вверх
mr.DUDA
Дата 19.11.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(kaa @  19.11.2006,  13:08 Найти цитируемый пост)
Так он ругается что ни da ни ds невидит ПОчему? Может их нельзя в конструкторе определять?

Для конструктора эти переменные доступны, потому что они объявлены в нём (локально). После выхода из конструктора они не видны, и кстати garbage collector съест их оба (соединение и адаптер), потому что никем не используются. Нужно добавить в класс два поля - для соединения и адаптера, соответственно, и присваивать им значения, и их же использовать в button3_Click. 


--------------------
user posted image
PM MAIL WWW   Вверх
thomas
Дата 19.11.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 1
Всего: 65



Код

public partial class frmTest : Form
    {
        public frmTest()
        {
            InitializeComponent();

            string conn_str = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\bd.xls; Extended Properties=Excel 8.0";
            OleDbConnection cn = new OleDbConnection(conn_str);
            OleDbDataAdapter inda = new OleDbDataAdapter(command_str, cn);
            DataSet inds = new DataSet("Excell");

            ds = inds;
            da=inda;
        }

        private OleDbDataAdapter da;
        private DataSet ds;

        private void button3_Click(object sender, System.EventArgs e)
        {
            da.Fill(ds,"Кроссировка");
        }
    }


Вроде так должно быть.

Это сообщение отредактировал(а) thomas - 19.11.2006, 15:13


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Softaz
Дата 19.11.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16



Цитата(mr.DUDA @  19.11.2006,  14:18 Найти цитируемый пост)
и кстати garbage collector съест их оба (соединение и адаптер), потому что никем не используются.


Если нужно продлить сущестование объекта до завершения метода
Код

void SomeFunc()
{
     SomeClass p = new SomeClass();
     //Какие-то операции с использование объекта p
     ...
     //Существование объекта p продлевается до конца метода
     GC.KeepAlive(p);
}


add
Или же так
Код

/*
Garbage collection finalizes an object if there are no more references to it in managed code. Unmanaged references to objects do not prevent garbage collection. This rule detects errors that might occur because an unmanaged resource is being finalized while it is still being used in unmanaged code.

This rule assumes that IntPtr and UIntPtr fields store pointers to unmanaged resources. Because the purpose of a finalizer is to free unmanaged resources, the rule assumes that the finalizer will free the unmanaged resource pointed to by the pointer fields. This rule also assumes that the method is referencing the pointer field to pass the unmanaged resource to unmanaged code.

To fix a violation of this rule, add a call to KeepAlive to the method, passing the current instance (this in C# and C++) as the argument. Position the call after the last line of code where the object must be protected from garbage collection. Immediately after the call to KeepAlive, the object is again considered ready for garbage collection assuming that there are no managed references to it.

This rule makes certain assumptions that can lead to false positives. You can safely exclude a warning from this rule if:

The finalizer does not free the contents of the IntPtr or UIntPtr field referenced by the method.

The method does not pass the IntPtr or UIntPtr field to unmanaged code.

Carefully review other messages before excluding them. This rule detects errors that are difficult to reproduce and debug.
Example


In this example, BadMethod violates the rule. GoodMethod contains the corrected code.
*/
namespace SecurityRulesLibrary
{
   class IntPtrFieldsAndFinalizeRequireGCKeepAlive
   {
      private IntPtr unmanagedResource;
      
      IntPtrFieldsAndFinalizeRequireGCKeepAlive()
      {
         GetUnmanagedResource (unmanagedResource);
      }

      // The finalizer frees the unmanaged resource.
      ~IntPtrFieldsAndFinalizeRequireGCKeepAlive()
      {
         FreeUnmanagedResource (unmanagedResource);
      }

      // Violates rule:CallGCKeepAliveWhenUsingNativeResources. 
      void BadMethod()
      {
         // Call some unmanaged code.
         CallUnmanagedCode(unmanagedResource);
      }

      // Satisfies the rule.
      void GoodMethod()
      {
         // Call some unmanaged code.
         CallUnmanagedCode(unmanagedResource);
         GC.KeepAlive(this);
      }

      // Methods that would typically make calls to unmanaged code.
      void GetUnmanagedResource(IntPtr p)
      {
        // Allocate the resource ...
      }
      void FreeUnmanagedResource(IntPtr p)
      {
        // Free the resource and set the pointer to null ...
      }
      void CallUnmanagedCode(IntPtr p)
      {
        // Use the resource in unmanaged code ...
      }
      
   }

}


Это сообщение отредактировал(а) Softaz - 19.11.2006, 16:31


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
ivashkanet
Дата 19.11.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Softaz, пока ссылка p на SomeClass не выйдет из контекста (а она выйдет только после завершения метода, т.к. она объявлена в самом верхнем блоке метода) сборщик мусора не подберет этот объект
PM MAIL WWW ICQ   Вверх
Softaz
Дата 19.11.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16



Цитата(ivashkanet @  19.11.2006,  15:33 Найти цитируемый пост)
Softaz, пока ссылка p на SomeClass не выйдет из контекста ... сборщик мусора не подберет этот объект


За небольшим исключением.
Если объект использует таймер для выполнения операций в фоне или заключает в себе неуправляемый ресурс, который нельзя освобождать до конца метода. В обоих этих случаях в объекте должен быть реальзован интерфейс IDisposable, а использоваться объект должен в блоке using или try-catch-finally.


Цитата(ivashkanet @  19.11.2006,  15:33  Найти цитируемый пост)
она выйдет только после завершения метода, т.к. она объявлена в самом верхнем блоке метода

Там ей в верху и место (в т.н. глобальных переменных), если собирается существовать до завершения приложения. После некоторых сборок мусора такие объекты переводятся в поколение 2 и GC игнорирует их при сборе мусора у объектов опколений 0 и 1, что ускорит сбор мусора. Также эти объекты будут созданы в начальной области управляемой кучи, так что .NET их не придется перемещать при дефрагментации кучи.


Это сообщение отредактировал(а) Softaz - 19.11.2006, 16:02


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
ivashkanet
Дата 19.11.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Softaz, ничего не понял smile 
Какой таймер, какие операции, какой неуправляемый ресурс, какой IDisposable...

По порядку:
Контекст --- это код заключенный в {}.
Если переменная объявлена в {}, то она перестает существовать после закрывающейся скобки.
Ссылка на класс хранится в стеке, а значит подчиняется его законам

Сборщик мусора подбирает только те объекты на которых нет ссылки (не надо только в меня тыкать слабыми ссылками  smile ).

Поэтому, так как ссылка р объявлена в контексте метода (в его главных {} скобках), то класс 100% будет существовать до конца метода.

P.S. Мы не говорим о ссылках, объявленных в контексте класса
PM MAIL WWW ICQ   Вверх
Softaz
Дата 19.11.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16



Цитата(ivashkanet @  19.11.2006,  16:10 Найти цитируемый пост)
Мы не говорим о ссылках, объявленных в контексте класса

А я как раз о них говорю. Тот код, что thomas написал.


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
ivashkanet
Дата 19.11.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Я вообще не вижу смысла в GC.KeepAlive в управляемом коде. 
Ведь если на объект не указывает ни одной ссылки, то получить мы его при всем желании не сможем, как бы ни старались  smile

Добавлено @ 16:18 
Цитата(Softaz @  19.11.2006,  15:14 Найти цитируемый пост)
А я как раз о них говорю. Тот код, что thomas написал. 

Не, ну тогда я совсем дуб в C#  smile  smile  smile 
Цитата(Softaz @  19.11.2006,  14:23 Найти цитируемый пост)

Код

void SomeFunc()
{
     SomeClass p = new SomeClass();
     //Какие-то операции с использование объекта p
     ...
     //Существование объекта p продлевается до конца метода
     GC.KeepAlive(p);
}


В этом коде р объявлена внутри класса и именно для нее ты вызываешь KeepAlive, чем "продлеваешь существование объекта до завершения метода" 
Цитата(Softaz @  19.11.2006,  14:23 Найти цитируемый пост)
продлить существование объекта до завершения метода


P.S. Кто-то из нас ошибается  smile 
PM MAIL WWW ICQ   Вверх
Softaz
Дата 19.11.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16



Первый абзац - про метод.
Второй - про класс


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
ivashkanet
Дата 19.11.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



 smile  smile  smile  smile  smile 
PM MAIL WWW ICQ   Вверх
Softaz
Дата 19.11.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16





--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
kaa
Дата 19.11.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



Понил!  smile 
Всем пасиба ответы! 
Пойду переменные ваять smile
PM MAIL   Вверх
mr.DUDA
Дата 19.11.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232




 ! 
mr.DUDA
Softaz, 
ivashkanet, 
Хватит оффтопить. Если хотите поспорить о цикле жизни объектов в .NET - заводите отдельную тему.



--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.