Связь между таблицами, привязка к DataGridView

161
25 октября 2021, 06:50

Есть метод для связи между таблицами и биндинг к гриду

private void GetData()
{
    try
    {
        var loadData = cs.LoadFile("DataConnection.xml");
        string connString = String.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}", loadData.Host, loadData.Database, loadData.UserId, loadData.PWD);
        SqlConnection connection = new SqlConnection(connString);
        // Create a DataSet.
        DataSet data = new DataSet();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        // Add data from the Customers table to the DataSet.
        //string strUsersData = String.Format("select * from BTA_USERS where \"ID\" != {0} and \"isDelUser\" is null", loadData.LastId);
        string strUsersData = String.Format("select \"NAME\", case when BTA_USERS_ENTEREXIT.\"id\" is not null then '1' else '0' end as Online from BTA_USERS " +
            "left join BTA_USERS_ENTEREXIT on BTA_USERS.\"ID\" = BTA_USERS_ENTEREXIT.\"user_id\" " +
            "and cast(convert(char(8), BTA_USERS_ENTEREXIT.\"date_enter\", 112) as datetime) = cast(convert(char(8), GETDATE(), 112) as datetime) " +
            "and BTA_USERS_ENTEREXIT.\"date_exit\" = null " +
            "where BTA_USERS.\"ID\" != {0} and BTA_USERS.\"isDelUser\" is null " +
            "order by Online asc, \"NAME\" asc", loadData.LastId);
        SqlDataAdapter usersDataAdapter = new SqlDataAdapter(strUsersData, connection);
        usersDataAdapter.Fill(data, "BTA_USERS");
        // Add data from the Orders table to the DataSet.
        string strPostData = String.Format("select \"GetText\", case when \"SetUser_id\" = {0} then \"GetUser_id\" else \"SetUser_id\" end as Sender, case when \"SetUser_id\" = {0} then 'outgoing' else 'incoming' end as Stream from sta_Messages where \"SetUser_id\" = {0} or \"GetUser_id\" = {0}", loadData.LastId);
        SqlDataAdapter postsDataAdapter = new SqlDataAdapter(strPostData, connection);
        postsDataAdapter.Fill(data, "sta_Messages");
        //// Establish a relationship between the two tables.
        DataRelation relation = new DataRelation("UsersMessages",
            data.Tables["BTA_USERS"].Columns["ID"],
            data.Tables["sta_Messages"].Columns["Sender"]);
        data.Relations.Add(relation);
        // Bind the master data connector to the Customers table.
        BindingSource usersBindingSource = new BindingSource();
        BindingSource postsBindingSource = new BindingSource();
        usersBindingSource.DataSource = data;
        usersBindingSource.DataMember = "BTA_USERS";
        postsBindingSource.DataSource = usersBindingSource;
        postsBindingSource.DataMember = "UsersMessages";
        usersDataGridView.DataSource = usersBindingSource;
        postsDataGridView.DataSource = postsBindingSource;
    }
    catch (SqlException)
    {
        MessageBox.Show("Помилка!");
    }
}

Изначально метод был написан для вывода юзеров и истории сообщений между ними. (первый заремленый strUsersData), после переделал запрос для того, чтобы отображало кто в данный момент онлайн (через 3ю таблицу с данными о входе\выходе юзера с системы) и теперь выдает исключение

Я понимаю, что одна с колонок возвращает null, но не пойму почему. Буду благодарен за подсказку.

Answer 1

В select'e добавил выборку по полю ID, тем самым стало к чему привязываться между таблицами, где возвращало null

string strUsersData = String.Format("select BTA_USERS.\"ID\", \"NAME\", case when BTA_USERS_ENTEREXIT.\"id\" is not null then '1' else '0' end as Online from BTA_USERS " +
                "left join BTA_USERS_ENTEREXIT on BTA_USERS.\"ID\" = BTA_USERS_ENTEREXIT.\"user_id\" " +
                "and cast(convert(char(8), BTA_USERS_ENTEREXIT.\"date_enter\", 112) as datetime) = cast(convert(char(8), GETDATE(), 112) as datetime) " +
                "and BTA_USERS_ENTEREXIT.\"date_exit\" = null " +
                "where BTA_USERS.\"ID\" != {0} and BTA_USERS.\"isDelUser\" is null " +
                "order by Online asc, \"NAME\" asc", loadData.LastId);
READ ALSO
Как вернуть запись из текстового столбца как массив

Как вернуть запись из текстового столбца как массив

В бд есть поле типа longtext, в него записан массив такого типа

254
Ошибка в MySQL Workbench с RowCount

Ошибка в MySQL Workbench с RowCount

Значение 0 недопустимо для RowCountRowCount должен быть больше или равен 1

256
Php не видит расширение

Php не видит расширение

Пытаюсь подключиться к базе Postgres, у меня стоит Apache 24, Php 5

357
Пробел после каждой тысячи php

Пробел после каждой тысячи php

В переменной хранится некое значение количества аудиторииОтображается в формате: "Аудитория: 81345" (например)

235