Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > INSERT double


Автор: MoRoZfromT 4.9.2006, 21:21
Нужно запихать в базу Access'a такую строку

Код

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


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

Как решить эту задачу?

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

Цитата

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);


Автор: HalkaR 4.9.2006, 22:01
Пример из 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;
}


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

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

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

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

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

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

Автор: MoRoZfromT 6.9.2006, 18:12
Чертовщина какая-то. 
Сделал параметрический запрос, но проблема опять в этом 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."
Чего же я не так делаю?



Автор: marcusmae 6.9.2006, 18:26
А если f поставить

Код

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


?

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

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

Автор: MoRoZfromT 7.9.2006, 20:27
c буковкой f не прокатывает.

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

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

вообще ничего не понимаю.

Автор: marcusmae 7.9.2006, 21:07
Цитата

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


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

Код

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


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

Код

double sentCostTotal


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

Код

Single sentCostTotal = 0.0;


?

Автор: MoRoZfromT 8.9.2006, 17:00
это я сам потом заметил. не помогает. к тому же я переделал немного.
теперь код выглядит так
Код

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;
               }
        }

Автор: mr.DUDA 8.9.2006, 22:03
Может, в самой таблице тип не double а real ?

Автор: MoRoZfromT 10.9.2006, 13:21
в таблице тип "Двойное с плавающей точкой"
все уже перепробовал

Автор: Mad 10.9.2006, 13:33
Цитата(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(',','.'));

Автор: MoRoZfromT 10.9.2006, 18:05
я понял в чем была бага: нельзя называть столбец именем sum - это ключевое слово.

последнее предложенное решение выглядит более элегантно.
всем спасибо за участие.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)