2009-07-15 15 views
3

Je travaille sur un projet C# qui utilise la classe System.Data.OleDb.OleDbCommand pour créer et modifier des tables dans une base de données MS Access. Je génère l'instruction SQL, la passe à l'objet, puis appelle la fonction ExecuteNonQuery. Je suis en mesure de comprendre la syntaxe MS Access SQL pour créer des colonnes des types suivants de données d'accès:Quelle est la syntaxe MS Access SQL pour créer un champ de type Hyperlien?

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

Le type que je ne l'ai pas compris comment créer est un lien hypertexte. Est-ce que quelqu'un sait la syntaxe pour celui-là?

Répondre

1

Il n'y a pas de concept réel en sql d'un type de lien hypertexte. Vous stockez l'URL comme vous le feriez pour n'importe quel texte, puis lorsque vous l'utilisez dans votre application, vous créez le lien hypertexte à cette fin.

+0

Eh bien, il y a un concept d'un lien hypertexte dans MS Access. C'est l'un des types de données disponibles, j'ai donc pensé qu'il devait y avoir un moyen de le créer dans MS Access SQL. – raven

+0

Un lien hypertexte dans MS Access n'est pas un type de données mais plutôt un objet que vous pouvez placer sur vos formulaires d'accès. – brendan

+0

Ok, je suis convaincu que ça ne peut pas être fait. – raven

1

Vous utiliseriez deux champs CHARACTER pour représenter le contenu d'un lien hypertexte, l'un contenant l'URL de la ressource vers laquelle le lien hypertexte doit être lié (stocké en tant que texte brut) et l'autre contenant le texte affiché dans le navigateur (c'est-à-dire si le texte affiché dans le navigateur est différent de l'URL elle-même).

Lorsque vous affichez le lien dans une page Web en C#, vous pouvez créer un lien hypertexte:

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

C'est un cas où vous ne pouvez pas utiliser mais DDL devez utiliser DAO. Ce que vous recherchez est la propriété .Attributes du type de champ DAO. Dans VBA, ce code fait le tour (vous devrez savoir comment faire avec DAO en 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 

Si vous vérifiez le type de ce champ dans l'accès aux données:

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

il renvoie 12, ce qui est égal à la constante globale VBA dbMemo (c'est ainsi que j'ai compris comment faire, c'est-à-dire créé un champ Hyperlink dans l'Access Access, puis vérifié son type de données). La valeur de dbHyperlinkField est 32768, mais ne peut pas être affectée directement en tant que type de données. Il s'agit plutôt d'un sous-attribut d'un champ mémo.

Il s'agit d'un cas où Access a étendu Jet en utilisant un attribut personnalisé pour qu'il fonctionne avec les données différemment du nombre limité de types de données Jet. Il est également clair que le type de champ Lien hypertexte n'est pertinent que si vous utilisez les données d'Access lui-même. Si vous utilisez une autre application pour travailler avec les données, vous ne gagnez rien du tout en utilisant un champ de données de lien hypertexte.

Aussi, je suis avec ceux qui recommandent pas en utilisant un champ de type Hyperlien parce que je l'ai essayé et c'est juste une douleur dans le cul. De plus, étant donné que c'est vraiment un champ mémo, il est sujet à tous les problèmes qui viennent avec les champs mémo. Autrement dit, les données ne sont pas réellement stockées avec la table de données - tout ce qui est stocké dans l'enregistrement principal est un pointeur vers la page de données où les données réelles sont stockées, et ces pointeurs sont l'une des parties plus fragiles de Jet. Les mémos valent ce risque, car lorsque vous avez besoin de stocker plus de 255 caractères, vous devez le faire. Je ne vois pas de fonctionnalité significative ajoutée par le type de champ Hyperlink spécifique à l'accès qui justifie le travail avec le code ou le risque lié au fait qu'il soit implémenté dans les coulisses en tant que champ Mémo.

3

J'ai eu un jeu autour de cela avec ADOX en C# et la seule manière que je trouvais de le faire a été mis la propriété "Jet OLEDB:Hyperlink" après avoir créé la colonne dans la table mais avant fait d'ajouter la table à la collection de tableaux.

L'exemple suivant nécessite une référence COM à Microsoft ADO Ext. 2.8 pour DDL et sécurité:

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); 
+0

On dirait que ça marche pour moi, merci. –

+0

Voici quelque chose d'officiel documentant ce comportement (regardez dans le tableau). Semble dire exactement ce que vous avez codé: http://msdn.microsoft.com/fr-fr/library/aa164917%28office.10%29.aspx –

2

Bien que Microsoft complique les choses en ayant un champ de lien hypertexte dans une base de données comme un objet avec des propriétés, la mise, il semble assez simple, en utilisant ce type de syntaxe: -

MISE À JOUR myTable SET HyperLinkField = "(texte à afficher) # (URL cible) # (lien hypertexte sous-champ, le cas échéant)" clause WHERE

en fait, j'utilise ceci pour créer une forme sur une table, où les points de liaison à un fichier plutôt qu'à une adresse Web (c'est une liste de dessins pour que l'utilisateur pouvez cliquer sur le lien pour ouvrir le dessin). Dans ce cas, l'URL est le RELATIF chemin vers le fichier, par ex. ".. \ documents \ monFichier1.dat". Je suis conscient que je pourrais utiliser d'autres méthodes pour implémenter la même chose, mais les utilisateurs comprennent les hyperliens.

Je n'ai pas testé comment ces liens se comportent lorsque la base de données source est déplacée, d'ailleurs.

1

En suivant les instructions Raven, les programmeurs factices (comme moi) peuvent utiliser ce sous-répertoire pour ajouter, en accédant au code VBA, un champ de lien hypertexte.

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 pertinente pour insérer un nouveau record avec un lien vers (par exemple) c: \ est ..

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

pour l'exécuter est ...

CurrentDB.Execute SQL 
Questions connexes