Форум: "Базы";
Текущий архив: 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