Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2011, 02:08   #1
lkjuio
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 11
По умолчанию при вставке записи в БД (MDB) выдает ошибку "неправильный синтаксис запроса"

Здравствуйте. В коде выдает ошибку "неправильный синтаксис запроса". В таблице все поля числовые. Подскажите что не так, пожалуйста.


Код:
 string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;" + "data source = Baza.mdb";
            OleDbConnection myODC = new OleDbConnection(connectionString);
            myODC.Open();
            for (int i = 0; i < 8; i++)
            {
             string   sql = "Insert into Priznaki (ID_Picture, ID_Method, N_Priznak, Value) values (1,2,"+i+","+Convert.ToDouble(listBox1.Items[i].ToString())+")";
            OleDbCommand ODbC = new OleDbCommand(sql, myODC);
            ODbC.ExecuteNonQuery();
            }
            ODbC.ExecuteNonQuery();*/
            myODC.Close();
lkjuio вне форума Ответить с цитированием
Старый 30.04.2011, 10:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

1) Выведите получаемую строчку на экран (через MessageBox, например)

2) откройте саму БД, создайте SQL запрос,
напишите в нём
Код:
Insert into Priznaki (ID_Picture, ID_Method, N_Priznak, Value) values (1,2, 0, 0)
и выполните. Отработает?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.04.2011, 11:38   #3
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
В коде выдает ошибку "неправильный синтаксис запроса".
1. Value - ключевое слово, поэтому возьмите его в квадратные скобки (они нужны, если имя поля совпадет с ключевым словом языка T-SQL) (взял все поля для единообразия):
Код:
Insert into [Priznaki] ([ID_Picture], [ID_Method], [N_Priznak], [Value])
2. Далее может появиться вторая ошибка, т.к. вы пишите:
Код:
Convert.ToDouble(listBox1.Items[i].ToString())
Что здесь происходит:
1. Значение (из listBox1.Items[i]) преобразуется в double.
2. Значение из double преобразуется обратно в строку (т.к. идет конкатенация строк).
Если, в вашей локализации дробная часть отделяется от целой запятой, то - получится такой запрос:
Код:
"Insert into Priznaki (ID_Picture, ID_Method, N_Priznak, Value) values (1,2, 1, 2,4);
// еcли: 
// i = 1;
// listBox1.Items[i] = 2,4;
Т.е. в строке формируется на одно значение больше.

Не надо так фармировать sql-запросы. Для передачи значений есть параметры:
Код:
string   sql = "Insert into Priznaki (ID_Picture, ID_Method, N_Priznak, [Value]) values (1, 2, @i, @value)";
OleDbCommand ODbC = new OleDbCommand(sql, myODC);
ODbC.Parameters.Add("@i", OleDbType.Integer).Value = i;
ODbC.Parameters.Add("@value", OleDbType.Double).Value = Convert.ToDouble(listBox1.Items[i].ToString());
ODbC.ExecuteNonQuery();
P.S.
Создание объекта ODbC можно вынести из цикла:
Код:
            string connectionString = "provider=Microsoft.Jet.OLEDB.4.0; data source = Baza.mdb";
            OleDbConnection myODC = new OleDbConnection(connectionString);
            myODC.Open();
            try
            {
                string sql = "Insert into Priznaki (ID_Picture, ID_Method, N_Priznak, [Value]) values (1, 2, @i, @value)";
                OleDbCommand ODbC = new OleDbCommand(sql, myODC);
                ODbC.Parameters.Add("@i", OleDbType.Integer);
                ODbC.Parameters.Add("@value", OleDbType.Double);

                for (int i = 0; i < 8; i++)
                {
                    ODbC.Parameters["@i"].Value = i;
                    ODbC.Parameters["@value"].Value = Convert.ToDouble(listBox1.Items[i].ToString());
                    ODbC.ExecuteNonQuery();
                }
            }
            finally
            {
                myODC.Close();
            }
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 30.04.2011 в 11:47.
Daramant вне форума Ответить с цитированием
Старый 30.04.2011, 12:26   #4
lkjuio
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 11
По умолчанию

Заработало. Огромное спасибо)
lkjuio вне форума Ответить с цитированием
Старый 30.04.2011, 13:49   #5
lkjuio
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 11
По умолчанию

