Автор Тема: C API за MYSQL  (Прочетена 3962 пъти)

akif

  • Напреднали
  • *****
  • Публикации: 16
    • Профил
C API за MYSQL
« -: Feb 28, 2005, 00:00 »
Здравейте приятели!
Пиша "Склад" на MYSQL като  използвам "С" за писане на клиента.
Заявката с която имам проблем има следния вид:
sprintf(query, "isert ito my_table values(%d, %d, %d, %f, %f)",
                cl_id, st_id, doc_id,  cena, colicestvo);
printf("%s\n", query);
Низа който се получава има следния вид:
 insert into my_table values(1, 2, 3,  20,33,  11,4)
Проблема е във последните 2 стойности които са от
тип  double.
MYSQL  иска стойностит да имат вида 22.(точка)33, а
в моя случай аз плучавам от потребителя тази променлива във вид на низ и като я преобразувам чрез  cena = atof(my_cena); , променливата cena=22,(запетая)33.
Всъщност трябва да заменя символа ',' във '.' във заявката, но
 във случая това не низ, а променлива от тип double.
Ако някой ми даде идея как да реша този проблем ще
съм му много благодарен '<img'>
Активен

  • Гост
C API за MYSQL
« Отговор #1 -: Feb 28, 2005, 00:54 »
replace() в повечето езици я има тая функция. Не съм сигурен обаче за С '<img'> Иначе прави точно това - заменя синвол/и с друг/и

П.П. погледни тук http://bg2.php.net/manual/en/function.str-replace.php за да видим дали правилно се насочвам какво ти трбва - знам че това е за ПХП а не за С '<img'>
Активен

  • Гост
C API за MYSQL
« Отговор #2 -: Feb 28, 2005, 01:04 »
MySQL не може да иска да са в формата еди-кво-си. Може да иска да е определен тип променливата. Виж точно какъв тип приема функцията(в .h където е декларирана функцията, която ползваш). Като видиш какъв е типа, просто използвай type-casting и си готов. Примерно ако иска да е тип float, правиш така:
Примерен код

blablabla(float(name_of_double_var), float(bla_bla_var))

или ако ти е удобно си ги cast-ни предварително.
Активен

  • Гост
C API за MYSQL
« Отговор #3 -: Feb 28, 2005, 20:43 »
Цитат (Guest @ Фев. 28 2005,02:04)
MySQL не може да иска да са в формата еди-кво-си. Може да иска да е определен тип променливата. Виж точно какъв тип приема функцията(в .h където е декларирана функцията, която ползваш). Като видиш какъв е типа, просто използвай type-casting и си готов. Примерно ако иска да е тип float, правиш така:
Примерен код

blablabla(float(name_of_double_var), float(bla_bla_var))

или ако ти е удобно си ги cast-ни предварително.

