Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.04 c
2-1194849387
webpauk
2007-11-12 09:36
2007.12.09
Запись дерева в таблицу


15-1194608090
Piter
2007-11-09 14:34
2007.12.09
Пятница? Вася Пупкин?


15-1194706734
Kick
2007-11-10 17:58
2007.12.09
Невизуальные классы delphi


15-1194438356
werb
2007-11-07 15:25
2007.12.09
dll список функций


3-1185865653
StriderMan
2007-07-31 11:07
2007.12.09
Окна редактирования записей таблиц(справочников)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский