Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

SQL запросы в XML через ClientDataSet   Найти похожие ветки 

 
Galiaf ©   (2007-05-26 18:02) [0]

Пока писал на ado для access даже не использовал DataControls, а вот по сабжу появились проблемы, если я не собираюсь использовать TDBGrid или использовать толкьо для чтения, как же мне тогда добавлять, редактировать и удалять записи одним только ClientDataSet"ом? Я пытался прописать самый простой запрос в commandTex но даже он не работает.


 
sniknik ©   (2007-05-26 18:17) [1]

sql запросы выполняет sql сервер/движок... сам по себе ClientDataSet не может их выполнять, только если есть провайдер данных/связь с вышеупомянутым (куда он запрос передаст, получив в ответ данные, или ошибку).
для XML насколько знаю никто еще sql сервера не написал...


 
Galiaf ©   (2007-05-27 09:18) [2]

Хреново! Чтож я тогда взялся на нём писать??? Ну ладно, в любом случае там должна быть возможность добавления и изменения записей вручную, не подскажешь как это делается?


 
Galiaf ©   (2007-05-27 20:46) [3]

Извиняюсь за предыдущий вопрос, просто в последний раз когда я работал с mdb я добавлял и редактировал sql запросами, но чуть раньше я научился добавлять и редактировать компонентой tadotable, а у tclientdataset"а методы всё теже, так что вопрос по редактированию отпадает.

В данный момент проблема несколько другого плана, как сохранять изображения в таблице xml? Я создал поле image типа ftGraphic, в файле таблицы это поле описано следующим образом:

<FIELD attrname="image" fieldtype="bin.hex" SUBTYPE="Graphics"/>

При попытке записать изображение следующим образом:

cds.FieldValues["image"]:=img.Picture.Bitmap;

получаю ошибку о несовместимости типов tbitmap и variant. В общем даже если и найду как сохранить рисунок, то не найду как его от туда достать. Уверен многие знают как это делается и как это делается правильно. Прошу поделиться опытом.


 
sniknik ©   (2007-05-27 21:06) [4]

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


 
Loginov Dmitry ©   (2007-05-27 21:20) [5]

Все делается как обычно. Пример:


procedure TForm1.btnSaveClick(Sender: TObject);
var
 BF: TStream;
 I: Integer;
begin
 cds.FileName := "d:\cds.xml";
 cds.FieldDefs.Add("Img", ftGraphic);
 cds.CreateDataSet;
 cds.Open;
 for I := 1 to 10 do
 begin
   cds.Append;
   BF := cds.CreateBlobStream(cds.FieldByName("Img"), bmWrite);
   Image1.Picture.Bitmap.SaveToStream(BF);
   BF.Position := 0;
   TBlobField(cds.FieldByName("Img")).LoadFromStream(BF);
   BF.Free;
   cds.Post;
 end;
end;

procedure TForm1.btnLoadClick(Sender: TObject);
var
 BF: TStream;
begin
 cds.First;
 cds.Next;

 BF := cds.CreateBlobStream(cds.FieldByName("Img"), bmRead);
 Image1.Picture := nil;
 Image1.Picture.Bitmap.LoadFromStream(BF);
 BF.Free;
end;


 
Galiaf ©   (2007-05-29 09:39) [6]


> опыт "лежит" в примерах дельфи, надо только его оттуда взять.
> ..

Временем раньше я просматривал демки именно с этой целью но из того что мне надо нашёл только пример FishFact, в котором нет ни слова о сохранении картинки, есть только вывод имеющейся и то только компонентой dbimage.


> Loginov Dmitry ©   (27.05.07 21:20) [5]

Благодарю за пример.


 
Jan1 ©   (2007-05-29 09:43) [7]

Зачем тебе геморой с xml?  Это что передовая СУБД?


 
Карелин Артем ©   (2007-05-29 09:45) [8]


> sniknik ©   (26.05.07 18:17) [1]

ms SQL 2005, XPath, XQuery


 
sniknik ©   (2007-05-29 10:38) [9]

> есть только вывод имеющейся и то только компонентой dbimage
ввод
dbimage.picture.LoadFromFile
dbimage.picture.LoadFromClipboardFormat


 
Galiaf ©   (2007-05-29 23:37) [10]


> Jan1 ©   (29.05.07 09:43) [7]
>
> Зачем тебе геморой с xml?  Это что передовая СУБД?


А я в базах данных полный 0, и мне нужна была база для которой надо как можно меньше драйвер нести или не нести совсем, я узнал что для xml нужен только midas.dll

Сам я предпочитаю *.mdb, но случай предполагает использовать xml


 
sniknik ©   (2007-05-30 00:07) [11]

> но случай предполагает использовать xml
xml xml-ю рознь... не верь маркетологам! (они говорят типа универсальный формат...) добытую по случаю xml-лину вряд ли откроешь в ClientDataSet... только если она в нем и создана/такого же формата.

> Сам я предпочитаю *.mdb
ну и "предпочитай" дальше, возможностей по сравнению с xml как базой у него гораздо больше, а таскать нужно меньше на одну dll... т.е. не нужно ни одной. (есть варианты конечно когда чегото для него не стоит в винде, но сейчас это скорее исключение чем правило)


 
Galiaf ©   (2007-05-30 09:07) [12]

Я попробовал сохранить clientDataSet"ом в формате *.cds, получил файл с крякозябрами который весил 2/3 от xml-евского, даже переписывать ничего не надо, думаю его использовать.
Заметил некрасивость одну, у меня по кнопке "добавить" прописано
cds.append;
panel.visible:=true

по кнопке "Ok" прописаны изменения, а на отмену удаление.
Если курсор в таблице стоит не на последней записи то append не создаёт новую, а только передвигает в конец, при нажатии на отмену получаю удаление последней строки т.к. пустая не была создана.
Делать insert или last перед append?(ваше мнение)
Так же при работе с несколькими таблицами, чтобы не кидать на форму 3 clientDataSet"а, как менять таблицу, просто cds.load* или есть что-то правильнее?


 
Reindeer Moss Eater ©   (2007-05-30 09:30) [13]

xml xml-ю рознь... не верь маркетологам! (они говорят типа универсальный формат...) добытую по случаю xml-лину вряд ли откроешь в ClientDataSet... только если она в нем и создана/такого же формата.

Из любого хмл с помощью трансформа можно получить датапакет совместимый с ClientDataSet. И "таскать с собой" надо не больше чем в случае с mdb


 
sniknik ©   (2007-05-30 11:03) [14]

Galiaf ©   (30.05.07 09:07) [12]
> то append не создаёт новую, а только передвигает в конец
это у тебя ошибка в программе.

> Делать insert или last перед append?(ваше мнение)
написать без ошибок.

> чтобы не кидать на форму 3 clientDataSet"а
а чтобы не занимать место хранить CD диски кучей, перед использованием вкладывать нужный в единственную коробочку (заменить на ней этикетки естественно)... типа сделать вид что в ней и хранилось.
???
положи 1 датасет на форму, скомпили, посмотри размер екзешника, после на ту же форму накидай еще скажем 127 датасетов (для круглого счета), скомпили, посмотри размер. ну. выгадал чтонибудь?

Reindeer Moss Eater ©   (30.05.07 09:30) [13]
> Из любого хмл с помощью трансформа можно получить датапакет совместимый с ClientDataSet.
а из любого dbf файла легко с помощью Datapump можно получить совместимый с парадоксовым движком... но это же не делает его "совместимым" и "универсальным" (во всяком случае не слышал чтобы такое про него ктото говорил). при том что по дополнению в [12] проблем с совместимостью судя по всему не будет, он сам их создает а не получает по случаю, как было подумал.
другой вопрос, нафига это использовать если нужна база?


 
Galiaf ©   (2007-06-01 00:33) [15]


>  И "таскать с собой" надо не больше чем в случае с mdb

Вчера принёс на компьютер в отдел кадров программу с базой *.mdb и програму с базой *.xml. "Интересно" почему же xml кинул ошибку о не установленном "как_его_там.dll", а mdb, даже не заикнулся, работал и выполнял свои функции корректно.

> положи 1 датасет на форму, скомпили, посмотри размер екзешника,
>  после на ту же форму накидай еще скажем 127 датасетов (для
> круглого счета), скомпили, посмотри размер.

Ну легче у меня на душе когда компонентов меньше на форме, наверное по этому по возможности пишу на чистом апи, а потом ещё пытаюсь вырезать всё лишнее :).


 
Galiaf ©   (2007-06-01 23:27) [16]


> это у тебя ошибка в программе.


procedure TForm1.Add1Click(Sender: TObject);
begin
 cds.Last;
 cds.Append;
//  cds.Insert;
 img.Picture.LoadFromFile("img_none.bmp");
 pename.Text:="Name";//pe=PanelEdit эдиты на панели
 pecount.Text:="Count";
 pepresence.Text:="Presence";
 panel.Visible:=true;
 add:=true;
 block
end;

procedure TForm1.OkClick(Sender: TObject);
var
BF: TStream;
begin
 if not add then
   cds.Edit;
 cds.FieldValues["name"]:=pename.Text;
 cds.FieldValues["count"]:=strtointdef(pecount.Text,0);
 cds.FieldValues["presence"]:=pepresence.Text;
 if cbi.Checked then //чекс бокс
   begin
     BF:=cds.CreateBlobStream(cds.FieldByName("Img"), bmWrite);
     Img.Picture.Bitmap.SaveToStream(BF);
     bf.Position:=0;
     TBlobField(cds.FieldByName("Img")).LoadFromStream(BF);
     bf.Free
   end
 else
   cds.FieldValues["img"]:="";
 cds.Post;
 panel.Visible:=false;
 add:=false;
 unblock