Това нещо -
insert into my_table values(1, 2, 3, double(33,32);
не работи.
Не съм сигурен че сте разбрали въпроса ми.
Имам низ  char str = "33,32";
double my_double =(double) atof(str);

insert into my_table values( double(my_double) );
Проблема е че my_double=33,32
Обърнете внимание на ЗАПЕТАЯТА.
Запетаята е разделител м/у отделните стойности
които са записани във заявката, а в моя случай ЗАПЕТАЯТА при my_double разделя цялата част от дробната.
ERROR 1064  blablabal Check the manual that corresponds to your MySQL server version for the right syntax to use near 'double(33,32)'
Надявам се че съм по-ясен.
Благодаря предварително за съдействието!  '<img'>
Активен

ivak

  • Напреднали
  • *****
  • Публикации: 156
    • Профил
C API за MYSQL
« Отговор #4 -: Mar 01, 2005, 00:38 »
нормално printf ползва точка за разделяне на цялата от дробната част, обаче в твоя случай явно въпросният символ е предефиниран. нямам unix подръка, за да проверя, но по стари спомени някъде в locale.h имаше char *decimal_point. май беше в някаква структура.

ако не можеш да го намериш или пък не искаш да го променяш, можеш да направиш sprintf в междинен буфер и после да замениш запетаята с точка, като ползваш strchr.

и един последен съвет: мъдрите хора ползват int за цената, представена в стотинки, защото иначе рискуват да получат зверски грешки от закръгляне.
Активен

Cлoжнитe пpoблeми имaт пpocти и лecни зa paзбиpaнe гpeшни oтгoвopи.

ivak

  • Напреднали
  • *****
  • Публикации: 156
    • Профил
C API за MYSQL
« Отговор #5 -: Mar 01, 2005, 00:45 »
мда, кажи "man 7 locale" и може би ще ти просветне малко.
Активен

Cлoжнитe пpoблeми имaт пpocти и лecни зa paзбиpaнe гpeшни oтгoвopи.

akif

  • Напреднали
  • *****
  • Публикации: 16
    • Профил
C API за MYSQL
« Отговор #6 -: Mar 01, 2005, 21:23 »
Цитат (ivak @ Март 01 2005,01:38)
нормално printf ползва точка за разделяне на цялата от дробната част, обаче в твоя случай явно въпросният символ е предефиниран. нямам unix подръка, за да проверя, но по стари спомени някъде в locale.h имаше char *decimal_point. май беше в някаква структура.

ако не можеш да го намериш или пък не искаш да го променяш, можеш да направиш sprintf в междинен буфер и после да замениш запетаята с точка, като ползваш strchr.

и един последен съвет: мъдрите хора ползват int за цената, представена в стотинки, защото иначе рискуват да получат зверски грешки от закръгляне.

Благодарности за съвета да използвам цената в стотинки и int стойност за цената.
В този случай отпада проблема със double.
Но все пак трябва да го реша проблема, за да си изясня
нещата за в бъдещи потребности.
Ако имаш някакви конкретни идеи за СУРБД за Скалд ще
съм ти задължен.
Защото за първи път пиша софтуер със Бази от Данни.
Благодарности  '<img'> !
Активен

  • Гост
C API за MYSQL
« Отговор #7 -: Mar 01, 2005, 23:33 »
Или използвай този код да замениш запетаите с точки:
Примерен код

char str[] = "32,33";
int i = 0;
for(i; i < strlen(str); i++)
{
if(str[i] == ',') str[i] = '.';
}
// str вече е 32.33


Поздрави,
gamehack
Активен

ivak

  • Напреднали
  • *****
  • Публикации: 156
    • Профил
C API за MYSQL
« Отговор #8 -: Mar 02, 2005, 01:29 »
Цитат (akif @ Март 01 2005,22:23)
Но все пак трябва да го реша проблема, за да си изясня нещата за в бъдещи потребности.

писах ти вече, проблемът ти е в локала. sprintf, fprintf и прочее деривати на printf ползват decimal_point символа, зададен в него.

Цитат (akif @ Март 01 2005,22:23)
Ако имаш някакви конкретни идеи за СУРБД за Скалд ще съм ти задължен.

по принцип не се занимавам с бази данни и не мога да ти дам кой знае какви идеи. Все пак, ако имаш някакви конкретни питания, давай. Наоколо има достатъчно сведущи хора.
Активен

Cлoжнитe пpoблeми имaт пpocти и лecни зa paзбиpaнe гpeшни oтгoвopи.

mironcho

  • Напреднали
  • *****
  • Публикации: 495
    • Профил
C API за MYSQL
« Отговор #9 -: Mar 02, 2005, 10:31 »
Цитат (Guest @ Март 02 2005,00:33)
Или използвай този код да замениш запетаите с точки:
Примерен код

char str[] = "32,33";
int i = 0;
for(i; i < strlen(str); i++)
{
if(str[i] == ',') str[i] = '.';
}
// str вече е 32.33


Поздрави,
gamehack

Или използвай strchr():

Примерен код

char *p;
if ((p = strchr(str, ',')) != NULL) {
        *p = '.';
}


Ако очакваш повече от една запетайки, примера на gamehack е по удачен, или ще трябва да си направиш цикъл с strchr().
За подробно описание - man 3 strchr.
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
C API за MYSQL
« Отговор #10 -: Mar 02, 2005, 10:35 »
@gamehack: не си прав, човече. твоето решение ще работи, но само в конкретния случай. представи си, че тоя софтуер в някакъв момент се пусне в Танзания, където да кажем разделителя за десетичната част е ! (това е примерно само, разбира се).
нещата трябва да се правят да работят във всички ситуации.

поздрави '<img'>
Активен

  • Гост
C API за MYSQL
« Отговор #11 -: Mar 02, 2005, 10:59 »
много идеи и всичките сложни '<img'>

sprintf(query, "iнsert ito my_table values(%d, %d, %d, %f, %f)",
cl_id, st_id, doc_id,  cena, colicestvo);
сложи double стойностите в единични кавички и enjoy '<img'>
sprintf(query, "insert ito my_table values('%d', '%d', '%d', '%f', '%f''<img'>",
cl_id, st_id, doc_id,  cena, colicestvo);
Активен

akif

  • Напреднали
  • *****
  • Публикации: 16
    • Профил
C API за MYSQL
« Отговор #12 -: Mar 02, 2005, 20:22 »
Цитат (mironcho @ Март 02 2005,11:31)
Цитат (Guest @ Март 02 2005,00:33)
Или използвай този код да замениш запетаите с точки:
Примерен код

char str[] = "32,33";
int i = 0;
for(i; i < strlen(str); i++)
{
if(str[i] == ',') str[i] = '.';
}
// str вече е 32.33


Поздрави,
gamehack

Или използвай strchr():

Примерен код

char *p;
if ((p = strchr(str, ',')) != NULL) {
        *p = '.';
}


Ако очакваш повече от една запетайки, примера на gamehack е по удачен, или ще трябва да си направиш цикъл с strchr().
За подробно описание - man 3 strchr.

Благодаря за отзивите.
Този код със промяна на "," със "." ми е ясен,
но моя проблем беше друг.
Потребителя въвежда низ във entry, след което
този низ се поставя във заявката към сървъра чрез
spirintf("insert into my_table %f", atof(niz));
Фактичесики проблема не е в низа, а във това че след
като atof(...); преобразува низа във double се получава стойност
(например 22,32 ОТБЕЛЯЗВАМ ЧЕ 22,32 е число, а не НИЗ) при която разделителя на цялата част от десетичната е ЗАПЕТАЯ което е проблем за заявката,
защото ЗАПЕТАЯТА се явява разделител м/у отделните стойности които се пращат към сървъра. '<img'>  
Мисля че проблема ще се реши със locale();
Прегледах man 7 locale, но честно казано не можах да разбера как да променя разделителя м/у цялата и десетичната част.
Ако ми изпратите някакъв кокретен код за промяна
на този разделител ще ме трогнете '<img'> .
Активен

  • Гост
C API за MYSQL
« Отговор #13 -: Mar 02, 2005, 22:12 »
Цитат (Guest @ Март 02 2005,11:59)
много идеи и всичките сложни '<img'>

sprintf(query, "iнsert ito my_table values(%d, %d, %d, %f, %f)",
cl_id, st_id, doc_id,  cena, colicestvo);
сложи double стойностите в единични кавички и enjoy '<img'>
sprintf(query, "insert ito my_table values('%d', '%d', '%d', '%f', '%f''<img'>",
cl_id, st_id, doc_id,  cena, colicestvo);

daf Това нещо със еденични кавички не работи коректоно.
опитна да изпратиш заявка от вида:
insert ito my_table values('1' ,  '33,32''<img'>;
и ще видиш.   '<img'>
Проблема го реших като низа не го преобразувам
във доубле, а променям само ЗАПЕТАЯТА в низа с ТОЧКА и го поставям в заявката.
Например:
sprintf(query, "insert into my_table values(%d, '%s''<img'>", atoi(niz1), niz2);
Като niz2 се очаква да чесло.  '<img'>
Благодарности на всички.  '<img'>
Активен

mironcho

  • Напреднали
  • *****
  • Публикации: 495
    • Профил
C API за MYSQL
« Отговор #14 -: Mar 02, 2005, 22:27 »
Айде сега - в първия ти пост написа (цитирам) - " моя случай аз плучавам от потребителя тази променлива във вид на низ и като я преобразувам чрез  cena = atof(my_cena);".... значи все пак първо я имаш като низ '<img'>

И все пак, дори ако я нямаш първоначално в низ, какъв ти е проблема да sprintf -неш по отделно в низове и низовете да си ги обработиш по по-горе посочените начини. Може би става дълго, но ако наистина няма друг начин да се справиш с проблема, и това е вариант '<img'>

Иначе, това което казва ivak звучи логично - погледни все пак какъв ти е локала при изпълнението на програмата, и дори за по сигурно, в началото можеш да си го сетваш на някой стандартен.. примерно на 'C' '<img'>. Начини разни - setenv(), setlocale()...


Успех
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
MySql малък проблем.
Хардуерни и софтуерни проблеми
Marto 6 4565 Последна публикация Sep 25, 2002, 12:32
от
mysql въпрос
Настройка на програми
dumi 0 1405 Последна публикация Oct 08, 2003, 06:42
от dumi
Perl + CGI,DBI + Mysql ili PHP + Mysql
Общ форум
jica 3 5300 Последна публикация Sep 07, 2004, 17:02
от jica
Mysql проблем със стартирането(mysql.sock missing)
Настройка на програми
coveka 6 7152 Последна публикация Mar 01, 2008, 22:02
от coveka
Mysql: can't connect to local mysql server
Настройка на програми
wonder 1 5537 Последна публикация Mar 16, 2008, 01:17
от neter