varios valores uso una parametros hacer filtrar elementos ejemplos diferente criterio consultas consulta como sql ms-access types

valores - ¿Cuál es la sintaxis SQL de MS Access para crear un campo de tipo Hipervínculo?



or en access (6)

No existe un concepto real en sql de un tipo de datos de hipervínculo. Debería almacenar la url como lo haría con cualquier texto y luego, cuando la use en su aplicación, creará el hipervínculo en ese extremo.

Estoy trabajando en un proyecto de C # que usa la clase System.Data.OleDb.OleDbCommand para crear y modificar tablas en un MS Access DB. Genero la declaración SQL, la paso al objeto y luego llamo a la función ExecuteNonQuery. Pude averiguar la sintaxis correcta de MS Access SQL para crear columnas de los siguientes tipos de datos de Access:

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

El único tipo que no he descubierto cómo crear es hipervínculo. ¿Alguien sabe la sintaxis de ese?


Utilizaría dos campos de CARACTER para representar el contenido de un hipervínculo, uno que contenga la URL del recurso al que desea que se enlace el hipervínculo (almacenado como texto sin formato) y otro que contenga el texto que se muestra en el navegador (ese es, si el texto que se muestra en el navegador es diferente de la URL en sí).

Al mostrar el enlace en una página web en C #, puede crear un hipervínculo:

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


Tuve un juego con ADOX en C # y la única forma que encontré fue establecer la propiedad "Jet OLEDB:Hyperlink" después de crear la columna en la tabla pero antes de agregar realmente la tabla a la colección Tables.

El siguiente ejemplo requiere una referencia COM a Microsoft ADO Ext. 2.8 para DDL y seguridad:

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


Este es un caso donde no puede usar DDL pero debe usar DAO. Lo que está buscando es la propiedad .Attributes del tipo de campo DAO. En VBA, este código es el truco (tendrás que averiguar cómo hacerlo con 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 marca el tipo de datos de este campo en Acceso:

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

devuelve 12, que es igual a la constante global dbMemo de VBA (así es como me di cuenta de cómo hacerlo, es decir, creé un campo de hipervínculo en la UI de acceso y luego verifiqué su tipo de datos). El valor de dbHyperlinkField es 32768, pero no se puede asignar directamente como tipo de datos; en su lugar, es un atributo secundario de un campo memo.

Este es un caso de Access que extiende Jet mediante el uso de un atributo personalizado para que funcione con los datos de forma diferente a la cantidad limitada de tipos de datos de Jet. También está claro que el tipo de campo Hipervínculo solo es relevante si está utilizando los datos de Access. Si está utilizando alguna otra aplicación para trabajar con los datos, no obtiene nada en absoluto al usar un campo de datos de hipervínculo.

Además, estoy con aquellos que recomiendan no usar un campo de tipo hipervínculo porque lo he intentado y es solo un dolor en el trasero. Además, dado que es realmente un campo memo, está sujeto a todos los problemas que vienen con los campos memo. Es decir, los datos no se almacenan realmente en la tabla de datos; todo lo que se almacena en el registro principal es un puntero a la página de datos donde se almacenan los datos reales, y esos indicadores son una de las partes más frágiles de Jet. Las notas valen ese riesgo, porque cuando necesite almacenar más de 255 caracteres, debe hacerlo. No puedo ver que haya ninguna funcionalidad significativa agregada por el tipo de campo de hipervínculo específico de acceso que valga la pena trabajar con ella en el código o el riesgo que proviene del hecho de que se implementa detrás de escena como un campo memo.


Aunque Microsoft complica las cosas al tener un campo de hipervínculo en una base de datos como un objeto con propiedades, configurarlo parece razonablemente sencillo, utilizando este tipo de sintaxis:

ACTUALIZAR myTable SET HyperlinkField = "(texto para mostrar) # (Target URL) # (hipercampo del hipervínculo, si es necesario)" WHERE cláusula

En realidad, estoy usando esto para crear un formulario sobre una tabla, donde el enlace apunta a un archivo en lugar de a una dirección web (es una lista de dibujos para que el usuario pueda hacer clic en el enlace para abrir el dibujo). En este caso, la URL es la ruta RELATIVA al archivo, por ejemplo, ".. / documents / myFile1.dat".

Soy consciente de que podría usar otros métodos para implementar el mismo, pero los usuarios entienden los hipervínculos.

No he probado cómo se comportan estos enlaces cuando se mueve la base de datos de origen, por cierto.


Siguiendo las instrucciones de cuervo, los programadores falsos (como yo) pueden usar este sub para agregar, mediante el código VBA, un campo de hipervínculo.

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

El SQL relevante para insertar un nuevo registro con un enlace a (por ejemplo) c: / es ..

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

ejecutarlo es ...

CurrentDB.Execute SQL