Как обработать ошибку при использовании элементов управления DataGridView и запросов к базе данных Access? - PullRequest
3 голосов
/ 16 мая 2010

У меня есть два DataGridView элемента управления.

Во втором случае я просто скопировал код с первого и изменил различие.Но в секунду я получаю сообщение об ошибке, когда хочу просмотреть результат моего кода SQL.
В переводе на английский язык ошибка показывает что-то вроде того, что ни одному из обязательных параметров не присвоено значение.

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=save.mdb";

    try
    {
        database = new OleDbConnection(connectionString);
        database.Open();
        date =  DateTime.Now.ToShortDateString();

        string queryString = "SELECT zivila.naziv,(obroki_save.skupaj_kalorij/zivila.kalorij)*100 as Kolicina_v_gramih "
               + "FROM (users LEFT JOIN obroki_save ON obroki_save.ID_uporabnika=users.ID) "
               + "LEFT JOIN zivila ON zivila.ID=obroki_save.ID_zivila"
               + "WHERE users.ID= " + a.ToString();

        loadDataGrid(queryString);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

public void loadDataGrid(string sqlQueryString)
{
    OleDbCommand SQLQuery = new OleDbCommand();
    DataTable data = null;
    dataGridView1.DataSource = null;
    SQLQuery.Connection = null;
    OleDbDataAdapter dataAdapter = null;
    dataGridView1.Columns.Clear(); // <-- clear columns

    SQLQuery.CommandText = sqlQueryString;
    SQLQuery.Connection = database;
    data = new DataTable();
    dataAdapter = new OleDbDataAdapter(SQLQuery);
    dataAdapter.Fill(data);
    dataGridView1.DataSource = data;
    dataGridView1.AllowUserToAddRows = false;
    dataGridView1.ReadOnly = true;
    dataGridView1.Columns[0].Visible = true;
}

private void button2_Click(object sender, EventArgs e)
{
    string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=save.mdb";

    try
    {
        database = new OleDbConnection(connectionString);
        database.Open();
        date = DateTime.Now.ToShortDateString();

        string queryString = "SELECT skupaj_kalorij  "
                + "FROM obroki_save "
                + "WHERE users.ID= " + a.ToString();

        loadDataGrid2(queryString);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

public void loadDataGrid2(string sqlQueryString)
{
    OleDbCommand SQLQuery = new OleDbCommand();
    DataTable data = null;
    dataGridView2.DataSource = null;
    SQLQuery.Connection = null;
    OleDbDataAdapter dataAdapter = null;
    dataGridView2.Columns.Clear(); // <-- clear columns

    SQLQuery.CommandText = sqlQueryString;
    SQLQuery.Connection = database;
    data = new DataTable();
    dataAdapter = new OleDbDataAdapter(SQLQuery);
    dataAdapter.Fill(data);
    dataGridView2.DataSource = data;
    dataGridView2.AllowUserToAddRows = false;
    dataGridView2.ReadOnly = true;
    dataGridView2.Columns[0].Visible = true;
}

Ответы [ 3 ]

1 голос
/ 09 июня 2010

Вы бы лучше прочитали и сделали этот урок: http://msdn.microsoft.com/en-us/library/ms171884(v=VS.80).aspx Вероятно, потребуется около 20 минут, чтобы завершить

А затем (по мере необходимости) остальные из них (google for Data Walkthroughs)

Они научат вас, как правильно осуществлять доступ к данным, и, ознакомившись с расширенными инструментами Visual Studio для подключения к базам данных, вы сможете сгенерировать приложение, которое будет отображать содержимое базы данных в сетке, и сохранить их обратно в БД, быстрее, чем вы даже написать свой пост здесь ..

Код будет высокопроизводительным, более безопасным и более простым для написания, чем тот, что у вас есть здесь - код, который у вас есть, низкого качества, подвержен атакам SQL-инъекций, не является модульным или организован так, чтобы соответствовать языку Вы используете и занимает много времени, чтобы написать; в общем, у него нет хороших моментов (не обижайтесь)

Я настоятельно рекомендую отказаться от всего этого и начать все сначала, выполняя действия в соответствии с руководством Microsoft. Это может показаться неправильным после того, как ты столько часов потратил на этот сломанный, плохой способ делать вещи, но поверь мне ... Ты будешь рад, что сделал это; 20-минутные инвестиции сэкономят вам тысячи часов кодирования в будущем

И последнее замечание: если данные вашей базы данных не сохраняют изменения, когда вы делаете то, что вам подсказывает учебник, щелкните базу данных в обозревателе решений и измените «Копировать в выходной каталог» на «Копировать, если новее» - c # обновляет вашу базу данных, но вы либо просматриваете не ту базу данных, чтобы проверить, работает ли она, либо Visual Studio заменяет вашу отредактированную базу данных новой при каждом запуске приложения

0 голосов
/ 03 июня 2010

Попробуйте поместить кавычки вокруг a.Tostring ():

string queryString = "SELECT zivila.naziv,(obroki_save.skupaj_kalorij/zivila.kalorij)*100 as Kolicina_v_gramih "
               + "FROM (users LEFT JOIN obroki_save ON obroki_save.ID_uporabnika=users.ID)"
               + " LEFT JOIN zivila ON zivila.ID=obroki_save.ID_zivila "
               + " WHERE users.ID= '" + a.ToString() + "'";

или используйте string.format ():

string queryString = string.format("SELECT zivila.naziv,(obroki_save.skupaj_kalorij/zivila.kalorij)*100 as Kolicina_v_gramih "
               + "FROM (users LEFT JOIN obroki_save ON obroki_save.ID_uporabnika=users.ID)"
               + " LEFT JOIN zivila ON zivila.ID=obroki_save.ID_zivila "
               + " WHERE users.ID= '{0}'", a);
0 голосов
/ 19 мая 2010

Я думаю, что проблема в приватной void button2_Click () с

a.ToString ();

Что такое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...