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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> INSERT double, вставить значение с запятой 
V
    Опции темы
MoRoZfromT
Дата 4.9.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно запихать в базу Access'a такую строку

Код

sql = string.Format("INSERT INTO acc_test (userid,filterid,sum) VALUES ({0},{1},{2})", drUser[0], drFilter[0], sentCostTotal);


получаю синтаксическую ошибку из-за sentCostTotal. Эта переменная типа double. Насколько я понимаю при подставление параметра в запрос в качестве знака разделения целой и дробной части ставится запятая, в результате чего получается несоответствие количества столбцов и значений.

Как решить эту задачу?
PM MAIL   Вверх
marcusmae
Дата 4.9.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Предположу, что заключение масок в косые апострофы способно улучшить ситуацию :

Цитата

sql = string.Format("INSERT INTO acc_test (userid,filterid,sum) VALUES (`{0}`,`{1}`,`{2}`)", drUser[0], drFilter[0], sentCostTotal);


если не помогло, то попробуй ещё отправить вещественное число в представлении с мантиссой :

Цитата

sql = string.Format("INSERT INTO acc_test (userid,filterid,sum) VALUES ({0},{1},{2:E})", drUser[0], drFilter[0], sentCostTotal);




--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
HalkaR
Дата 4.9.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


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

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



Пример из MSDN - посмотри
Код

static public int AddProductCategory(string newName, string connString)
{
    Int32 newProdID = 0;
    string sql =
      "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
        + "SELECT CAST(scope_identity() AS int)";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@Name", SqlDbType.VarChar);
        cmd.Parameters["@name"].Value = newName;
        try
        {
            conn.Open();
            newProdID = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    return (int)newProdID;
}


PM MAIL   Вверх
marcusmae
Дата 4.9.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



согласен с HalkaR : можно сделать параметризованный запрос сначала задав общий вид, а затем подставив нужные параметры. Но не может быть, чтобы без этого нельзя было обойтись!  smile

+ со всей аккуратностью нужно с uint, VarChar (string) и тому подобными неформатными типами. A double вроде везде double...

Это сообщение отредактировал(а) marcusmae - 4.9.2006, 22:28


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 5.9.2006, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



В SQL Server вещественный тип всегда идёт с точкой, независимо от настроек культуры. А при конвертации double.ToString на клиентской машине может быть подставлена либо точка, либо запятая. Так что либо делаем специальный NumberFormatInfo с NumberDecimalSeparator = "." и передаём его в ToString, либо используем параметризованные запросы. Кстати, параметры можно не обязательно обозначать именами, можно ставить символ "?".


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


Великий МунаБудвин
****


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

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



Цитата(mr.DUDA @  5.9.2006,  08:26 Найти цитируемый пост)
В SQL Server вещественный тип всегда идёт с точкой

Тут речь об Аксесе, а у него с точностью до наоборот - формат вещественного типа зависит от текущей локали.

Так что пользуйтесь параметрическими запросами  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
MoRoZfromT
Дата 6.9.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чертовщина какая-то. 
Сделал параметрический запрос, но проблема опять в этом double

Код

string sqlins = "INSERT INTO acc_test (userid,filterid,sum) VALUES (@User,@Filter,@Sum);";


                using (OleDbConnection conn = new OleDbConnection(ConfigurationSettings.AppSettings["dbstring"]))
                {
                    OleDbCommand cmd = new OleDbCommand(sqlins, conn);
                    cmd.Parameters.Add("@User", SqlDbType.Int);
                    cmd.Parameters["@User"].Value = drUser[0];
                    cmd.Parameters.Add("@Filter", SqlDbType.Int);
                    cmd.Parameters["@Filter"].Value = drFilter[0];
                    cmd.Parameters.Add("@Sum", SqlDbType.Float);
                    //cmd.Parameters["@Sum"].Value = sentCostTotal;
                    cmd.Parameters["@Sum"].Value = 1.0;
                    try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        ErrMsg.Text = ex.Message;
                    }
                }


Стоит убрать этот параметр @Sum - запрос проходит.  Даже если я напрямую присваиваю параметру значение 1.0 не работает запрос.
Всегда одно и то же "Syntax error in INSERT INTO statement."
Чего же я не так делаю?



PM MAIL   Вверх
marcusmae
Дата 6.9.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



А если f поставить

Код

cmd.Parameters["@Sum"].Value = 1.0f;


?

Добавлено @ 18:27 
+ где и как объявлено sentCostTotal?

Добавлено @ 18:29 
+ поставь брейк в catch-е и напиши, что за запрос там в cmd лежит.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
MoRoZfromT
Дата 7.9.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



c буковкой f не прокатывает.

выше в этой же функции
double sentCostTotal = 0.0;

ставлю брейк, в коммандтексте вижу:
INSERT INTO acc_test (userid,filterid,sum) VALUES (@User,@Filter,@Sum)

вообще ничего не понимаю.
PM MAIL   Вверх
marcusmae
Дата 7.9.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Цитата

выше в этой же функции
double sentCostTotal = 0.0;


ну так, пардон, ты заявляешь тип Float

Код

cmd.Parameters.Add("@Sum", SqlDbType.Float);


а присваиваешь double 

Код

double sentCostTotal


То есть, что, если сделать

Код

Single sentCostTotal = 0.0;


?



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
MoRoZfromT
Дата 8.9.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



это я сам потом заметил. не помогает. к тому же я переделал немного.
теперь код выглядит так
Код

string sqlins = "INSERT INTO acc_test (userid,filterid,sum) VALUES (@User,@Filter,@Sum)";
using (OleDbConnection conn = new OleDbConnection(ConfigurationSettings.AppSettings["dbstring"]))
    {
        OleDbCommand cmd = new OleDbCommand(sqlins, conn);
        cmd.Parameters.Add("@User", OleDbType.Integer);
        cmd.Parameters["@User"].Value = drUser[0];
        cmd.Parameters.Add("@Filter", OleDbType.Integer);
        cmd.Parameters["@Filter"].Value = drFilter[0];
        cmd.Parameters.Add("@Sum", OleDbType.Double);
        cmd.Parameters["@Sum"].Value = sentCostTotal;
        try
              {
                 conn.Open();
                 cmd.ExecuteNonQuery();
              }
    catch (Exception ex)
              {
                ErrMsg.Text = ex.Message;
               }
        }

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


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


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

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



Может, в самой таблице тип не double а real ?


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


Новичок



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

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



в таблице тип "Двойное с плавающей точкой"
все уже перепробовал
PM MAIL   Вверх
Mad
Дата 10.9.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(MoRoZfromT @  4.9.2006,  20:21 Найти цитируемый пост)
sql = string.Format("INSERT INTO acc_test (userid,filterid,sum) VALUES ({0},{1},{2})", drUser[0], drFilter[0], sentCostTotal);


Код

sql = string.Format("INSERT INTO acc_test (userid,filterid,sum) VALUES ({0},{1},{2})", drUser[0], drFilter[0], sentCostTotal.ToString().Replace(',','.'));



--------------------
user posted image
PM MAIL   Вверх
MoRoZfromT
Дата 10.9.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я понял в чем была бага: нельзя называть столбец именем sum - это ключевое слово.

последнее предложенное решение выглядит более элегантно.
всем спасибо за участие.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

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

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

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


 




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


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

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