0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
1

При изменении типа данных ошибка

19.12.2014, 19:40. Показов 1692. Ответов 20
Метки нет (Все метки)

Доброго времени суток, дорогие форумчане. Делал программу на C# + Access база. При замене в базе целочисленной информации на строковую программа дает сбой.
В базе у меня имеется таблица Raspisanie, в ней имеется столбец Gruppa, в свою очередь столбец группа содержит данные 1,2,3,4,5,6,7,8,9. Мне требуется заменить все группы на "Взрослые" "Дети" и "Спортсмены".
Заменяю в базе информацию, запускаю программу, выходит ошибка: Необработанное исключение типа "System.Data.OleDb.OleDbException" в System.Data.dll
Ругается на последнюю строчку:
Connect();
cmd = new OleDbCommand(str, conn);
adap = new OleDbDataAdapter(cmd);
DataT = new DataTable();
adap.Fill(DataT);
Кто что посоветует? Помогите пожалуйста. Исходники прилагаются, использование программы свободное.
Вложения
Тип файла: rar Фитнес.rar (3.20 Мб, 8 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2014, 19:40
Ответы с готовыми решениями:

Ошибка при изменении данных
Есть база данных, которая привязана к проекту через Binding Source. Вывожу данные таблицы в...

Ошибка при изменении данных через Entity Framework
Столкнулся с проблемой обновления данных, сам еще новичок в Entity. Добавляет в таблицу все ок, но...

Ошибка при преобразовании типа данных varchar к real
Пытаюсь обновить запись в БД. Делаю так: double stavka = Convert.ToDouble(textBox3.Text);...

Окно сообщения об ошибке DataGridView по умолчанию, при изменении типа ячейки в комбо бокс
сделал все как тут написано:"Чтобы изменить тип столбца с использованием конструктора, выполните...

20
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
19.12.2014, 20:12 2
C#
1
 string str = "SELECT *  FROM  Raspisanie WHERE id IN (" + strID2 + ")";
поскольку у вас ИД теперь строковое, то strID2 должно содержать значения в одинарных кавычках:
вместо 1,2,3 должно быть '1','2','3'
1
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 20:21  [ТС] 3
Спасибо. Сейчас попробую.
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 20:27  [ТС] 4
Встаёт на том-же месте.
Миниатюры
При изменении типа данных ошибка  
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 20:33  [ТС] 5
Это при выборе "Спортсмены" "Дети" "Взрослые"
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 20:35  [ТС] 6
При выборе '2' выходит такая ошибка:
Миниатюры
При изменении типа данных ошибка  
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 20:42  [ТС] 7
Вот еще скриншот ошибки
Миниатюры
При изменении типа данных ошибка  
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 20:50  [ТС] 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
        //вывод расписания
        private void rasp(
    DataGridView dataGridView,//куда выводим 
    ComboBox comboBox, //выбор по выпадающему списку
    DataTable DataTBox,// DataTable выпадающего списка
    int flag,// выбор источника данных
    DataGridView dataGridViewM,//источник данных dataGridView
    int idrasp //номер столбца для считывание id группы
    )
        {
 
            
            dataGridView.Columns.Clear();
            dataGridView.DataSource = null;
            int index1=0;
            string strID2 = "";
            int m = 0;
 
            if (flag == 1) { index1 = comboBox.SelectedIndex; } else { index1 = 1; }
            if (index1 > 0)
            {
                if (flag ==1) {
 
                    curR = DataTBox.Select("Gruppa = '" + comboBox.Text + "'");
                    strID2 = Convert.ToString(curR[0]["Gruppa"]);
                }
                else {
 
                    for (int i = 0; i < dataGridViewM.RowCount; i++)
                    {
                        
                        if (i == dataGridViewM.RowCount - 1)
                        {
                            strID2 = strID2 + Convert.ToString(dataGridViewM[idrasp, i].Value);
                        }
                        else {
                            strID2 = strID2 + Convert.ToString(dataGridViewM[idrasp, i].Value) + ", ";
                        }
                    }
 
                }
 
                if (strID2 == "") { MessageBox.Show("Нет информации по выбранным параметрам!"); return; }
                string str = "SELECT *  FROM  Raspisanie WHERE id IN (' + strID2 + ').Value"; 
                Connect();
                cmd = new OleDbCommand(str, conn);
                adap = new OleDbDataAdapter(cmd);
                DataT = new DataTable();
                adap.Fill(DataT);
 
                string str2 = "SELECT distinct Vremia FROM  Raspisanie WHERE id IN (' + strID2 + ').Value";
                Connect();
                cmd = new OleDbCommand(str2, conn);
                adap = new OleDbDataAdapter(cmd);
                DataTable DataT2 = new DataTable();
                adap.Fill(DataT2);
 
                string[] day = { "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресение" };
                string[] day2 = { "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс" };
                //List<string> time = new List<string>();
                dataGridView.ColumnCount = 8;
                string[] row0 = { "", "", "", "", "", "" };
                int j = 0;
                foreach (DataRow dev in DataT2.Rows)
                {
 
                    dataGridView.Rows.Add(row0);
                    dataGridView[0, j].Value = dev["Vremia"];
                    for (int i = 1; i <= 7; i++)
                    {
                        dataGridView.Columns[i].Width = 40;
                        dataGridView.Columns[i].Name = day2[i - 1];
                        string raspItem = "";
                        curR = DataT.Select("Vremia = '" + Convert.ToString(dev["Vremia"]) + "' AND Den_nedeli='" + day[i - 1] + "'");
                        if (curR.Length > 0)
                        {
                            raspItem = Convert.ToString(curR[0]["id"]);
                            dataGridView[i, j].Value = raspItem;
                            m = Convert.ToInt32(raspItem);
                            if (m <= 2) { m *= 100; } else { m *= 10;}
                            dataGridView[i, j].Style.BackColor = Color.FromArgb(150, m, m);
                        }
                    }
                    j++;
                }
                dataGridView.Columns[0].Name = "Время";
                dataGridView.Columns[0].Width = 70;
            }
 
        }
Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        //=================================================================
        //                           Расписание
        //=================================================================
 
        //при открытии вкладки
        private void tabControl1_Enter(object sender, EventArgs e)
        {
            //comboBox6.Items.Add("Выбрать");
            //comboBox6.SelectedIndex = 0;
            vid = AddToComboBox("SELECT *  FROM Vid", "Vid", comboBox6);
            
 
        }
        //при выборе вида занятия
        private void comboBox6_SelectedIndexChanged(object sender, EventArgs e)
        {
            dataGridView1.Columns.Clear();
            comboBox5.Items.Clear();
            //comboBox5.Items.Add("Выбрать");
            //comboBox5.SelectedIndex = 0;
 
            int index1 = comboBox6.SelectedIndex;
            if (index1 > 0)
            {
                curR = vid.Select("Vid = '" + comboBox6.Text + "'");
                VidID = Convert.ToInt32(curR[0]["id"]);
                VidCena = Convert.ToInt32(curR[0]["Cena"]);
                VidVid = Convert.ToString(curR[0]["vid"]);
                string str = "SELECT DISTINCT  Gruppa FROM Raspisanie WHERE Vid =" + VidID + "";
                group = AddToComboBox(str, "Gruppa", comboBox5);
 
            }
        }
        //при выборе группы
        private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
        {
            rasp(dataGridView1, comboBox5, group, 1, dataGridView1,0);
        }
0
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
19.12.2014, 22:29 9
Цитата Сообщение от nedel Посмотреть сообщение
вместо 1,2,3 должно быть '1','2','3'
а вы сделали '1,2,3'

Добавлено через 8 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (index1 > 0)
            {
                if (flag ==1) {
 
                    curR = DataTBox.Select("Gruppa = '" + comboBox.Text + "'");
                    strID2 =  string.Format("'{0}'",curR[0]["Gruppa"]);
                }
                else {
 
                    for (int i = 0; i < dataGridViewM.RowCount; i++)
                    {
                         strID2 = string.Format("{0},'{1}'", strID2, dataGridViewM[idrasp, i].Value);
                    }
 
                }
 
                if (strID2 == "") { MessageBox.Show("Нет информации по выбранным параметрам!"); return; }
                strID2 = strID2.Trim(',');
                string str = string.Format("SELECT *  FROM  Raspisanie WHERE id IN ({0})",strID2); 
                Connect();
                cmd = new OleDbCommand(str, conn);
                adap = new OleDbDataAdapter(cmd);
                DataT = new DataTable();
                adap.Fill(DataT);
1
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 22:30  [ТС] 10
Цитата Сообщение от nedel Посмотреть сообщение
Цитата Сообщение от nedel Посмотреть сообщение
вместо 1,2,3 должно быть '1','2','3'
У меня нету конкретных 1,2,3 в комбобоксе, у меня заполнение из базы происходит
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
19.12.2014, 22:33  [ТС] 11
Вот скриншот, как зависает прога
Миниатюры
При изменении типа данных ошибка  
0
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
19.12.2014, 23:33 12
Цитата Сообщение от Staruy Посмотреть сообщение
У меня нету конкретных 1,2,3
так это только пример, чтоб показать как нужно составить список значений для кострукции IN (...)

Добавлено через 1 минуту
в предыдущим посте я вам дал изменненный кусок кода, который реализует то, о чем я говорю
1
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
20.12.2014, 10:21  [ТС] 13
Цитата Сообщение от nedel Посмотреть сообщение
Код C#
1
string str = "SELECT * FROM Raspisanie WHERE id IN (" + strID2 + ")";
У меня и так эта строка была.
Только она почему-то работает только с цифрами. или не она...
Миниатюры
При изменении типа данных ошибка  
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
20.12.2014, 10:22  [ТС] 14
При использовании цифры в формате string (а не в родном int) программа всё равно работает. Но если я впишу вместо цифры любую букву, то программа вылетает.
Миниатюры
При изменении типа данных ошибка   При изменении типа данных ошибка  
0
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
20.12.2014, 12:37 15
Лучший ответ Сообщение было отмечено Staruy как решение

Решение

Цитата Сообщение от Staruy Посмотреть сообщение
Только она почему-то работает только с цифрами.
потому что и вас id - числовое поле

Добавлено через 8 минут
вот вам новый код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if (index1 > 0)
            {
               string str="";
                if (flag ==1) {
 
                    curR = DataTBox.Select("Gruppa = '" + comboBox.Text + "'");
                    if(curR.Length>0)
                         str = string.Format("SELECT *  FROM  Raspisanie WHERE gruppa='{0}",curR[0]["Gruppa"]); 
                }
                else {
                     if (dataGridViewM.RowCount>0) 
                          { 
                             for (int i = 0; i < dataGridViewM.RowCount; i++)
                              {
                               strID2 = string.Format("{0},{1}", strID2, dataGridViewM[idrasp, i].Value);
                              }
                   
                            strID2 = strID2.Trim(',');
                           str = string.Format("SELECT *  FROM  Raspisanie WHERE id IN ({0})",strID2); 
                         }
                }
                 if (str== "") 
                          { MessageBox.Show("Нет информации по выбранным параметрам!"); return; }
              
                Connect();
                cmd = new OleDbCommand(str, conn);
                adap = new OleDbDataAdapter(cmd);
                DataT = new DataTable();
                adap.Fill(DataT);
1
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
20.12.2014, 15:16  [ТС] 16
Цитата Сообщение от nedel Посмотреть сообщение
Сегодня, 14:37 При изменении типа данных ошибка [В закладки] [Плавающее окно] #15 (permalink)
Цитата Сообщение от Staruy Посмотреть сообщение
Только она почему-то работает только с цифрами.
потому что и вас id - числовое поле
Добавлено через 8 минут
вот вам новый код:
Код C#
if (index1 > 0)
{
string str="";
if (flag ==1) {
curR = DataTBox.Select("Gruppa = '" + comboBox.Text + "'");
if(curR.Length>0)
str = string.Format("SELECT * FROM Raspisanie WHERE gruppa='{0}",curR[0]["Gruppa"]);
}
else {
if (dataGridViewM.RowCount>0)
{
for (int i = 0; i < dataGridViewM.RowCount; i++)
{
strID2 = string.Format("{0},{1}", strID2, dataGridViewM[idrasp, i].Value);
}
strID2 = strID2.Trim(',');
str = string.Format("SELECT * FROM Raspisanie WHERE id IN ({0})",strID2);
}
}
if (str== "")
{ MessageBox.Show("Нет информации по выбранным параметрам!"); return; }
Connect();
cmd = new OleDbCommand(str, conn);
adap = new OleDbDataAdapter(cmd);
DataT = new DataTable();
adap.Fill(DataT);
Я понимаю, что у меня id числовое. Вставил ваш код, теперь у меня ни с чем не работает, ни с цифрами, ни с текстом.
0
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
20.12.2014, 18:44 17
Лучший ответ Сообщение было отмечено Staruy как решение

Решение

вот вам работающий вариант:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 //вывод расписания
        private void rasp(
    DataGridView dataGridView,//куда выводим 
    ComboBox comboBox, //выбор по выпадающему списку
    DataTable DataTBox,// DataTable выпадающего списка
    int flag,// выбор источника данных
    DataGridView dataGridViewM,//источник данных dataGridView
    int idrasp //номер столбца для считывание id группы
    )
        {
 
 
            dataGridView.Columns.Clear();
            dataGridView.DataSource = null;
            int index1 = 0;
            string strID2 = "";
            string field = "";
            int m = 0;
 
            if (flag == 1) { index1 = comboBox.SelectedIndex; } else { index1 = 1; }
            if (index1 > 0)
            {
 
                if (flag == 1)
                {
 
                    curR = DataTBox.Select("Gruppa = '" + comboBox.Text + "'");
                    field = "gruppa";
                    if (curR.Length > 0)
                        strID2 = string.Format("'{0}'", curR[0]["Gruppa"]);
                }
                else
                {
                    field = "id";
                    for (int i = 0; i < dataGridViewM.RowCount; i++)
                    {
                        strID2 = strID2 + Convert.ToString(dataGridViewM[idrasp, i].Value) + ",";
                    }
                    strID2 = strID2.Trim(',');
                }
 
                if (strID2 == "") { MessageBox.Show("Нет информации по выбранным параметрам!"); return; }
                string str =string.Format( "SELECT *  FROM  Raspisanie WHERE {0} IN ({1})",field,strID2);
                Connect();
                cmd = new OleDbCommand(str, conn);
                adap = new OleDbDataAdapter(cmd);
                DataT = new DataTable();
                adap.Fill(DataT);
 
                
                string str2 = string.Format("SELECT distinct Vremia  FROM  Raspisanie WHERE {0} IN ({1})", field, strID2);
                Connect();
                cmd = new OleDbCommand(str2, conn);
                adap = new OleDbDataAdapter(cmd);
                DataTable DataT2 = new DataTable();
                adap.Fill(DataT2);
 
                string[] day = { "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресение" };
                string[] day2 = { "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс" };
                //List<string> time = new List<string>();
                dataGridView.ColumnCount = 8;
                string[] row0 = { "", "", "", "", "", "" };
                int j = 0;
                foreach (DataRow dev in DataT2.Rows)
                {
 
                    dataGridView.Rows.Add(row0);
                    dataGridView[0, j].Value = dev["Vremia"];
                    for (int i = 1; i <= 7; i++)
                    {
                        dataGridView.Columns[i].Width = 40;
                        dataGridView.Columns[i].Name = day2[i - 1];
                        string raspItem = "";
                        curR = DataT.Select("Vremia = '" + Convert.ToString(dev["Vremia"]) + "' AND Den_nedeli='" + day[i - 1] + "'");
                        if (curR.Length > 0)
                        {
                            raspItem = Convert.ToString(curR[0]["id"]);
                            dataGridView[i, j].Value = raspItem;
                            m = Convert.ToInt32(raspItem);
                            if (m <= 2) { m *= 100; } else { m *= 10; }
                            dataGridView[i, j].Style.BackColor = Color.FromArgb(150, m, m);
                        }
                    }
                    j++;
                }
                dataGridView.Columns[0].Name = "Время";
                dataGridView.Columns[0].Width = 70;
            }
 
        }


Не по теме:

PS:
в предыдущем варианте закрывающюю кавычку упустил после {0} в

str = string.Format("SELECT * FROM Raspisanie WHERE gruppa='{0}",curR[0]["Gruppa"]);

1
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
20.12.2014, 20:30  [ТС] 18
Спасибо, расписание отображается и во вкладке расписание и во вкладке оплата. (скр1)
Во вкладке оплата вылетает при нажатии на кнопку добавить, ругается, что запрос имеет неверный формат.(скр2)
Во вкладке Клиенты вылетает при выборе клиента (там отображаются его занятия, они и вылетают).(скр3)
Миниатюры
При изменении типа данных ошибка   При изменении типа данных ошибка   При изменении типа данных ошибка  

0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 33
20.12.2014, 20:35  [ТС] 19
Буду благодарен, елси по подробнее объяснити выделенные места в коде:
field = "gruppa";
if (curR.Length > 0)
strID2 = string.Format("'{0}'", curR[0]["Gruppa"]);
field = "id";
0
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
20.12.2014, 21:45 20
Лучший ответ Сообщение было отмечено Staruy как решение

Решение

Цитата Сообщение от Staruy Посмотреть сообщение
field = "gruppa";
...........
field = "id";
вы в зависимости от flag делаете выборку или по id или по gruppa - вот переменная field и содержит название этого поля

Цитата Сообщение от Staruy Посмотреть сообщение
if (curR.Length > 0)
curR - массив строк, который вы получаете из DataTBox.Select, теоретически он может быть пустой, вот чтобы избежать исключения и проводится эта проверка

Цитата Сообщение от Staruy Посмотреть сообщение
strID2 = string.Format("'{0}'", curR[0]["Gruppa"]);
поскольку gruppa у вас строковый тип, то его значение в SQL нужно обрамлять одинарными кавычками

в даном случае это можно записать как
C#
1
strID2 = "'" + curR[0]["Gruppa"].ToString() + "'";
почитайте на досуге о String.Format

Добавлено через 7 минут
Цитата Сообщение от Staruy Посмотреть сообщение
Во вкладке оплата вылетает при нажатии на кнопку добавить, ругается, что запрос имеет неверный формат.(скр2)
вы уверенны, что в comboBox3.Text содержится целое число?

Цитата Сообщение от Staruy Посмотреть сообщение
Во вкладке Клиенты вылетает при выборе клиента (там отображаются его занятия, они и вылетают).(скр3)
Цитата Сообщение от nedel Посмотреть сообщение
for (int i = 0; i < dataGridViewM.RowCount; i++) { strID2 = strID2 + Convert.ToString(dataGridViewM[idrasp, i].Value) + ","; }
видимо не все значения dataGridViewM[idrasp, i].Value содержат целые числа, возможно, что некоторые пустые, тоесть нужно сделать проверку перед тем как добавлять в strID2
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2014, 21:45
Помогаю со студенческими работами здесь

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

При изменении данных в БД синхронизировать с приложением
Здраствуйте, стандартная ситуация имеется: 1. нормализованная БД Mysql (серверное ПО на...

Обновление ComboBox при изменении данных
Всем привет, загружаю данные в combo из БД public void SelectDepartment(ControlDepartment dep)...

Ошибка при изменении записи в Firebird
Работаю в C# с базой Firebird. Есть таблица с полем типа varchar, кодировкой Win1251 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru