Что такое синтаксис MS Access SQL для создания поля типа гиперссылки? - PullRequest
3 голосов
/ 15 июля 2009

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

AutoNumber: ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> COUNTER|AUTOINCREMENT
Currency:   ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> MONEY
Date/Time:  ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> DATE
Memo:       ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> MEMO|TEXT
Number:     ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> NUMBER
OLE Object: ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> OLEOBJECT
Text:       ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> CHARACTER
Yes/No:     ALTER TABLE <i>table-name</i> ADD COLUMN <i>column-name</i> BIT

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

Ответы [ 6 ]

8 голосов
/ 16 июля 2009

Это тот случай, когда вы не можете использовать 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 (именно так я понял, как это сделать, то есть создал поле гиперссылки в пользовательском интерфейсе Access, а затем проверил его тип данных). Значение для dbHyperlinkField равно 32768, но его нельзя назначить непосредственно в качестве типа данных - вместо этого оно является податрибутом мемо-поля.

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

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

3 голосов
/ 21 июля 2009

Я поэкспериментировал с 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);
2 голосов
/ 06 января 2012

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

ОБНОВЛЕНИЕ myTable SET HyperlinkField = "(текст для отображения) # (целевой URL) # (подполе гиперссылки, если требуется)" ГДЕ оговорка

На самом деле, я использую это для создания формы поверх таблицы, где ссылка указывает на файл, а не на веб-адрес (это список рисунков, поэтому пользователь может щелкнуть ссылку, чтобы открыть чертеж). В этом случае URL является ОТНОСИТЕЛЬНЫМ путем к файлу, например, ".. \ документы \ myFile1.dat".

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

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

1 голос
/ 24 июля 2014

Следуя вороновым инструкциям, фиктивные программисты (как и я) могут использовать эту подпрограмму для добавления с помощью кода 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
1 голос
/ 16 июля 2009

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

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

Hyperlink hyp1 = new Hyperlink
hyp1.Text = datarow.DisplayText
hyp1.NavigateURL = datarow.TargetURL
0 голосов
/ 15 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...