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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> некоректный результат запроса OleDbDataAdapter 
:(
    Опции темы
alsergeich
Дата 26.9.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\car.mdb\"";
connection = new OleDbConnection(connectionString);
connection.Open();
ad = new OleDbDataAdapter("SELECT fam.id FROM Cars,test,fam", connection);
ds = new DataSet();
ad.Fill(ds);
tb = ds.Tables[0];
DataView testView;
testView = new DataView(tb);
dataGridView1.DataSource = testView;

если в строке ad = new OleDbDataAdapter("SELECT fam.id FROM Cars,test,fam", connection); 
после слова FROM стоит один параметр, то dataGridView1 отображает все нормально, все как в таблице, скажем Cars
а вот если там несколько параметров, то dataGridView1 отображет информацию содержащюуся в Cars,test,fam несколько раз.
Т.е. если у меня в Cars 1,2,3, то будет 1,2,3,1,2,3,1,2,3,1,2,3.
Никто не сталкивался с такой проблемой?

Это сообщение отредактировал(а) mr.DUDA - 26.9.2006, 17:01
PM MAIL   Вверх
mr.DUDA
Дата 26.9.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



alsergeich, пользуемся кнопкой "Код", plz...

Судя по всему, неправильно составлен запрос - он возвращает полное картезианское произведение трёх таблиц  smile . Нужно заюзать конструкцию типа INNER JOIN, если таблицы взаимосвязанные и запрос идёт по трём таблицам.  smile 


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


Новичок



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

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



а если таблицы не взаимосвязанные?
и если не сложно, просветите меня , пожалуйста, относительно конструкции типа INNER JOIN smile 
Заранее благодарю..

PM MAIL   Вверх
mr.DUDA
Дата 27.9.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Допустим есть таблица Cars, содержащая поля:

- Id (ключевое поле)
- Model (название модели)
- Year (год выпуска)
- ManufacturerId (Id производителя)

И таблица Manufacturers (производители):

- Id
- CompanyName
- PhoneNumber

Теперь, если я хочу сделать выборку по всем автомобилям с производителем "Toyota", то пишу запрос к таблице Cars, делая INNER JOIN по полю, связывающему таблицу Cars с таблицей Manufacturers:

Код
SELECT * FROM Cars
INNER JOIN Manufacturers ON Cars.ManufacturerId = Manufacturers.Id
WHERE Manufacturers.CompanyName = 'Toyota'



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


Новичок



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

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



хорошо,это все для связанных таблиц.
а если у меня две абсалютно разные таблицы, ну например, в одной цифры от 0 до ста, а в другой фамилии сотрудников, то в таком случае возможно создать запрос после которого данные можно будет передать в datagridview, чтобы они там отображались корректно, т.е. оба столбца начинались с первой строки:
1   Иванов
2   Петров
3   Сидоров
...  ...

 
PM MAIL   Вверх
thomas
Дата 4.10.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



alsergeich, 
Привет.
Приведу тебе пример как в ListBox или ListView отобразить данные из двух разных, не связанных таблиц.
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb; // не забудь добавить.

namespace Oef08_dbBis_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        # region declaration  
        private OleDbConnection con = new OleDbConnection();
        private OleDbCommand cmd = new OleDbCommand(); 
        private OleDbDataAdapter da = new OleDbDataAdapter();       
        private DataSet ds = new DataSet();
        #endregion

        private void Form1_Load(object sender, EventArgs e)
        {
            listView1.Columns.Add("kol0", 50);
            listView1.Columns.Add("kol1", 100);
            listView1.Columns.Add("kol2", 200);
            listView1.Columns.Add("kol3", 200);
            listView1.GridLines = true;
            listView1.View = View.Details;
        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            int lyn = 0;
            string tekst = ""; //переменная для сохранения текста и вывода его в ListBox
            con.ConnectionString = "provider=Microsoft.Jet.oledb.4.0;" +
                                   @"data source=D:\vti\Margo\nwind.mdb;"; // провайдер и путь к базе
            
            cmd.Connection = con;
            da = new OleDbDataAdapter(cmd);
            cmd.CommandText = "select * from categories"; //команда SELECT для первой таблицы
            da.Fill(ds, "kategori");                      //выполнение этой команды
            cmd.CommandText = "select * from employees"; //команда SELECT для второй таблицы
            da.Fill(ds, "bedienden");                    //выполнение этой команды
            try
            {   
                foreach (DataTable tb in ds.Tables)
                    // можно записать двумя способами
                    //foreach (DataRow ry in ds.Tables["kat"].Rows)
                    foreach (DataRow ry in tb.Rows)
                    {
                        tekst = "";
                        //for (int i = 0; i < ds.Tables[0].Columns.Count; i++) // или
                        for (int i = 0; i < tb.Columns.Count; i++)
                        {
                            tekst += ry[i].ToString() + " --- "; // формируем текст для ListBox
                        }
                        //показываем данные из таблиц в listBox
                        listBox1.Items.Add(tekst);
                        //показываем данные из таблиц в listView
                        listView1.Items.Add(ry[0].ToString());
                        listView1.Items[lyn].SubItems.Add(ry[1].ToString());
                        listView1.Items[lyn].SubItems.Add(ry[2].ToString());
                        listView1.Items[lyn++].SubItems.Add(ry[3].ToString());
                    }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fout : " + ex.Message);
            }
            finally
            {
                con.Close();
            }
        }
    }
}



А вообще поучи или посмотри SQL. Твоя главная ошибка в SQL команде. Ты можешь попросить показать все или отдельные поля но из одной таблицы (или из нескольких, но связанных)
Успехов в изучении.

ЗЫ 2005-я студия.

Это сообщение отредактировал(а) thomas - 4.10.2006, 00:45


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




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


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

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