none
Работа с DataAdapter RRS feed

  • Вопрос

  • namespace ADOstudy
    {
      public partial class Form1 : Form
      {
        private DataSet myData;
    
        public Form1()
        {
          InitializeComponent();
          myData = new DataSet();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          OleDbConnection connection = new OleDbConnection();
          connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\AdoStudy.mdb";
          try
          {
            connection.Open();
          }
          catch
          {
            MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
            Application.Exit();
          }
          OleDbCommand command = connection.CreateCommand();
          command.CommandText = "SELECT * FROM Contacts";
          OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command);
          dataAdapter.Fill(myData, "tblContacts");
          dgvContacts.DataSource = myData.Tables[0];
          command.CommandText = "SELECT * FROM Phone";
          OleDbDataAdapter dataAdapter1 = new OleDbDataAdapter(command);
          dataAdapter1.Fill(myData, "tblPhone");
          dgvPhone.DataSource = myData.Tables[1];
        }
      }
    
    Подскажите, пожалуйста, можно ли использовать один DataAdapter для заполнения нескольких таблиц в одном DataSet? Если можно, то как это сделать? 

    Alex

    10 апреля 2013 г. 15:20

Ответы

  • You're using Access. The above (two separate SQL statements with ; between them) is OK for SQL Server, but most likely is not OK for Access where you may need to send each statement separately (I am just guessing, since I do not work with Access).

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    • Помечено в качестве ответа tumanovalex 11 апреля 2013 г. 7:18
    10 апреля 2013 г. 18:59

Все ответы

  • Можно. Просто меняете commandText и объект таблицы.
    • Предложено в качестве ответа Varlamov Oleg 10 апреля 2013 г. 16:09
    10 апреля 2013 г. 15:33
    Модератор
  • А как это сделать? Попробовал

          command.CommandText = "SELECT * FROM Phone";
          dataAdapter.SelectCommand(command);
     

    Получил ошибку. Как задать в созданном dataAdapter команду?

    Возникли еще вопросы:

    1. Как загрузить схему базы данных с помощью созданного dataAdapter?
    2. В книге Microsoft ADO.NET 2.0 для профессионалов (2006, Сахил Малик) в качестве запроса SQL можно использовать
    конструкцию:

    "SELECT * FROM Contacts;SELECT * FROM Phone". 

    Я попробовал так сделать, получил ошибку SQL. Можно ли в команде SQL делать запросы к разным
    таблицам? Можно ли в одном запросе группировать несколько разных запросов?


    Alex

    10 апреля 2013 г. 18:22
  • You're using Access. The above (two separate SQL statements with ; between them) is OK for SQL Server, but most likely is not OK for Access where you may need to send each statement separately (I am just guessing, since I do not work with Access).

    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog

    • Помечено в качестве ответа tumanovalex 11 апреля 2013 г. 7:18
    10 апреля 2013 г. 18:59
  • Спасибо за ответ. Вроде бы с командами для адаптера разобрался. Но возник еще вопрос. В таблицах базы данных есть связь по ключу idContact. Я загружаю схему данных и заполняю таблицы на форме:
    namespace ADOstudy
    {
      public partial class Form1 : Form
      {
        private DataSet myData;
    
        public Form1()
        {
          InitializeComponent();
          myData = new DataSet();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          OleDbConnection connection = new OleDbConnection();
          connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\AdoStudy.mdb";
          try
          {
            connection.Open();
          }
          catch
          {
            MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
            Application.Exit();
          }
          OleDbCommand command = connection.CreateCommand();
          command.CommandText = "SELECT *FROM Contacts";
          OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command);
          dataAdapter.FillSchema(myData, SchemaType.Source, "tblContacts");
          command.CommandText = "SELECT *FROM Phone";
          dataAdapter.SelectCommand = command;
          dataAdapter.FillSchema(myData, SchemaType.Source, "tblPhone");
          command.CommandText = "SELECT *FROM Contacts";
          dataAdapter.SelectCommand = command;
          dataAdapter.Fill(myData, "tblContacts");
          dgvContacts.DataSource = myData.Tables[0]; 
          command.CommandText = "SELECT *FROM Phone";
          dataAdapter.Fill(myData, "tblPhone");
          dgvPhone.DataSource = myData.Tables[1];
        }
      }
    }
    Однако при вводе телефона в поле idContact таблицы Phone на форме не появляется номер текущего контакта. Подскажите, пожалуйста, как это исправить. Проект разместил на http://zalil.ru/34428633



    Alex


    • Изменено tumanovalex 11 апреля 2013 г. 7:26
    11 апреля 2013 г. 7:20
  • "Получил ошибку. Как задать в созданном dataAdapter команду?" - повторно объект command добавлять не нужно, просто поменяйте текст запроса.

    11 апреля 2013 г. 7:22
    Модератор
  • Спасибо, вроде бы с командами для dataAdapter разобрался. Но вот связь между таблицами и установка значения idContact в таблице Phone не получается даже при таком коде:

        private void Form1_Load(object sender, EventArgs e)
        {
          OleDbConnection connection = new OleDbConnection();
          connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\AdoStudy.mdb";
          try
          {
            connection.Open();
          }
          catch
          {
            MessageBox.Show("Ошибка соединения с базой данных AdoStudy.mdb");
            Application.Exit();
          }
          OleDbCommand command = connection.CreateCommand();
          OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
          command.CommandText = "SELECT *FROM Contacts";
          dataAdapter.SelectCommand = command;
          dataAdapter.FillSchema(myData, SchemaType.Source, "Contacts");
          command.CommandText = "SELECT *FROM Phone";
          dataAdapter.SelectCommand = command;
          dataAdapter.FillSchema(myData, SchemaType.Source, "Phone");
          DataColumn[] keys = new DataColumn[1];
          myData.Tables["Contacts"].Columns["idContact"].Unique = true;
          keys[0] = myData.Tables["Contacts"].Columns["idContact"];
          myData.Tables["Contacts"].PrimaryKey = keys;
          DataRelation rl = new DataRelation("relat", myData.Tables["Contacts"].Columns["idContact"],
                            myData.Tables["Phone"].Columns["idContact"], true);
          myData.Relations.Add(rl);
          command.CommandText = "SELECT *FROM Contacts";
          dataAdapter.SelectCommand = command;
          dataAdapter.Fill(myData, "Contacts");
          command.CommandText = "SELECT *FROM Phone";
          dataAdapter.Fill(myData, "Phone");
          myData.Tables["Contacts"].Columns["idContact"].Unique = true;
          myData.Tables["Phone"].Columns["Phone"].Caption = "Номер телефона";
          dgvContacts.DataSource = myData.Tables["Contacts"]; 
          dgvPhone.DataSource = myData.Tables["Phone"];
        }
    
    Хотелось бы с этим разобраться

    Alex

    11 апреля 2013 г. 16:13