Еще вопросик. У меня 2 связанных таблицы:
Priznaki (ID_Picture, ID_Method, N_Priznak, [Value])
Logos (ID_Picture,Way, ID_Category) - ID_Picture - счетчик
я их заполняю с формы. Как сделать чтоб они заполнялись одновременно и не нарушалась целостность.
Как объединить 2 запроса:
Код:
string  sql = "Insert into Logos (Way, ID_Category) values ('"+pict.url+"',1)";
и предыдущий?
lkjuio вне форума Ответить с цитированием
Старый 30.04.2011, 18:12   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
я их заполняю с формы. Как сделать чтоб они заполнялись одновременно и не нарушалась целостность.
По хорошему - надо вставить запись (по вашей структуре) в таблицу Logos -
сделать:
@"
Insert into Logos (Way, ID_Category) values (...)
Select SCOPE_IDENTITY();"
затем,
int logosId = Convert.ToInt32(cmd.ExecuteScalar() ); // это будет идентификатор вставленной записи.
и уже с этим id вставить запись в таблицу Priznaki.

Цитата:
Как объединить 2 запроса:
Необходимо использовать транзакции:
Код:
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();
                OleDbTransaction transaction = connection.BeginTransaction();
                
                try
                {
                    string sql = "...";
                    OleDbCommand cmd = new OleDbCommand(sql, connection, transaction);

                    // insert
                    // insert
                    // ...
                    // insert

                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
            }
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 19:12   #7
lkjuio
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 11
По умолчанию

Я может не правильно транзакцию вставила, выдает ошибку "Пропущен символ ( в конце инструкции SQL"/?
Код:
{
           string connectionString = "provider=Microsoft.Jet.OLEDB.4.0; data source = Baza.mdb";
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();
                OleDbTransaction transaction = connection.BeginTransaction();

                try
                {
                    string sql = "Insert into Logos (Way, ID_Category) values ('"+pict.url+"',1) Select SCOPE_IDENTITY();";
                    OleDbCommand cmd = new OleDbCommand(sql, connection, transaction);

                        int logosId = Convert.ToInt32(cmd.ExecuteScalar());
                        cmd.CommandText="Insert into Priznaki (ID_Picture, ID_Method, N_Priznak, [Value]) values ("+logosId+"," + Convert.ToInt16(textBox1.Text) + ", @i, @value);";
                        cmd.Parameters.Add("@i", OleDbType.Integer);
                        cmd.Parameters.Add("@value", OleDbType.Double);
                        cmd.Parameters.Add("@k", OleDbType.Integer);
                        

                        for (int i = 0; i < Convert.ToInt16(textBox2.Text); i++)
                        { 
                            cmd.Parameters["@i"].Value = i + 1;
                            cmd.Parameters["@value"].Value = Convert.ToDouble(listBox1.Items[i].ToString());
                            cmd.ExecuteNonQuery();
                        }
                    
                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                    
                }
                connection.Close();
            }
lkjuio вне форума Ответить с цитированием
Старый 01.05.2011, 21:18   #8
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Я может не правильно транзакцию вставила, выдает ошибку "Пропущен символ ( в конце инструкции SQL"/?
В описании же написано, что ошибка в синтаксисе.
А именно - нет точки с запятой после insert:
Код:
string sql = "Insert into Logos (Way, ID_Category) values ('"+pict.url+"',1); Select SCOPE_IDENTITY();";
Но этот код все равно работать не будет т.к. ms access не поддерживает выполнение сразу группы операций, да и функции SCOPE_IDENTITY().
Посмотри это: Как определить ключ добавленной или существующей записи?
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 01.05.2011, 23:30   #9
lkjuio
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 11
По умолчанию

разобралась. Спасибо
lkjuio вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присвоить разные значения параметру при вставке записи в базу Gover БД в Delphi 3 19.04.2010 21:37
При установки игры выдает ошибку записи файла (возможна,нет места на диске ) serenikei Свободное общение 8 05.03.2010 23:48
выдает ошибку при вызове scanf Wi1D Общие вопросы C/C++ 6 27.12.2009 19:53
Почему не выдает результат записи. Ну или бы хотя бы ошибку какую. Lorel PHP 2 01.12.2008 14:29