end;

procedure TForm1.block;
begin
 grid.Enabled:=false
end;

procedure TForm1.unblock;
begin
 grid.Enabled:=true;
 grid.Repaint
end;


Вот лично я ошибку не нашёл, может конечно от неопытности что-то не так делаю но по-моему правильно.


 
sniknik ©   (2007-06-02 00:32) [17]

> что-то не так делаю но по-моему правильно.
если есть сомнения то делай проще... по максимуму

begin
 Append;
 FieldValues["name"]:= "???";
 Post;
end;

так создает новую? или просто передвигает в конец?

img.Picture.LoadFromFile("img_none.bmp");

BF:=cds.CreateBlobStream(cds.FieldByName("Img"), bmWrite);
Img.Picture.Bitmap.SaveToStream(BF);
bf.Position:=0;
TBlobField(cds.FieldByName("Img")).LoadFromStream(BF);
bf.Free

вот это меняется на
TBlobField(cds.FieldByName("Img")).LoadFromFile("img_none.bmp")

cds.FieldValues["img"]:=""; //строку в рисунок?
panel.Visible:=true;
panel.Visible:=false;
grid.Enabled:=false
grid.Enabled:=true;
grid.Repaint
? что за бред? зачем дизейблить грид специально чтобы не видеть изменений в нем? на момент добавления. и что за игры с видимо/невидимо в момент отладки? пока отлаживаешь видно должно быть все.


 
Galiaf ©   (2007-06-02 10:46) [18]

Делал по кнопке добавить добавление строки, а присваивал по другой кнопке, сейчас сделал так чтобы добавление происходило по кнопке "ОК"
 if add then
   cds.Append
 else
   cds.Edit;

Пока добавляет нормально


> зачем дизейблить грид


> и что за игры с видимо/невидимо в момент отладки


DBGrid.readonly=true;//каприз "заказчика"
панель - вместо окна для редактирования, видна должна быть только при добавлении/изменении записи, после применения исчезает, грид дисэйблить для того, чтобы юзер случайно не кликнул по другой записи т.к. все изменения происходят только для текущей записи, сам запись я не указываю нигде.


 
Galiaf ©   (2007-06-02 11:03) [19]


> TBlobField(cds.FieldByName("Img")).LoadFromFile("img_none.
> bmp")

Не пойдёт, рисунок в базу сохраняется из timage или не сохраняется совсем
> cds.FieldValues["img"]:="";

Принцип мне ясен, временем позже посмотрю.


 
sniknik ©   (2007-06-02 12:58) [20]

> грид дисэйблить для того, чтобы юзер случайно
ну а то что дизейбленный грид не отображает твоих же изменений по Append нормально?

дизейблить нужно не отображающие контролы, а управляющие (кнопки), если не хочеш чтобы юзер случайно не сделал повтор действия. а сами действия должны быть короткие, не разорванные... так чтобы юзер между началом и окончанием не мог ничего испортить.


 
ЮЮ ©   (2007-06-02 13:11) [21]

панель - вместо окна для редактирования, видна должна быть только при добавлении/изменении записи, после применения исчезает, грид дисэйблить для того, чтобы юзер случайно не кликнул по другой записи т.к. все изменения происходят только для текущей записи, сам запись я не указываю нигде.

Для этого придумали модальный показ форм


 
Galiaf ©   (2007-06-03 23:15) [22]

L
> Для этого придумали модальный показ форм

Я в курсе, просто решил сразу делать на панели, а потом уже буду на форму кидать, в общем лень было сразу.
> ну а то что дизейбленный грид не отображает твоих же изменений
> по Append нормально?

Отображал нормально.


 
sniknik ©   (2007-06-04 00:19) [23]

> Отображал нормально.
а потом куданибудь вставил DisableControls; и забываешь про него...

я же тебе говорил, упрощай(!!!), сделай отдельно проект и попытайся воспроизвести свой глюк "в три действия"... получится, на четвертом, тогда будеш точно знать от чего.


 
Galiaf ©   (2007-06-05 08:24) [24]

А я про глюк уже забыл, спасибо тебе. Панель заменил формой за 5-8 мин.


 
имя   (2007-08-08 22:58) [25]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.035 c
2-1194865129
Uno
2007-11-12 13:58
2007.12.09
Протокалирование сообщений


11-1180584972
Ned
2007-05-31 08:16
2007.12.09
Как узнать версию Windows?


15-1194334395
Jeer
2007-11-06 10:33
2007.12.09
Компилятор D7 учитывает платформу ?


15-1194499862
gn
2007-11-08 08:31
2007.12.09
windows vista


3-1186048319
HID
2007-08-02 13:51
2007.12.09
Задачка с запросом