powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Доступ к полям с повторяющимися названиями
4 сообщений из 4, страница 1 из 1
Доступ к полям с повторяющимися названиями
    #38092527
vlad52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В следующей процедуре с помощью стандартного компонента подключения к базам данных SQLite в Delphi XE3 я выполняю sql-запрос к базе данных, содержащий поля с одинаковыми названиями из разных таблиц. Затем я обращаюсь к этим полям через алиас

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
	procedure CreationListOfFields(SQLConn: TSQLConnection; DBSchema : TDBSchemaSpec);
	var
	  NameField : TField;
	  PositionField : TField;
	  DescriptionField : TField;
	  CanInputField : TField;
	  CanEditField : TField;
	  ShowInGridField : TField;
	  ShowInDetailsField : TField;
	  IsMeanField : TField;
	  AutocalculatedField : TField;
	  RequiredField : TField;
	  Name1 : TField;
	  Name2 : TField;
	begin
		SQLConn.Execute('select f.id, f.position, f.name, f.description, f.can_input, '
		+' f.can_edit, f.show_in_grid, f.show_in_details, f.is_mean, f.autocalculated, f.required, tables.name tablemame, domains.name domainname'
		+' from fields f left join tables on f.table_id=tables.id '
		+' left join domains on f.domain_id=domains.id order by tables.name, domains.name ', nil, results);
		if not results.IsEmpty then
		  begin
			results.First;
			Name1:=results.FieldByName('name_1');
			Name2:=results.FieldByName('name_2');
			lastTable:=Name1.AsString;
			TableSpec:=TTableSpec(DBSchema.Tables.FindComponent(lastTable));
			lastDomain:=Name2.AsString;
			DomainSpec:=TDomainSpec(DBSchema.Domains.FindComponent(lastDomain));
			NameField:=results.FieldByName('name');
			PositionField:=results.FieldByName('position');
			DescriptionField:=results.FieldByName('description');
			CanInputField:=results.FieldByName('can_input');
			CanEditField:=results.FieldByName('can_edit');
			ShowInGridField:=results.FieldByName('show_in_grid');
			ShowInDetailsField:=results.FieldByName('show_in_details');
			IsMeanField:=results.FieldByName('is_mean');
			AutocalculatedField:=results.FieldByName('autocalculated');
			RequiredField:=results.FieldByName('required');
			while not results.Eof do
			  begin
				if (Name1.AsString<>lastTable) then
				begin
				  lastTable:=Name1.AsString;
				  TableSpec:=TTableSpec(DBSchema.Tables.FindComponent(lastTable));
				end;
				if (Name2.AsString<>lastDomain) then
				begin
				  lastDomain:=Name2.AsString;
				  DomainSpec:=TDomainSpec(DBSchema.Domains.FindComponent(lastDomain));
				end;
				FieldSpec:=TFieldSpec.Create(TableSpec.Fields);
				FieldSpec.Setup( DomainSpec, PositionField.AsInteger,
				NameField.AsString, DescriptionField.AsString,
				FieldToBoolean(CanInputField),FieldToBoolean(CanEditField),
				FieldToBoolean(ShowInGridField), FieldToBoolean(ShowInDetailsField),
				FieldToBoolean(IsMeanField),FieldToBoolean(AutocalculatedField),
				FieldToBoolean(RequiredField));
				TComponent(FieldSpec).Name:=NameField.AsString;
				TableSpec.Fields.InsertComponent(FieldSpec);
				results.Next;
			  end;
		  end;
	end;


Но при вызове этой процедуры в результате получаю сообщение Field 'tablename' not found. Как обратиться к полям с повторяющимися названиями, чтобы не было проблем? (варианты 'name_1' и 'name_2' не подходят, при отладке я обнаружил, что соответствующие значения пустые и как следствие из-за этого у меня возник вопрос на http://hashcode.ru/questions/177512/delphi-access-violation-at-address-00822135-in-module-gui-exe-read-of-address-00000040 и http://www.sql.ru/forum/actualthread.aspx?tid=993266). Использую компонент подключения к базе данных в Delphi XE3, указанный здесь - http://www.webdelphi.ru/2012/10/sqlite-v-delphi-xe3/ ).
...
Рейтинг: 0 / 0
Доступ к полям с повторяющимися названиями
    #38092529
vlad52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlad52,

извините при копипасте совершил ошибку
Код: pascal
1.
2.
3.
4.
		SQLConn.Execute('select f.id, f.position, f.name, f.description, f.can_input, '
		+' f.can_edit, f.show_in_grid, f.show_in_details, f.is_mean, f.autocalculated, f.required, tables.name tablename, domains.name domainname'
		+' from fields f left join tables on f.table_id=tables.id '
		+' left join domains on f.domain_id=domains.id order by tables.name, domains.name ', nil, results);


Ошибка все равно возникает (правильный вариант вопроса на http://hashcode.ru/questions/177590/delphi-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D0%BF%D0%BE%D0%BB%D1%8F%D0%BC-%D1%81-%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F-%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8). Поэтому дело не в первичной опечатке.
...
Рейтинг: 0 / 0
Доступ к полям с повторяющимися названиями
    #38092560
vlad52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlad52,

простите также ошибся в спешке
Код: pascal
1.
2.
	Name1:=results.FieldByName('tablename');
	Name2:=results.FieldByName('domainname');


Но ошибка все равно возникает. Это чисто из-за неправильного копипаста я вас дезинвформировал, но проблема остается, ошибка по-прежнему возникает.
...
Рейтинг: 0 / 0
Доступ к полям с повторяющимися названиями
    #38094133
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задай псевдонимы для колонок и все.
select somefield as ABC, otherfield as DEF ...
А еще к колонкам рекордсета можно обращаться по номеру.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Доступ к полям с повторяющимися названиями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]