C#. NET sqlDatabase CommandBuilder и DataAdapter: имя «Адаптер» не закрывается в текущем контексте - PullRequest
0 голосов
/ 15 апреля 2020

Я следил за обучением C#. Net онлайн. Создал class и объявил переменную Adapter1 для моего DataAdapter.

Я использую CommandBuilder с Adapter1 для обновления, сохранения, удаления или вставки новой записи в базу данных.

Проблема, с которой я столкнулся, заключается в том, что объявленный мною метод UpdateDatabase, похоже, не видит переменную Adapter1.

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

private string sql_string;
private string strCon; //This is a write-only property

public string Sql
{
    set { sql_string = value; }
}

public string connection_string
{
    set { strCon = value; }
}

public System.Data.DataSet GetConnection
{
    get { return MyDataSet(); }
}

private System.Data.DataSet MyDataSet()
{
    System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon);
    con.Open();

    System.Data.SqlClient.SqlDataAdapter Adapter1 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con);

    System.Data.DataSet dat_set = new System.Data.DataSet();
    Adapter1.Fill(dat_set, "Table_Data_1");

    con.Close();

    return dat_set;
}

public void UpdateDatabase (System.Data.DataSet ds)
{
    System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(Adapter1);
    cb.DataAdapter.Update(ds.Tables[0]);
}

1 Ответ

0 голосов
/ 15 апреля 2020

Причина, по которой вы получаете указанную ошибку c, заключается в том, что в области действия UpdateDatabase() отсутствует переменная с именем Adapter1. Вы можете сделать локальную переменную, которую вы объявили в функции MyDataSet() переменной-членом, тогда она будет видна в UpdateDatabase(). Однако это не лучший подход, поскольку вы будете рассчитывать на код, который использует этот вспомогательный класс, чтобы всегда вызывать функцию MyDataSet() перед функцией UpdateDatabase(), в противном случае адаптер данных не будет инициализирован ( получить нулевую ссылку). Если вы хотите структурировать код таким образом, вы должны инициализировать свой адаптер в конструкторе создаваемого вами класса, чтобы код, использующий вашу библиотеку, мог быть уверен, что адаптер всегда будет правильно инициализирован. Если вы структурируете код таким образом, вы можете сделать строку подключения параметром конструктора вместо свойства только для записи.

Любыми средствами продолжайте работать с этим кодом в качестве упражнения, но помните, что DataAdapters и DataSets очень старая часть. NET, и эта идиома мало используется на современных уровнях данных. Либо люди используют ORM (например, EntityFramework), либо они используют команды ADO. NET напрямую, если они хотят контроля и эффективности. Я также хотел бы отметить, что создаваемый вами класс, похоже, пытается выполнить роль DataAdapter, поэтому в реальной жизни у него не будет никакой полезности (люди просто используют SqlDataAdapter вместо вашего класса). ,

...