Intereting Posts
Проверьте, принадлежит ли метка времени (милли) к определенному дню Как считать по фильтру в SQL-запросе? TO_CHAR и TO_DATE дают разные результаты. Как достичь функции TO_CHAR с использованием TO_DATE? Как создать какой-то итератор (или искусственный идентификатор) для заданного набора строк? SQL Server 2005 «обновление из» запроса mysql выбирает значения динамических строк как имена столбцов, другой столбец как значение Несколько слов словаря синонимов в полнотекстовом поиске PostgreSQL используя подзапрос вместо tablename Идентификатор с несколькими частями не может быть связан Использование 3 обновлений в одной и той же процедуре хранения? «Небольшая ошибка» Postgresql: упорядочение столбцов в соответствии с пользовательскими критериями SELECT INTO с несколькими атрибутами Исключить определенный диапазон времени в хранимой процедуре Linq-to-Sql: рекурсивно получить детей Oracle SQL Query для суммирования статистики с использованием GROUP BY

Что такое синтаксис MS Access SQL для создания поля типа Hyperlink?

Я работаю над проектом C #, который использует класс System.Data.OleDb.OleDbCommand для создания и изменения таблиц в базе данных MS Access. Я генерирую инструкцию SQL, передаю ее объекту, а затем вызываю функцию ExecuteNonQuery. Я смог найти правильный синтаксис MS Access SQL для создания столбцов следующих типов данных Access:

 AutoNumber: ALTER TABLE имя таблицы ADD COLUMN имя столбца COUNTER | AUTOINCREMENT
 Валюта: ALTER TABLE имя таблицы ADD COLUMN имя столбца ДЕНЬГИ
 Дата / время: ALTER TABLE имя таблицы ADD COLUMN имя столбца DATE
 Memo: ALTER TABLE имя таблицы ADD COLUMN имя столбца MEMO | TEXT
 Номер: ALTER TABLE имя таблицы ADD COLUMN имя столбца NUMBER
 OLE Object: ALTER TABLE имя таблицы ADD COLUMN имя столбца OLEOBJECT
 Текст: ALTER TABLE имя таблицы ADD COLUMN имя столбца CHARACTER
 Да / Нет: ALTER TABLE имя таблицы ADD COLUMN имя столбца BIT

Единственный тип, который я не понял, как создать, – это гиперссылка. Кто-нибудь знает синтаксис для этого?

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

Это случай, когда вы не можете использовать DDL, но должны использовать DAO. То, что вы ищете, это свойство .Attributes типа поля DAO. В VBA этот код делает трюк (вам нужно выяснить, как это сделать с DAO в C #):

  Dim tdf As DAO.TableDef Dim fld As DAO.Field Set tdf = CurrentDB.TableDefs("MyTable") Set fld = tdf.CreateField("Hyperlink", dbMemo) ' dbMemo = 12 fld.Attributes = dbHyperlinkField ' 32768 tdf.Fields.Append fld Set fld = Nothing Set tdf = Nothing 

Если вы проверяете тип данных этого поля в Access:

  CurrentDB.TableDefs("MyTable").Fields("Hyperlink").Type 

он возвращает 12, что равно глобальной константе VBA dbMemo (так я выяснил, как это сделать, т. е. создал поле гиперссылки в пользовательском интерфейсе доступа, а затем проверил его тип данных). Значение для dbHyperlinkField равно 32768, но не может быть назначено напрямую как тип данных – это вместо этого атрибут поля memo.

Это случай расширения Access Jet с использованием настраиваемого атрибута для работы с данными иначе, чем ограниченное количество типов данных Jet. Также ясно, что тип поля Hyperlink применим только в том случае, если вы используете данные из самого Access. Если вы используете какое-либо другое приложение для работы с данными, вы ничего не получаете от использования поля данных гиперссылки.

Кроме того, я с теми, кто не рекомендует использовать поле типа Hyperlink, потому что я его пробовал, и это просто боль в заднице. Кроме того, учитывая, что это действительно поле memo, оно подвержено всем проблемам, которые возникают с полями memo. То есть данные фактически не хранятся в таблице данных – все, что хранится в основной записи, является указателем на страницу данных, на которой хранятся реальные данные, и эти указатели являются одной из частей фрейлера Jet. Записки стоят того риска, потому что, когда вам нужно сохранить более 255 символов, вам нужно это сделать. Я не вижу, что есть какая-то значительная функциональность, добавленная типом поля гиперссылки для Access, который стоит проблем с работой с ним в коде или с риском, который возникает из-за того, что он реализован за кулисами в качестве поля memo.

У меня была игра с этим с ADOX в C #, и единственный способ, которым я нашел это, – установить свойство "Jet OLEDB:Hyperlink" после создания столбца в таблице, но до фактического добавления таблицы в коллекцию таблиц.

В следующем примере требуется ссылка COM на Microsoft ADO Ext. 2.8 для DDL и безопасности:

 ADOX.Catalog cat = new CatalogClass(); cat.let_ActiveConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=C:\\Tempo\\Test_Access2007.accdb"); ADOX.Table tbl = new ADOX.TableClass(); tbl.Name = "TestHyperlink"; tbl.Columns.Append("my_hyperlink", ADOX.DataTypeEnum.adLongVarWChar, 0); ADOX.Column col = tbl.Columns["my_hyperlink"]; col.ParentCatalog = cat; col.Properties["Jet OLEDB:Hyperlink"].Value = true; cat.Tables.Append(tbl); 

Хотя Microsoft усложняет дело, имея поле гиперссылки в базе данных как объект со свойствами, настройка кажется довольно простой, используя такой синтаксис:

UPDATE myTable SET HyperlinkField = "(текст для отображения) # (целевой URL) # (подполе гиперссылки, если требуется)" Предложение WHERE

Фактически, я использую это для создания формы над таблицей, где ссылка указывает на файл, а не на веб-адрес (это список чертежей, чтобы пользователь мог щелкнуть ссылку, чтобы открыть чертеж). В этом случае URL-адрес – это путь RELATIVE к файлу, например «.. \ documents \ myFile1.dat».

Я знаю, что я мог бы использовать другие методы для их реализации, но пользователи понимают гиперссылки.

Я не тестировал, как эти ссылки ведут себя, когда исходная база данных перемещается, кстати.

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

При отображении ссылки на веб-странице на C # вы можете создать гиперссылку:

 Hyperlink hyp1 = new Hyperlink hyp1.Text = datarow.DisplayText hyp1.NavigateURL = datarow.TargetURL 

Следуя инструкциям ворона, фиктивные программисты (например, я) могут использовать этот sub, чтобы добавить, используя код VBA, поле гиперссылки.

 Sub AddLinkField(Table, FieldName) Dim dbs As DAO.Database Set dbs = CurrentDb() Dim tdf As DAO.TableDef Dim fld As DAO.Field Set tdf = dbs.TableDefs(Table) Set fld = tdf.CreateField(FieldName, dbMemo) ' dbMemo = 12 fld.Attributes = dbHyperlinkField ' 32768 tdf.Fields.Append fld Set fld = Nothing Set tdf = Nothing End Sub 

Соответствующий SQL для вставки новой записи со ссылкой на (например) c: \ is ..

 SQL = "INSERT INTO Table VALUES (...,'LinkVisualizedText #c:\#')" 

выполнить это …

 CurrentDB.Execute SQL