【问题标题】:What is the MS Access SQL syntax to create a field of type Hyperlink?创建超链接类型字段的 MS Access SQL 语法是什么?
【发布时间】:2009-07-15 19:40:24
【问题描述】:

我正在开发一个 C# 项目,该项目使用 System.Data.OleDb.OleDbCommand 类在 MS Access DB 中创建和更改表。我生成 SQL 语句,将其传递给对象,然后调用 ExecuteNonQuery 函数。我能够找出正确的 MS Access SQL 语法来创建以下 Access 数据类型的列:

自动编号:ALTER TABLE table-name ADD COLUMN column-name COUNTER|AUTOINCREMENT 货币:ALTER TABLE table-name ADD COLUMN column-name MONEY 日期/时间:ALTER TABLE table-name ADD COLUMN column-name DATE 备注:ALTER TABLE table-name ADD COLUMN column-name MEMO|TEXT 编号:ALTER TABLE table-name ADD COLUMN column-name NUMBER OLE 对象:ALTER TABLE table-name ADD COLUMN column-name OLEOBJECT 文本:ALTER TABLE table-name ADD COLUMN column-name CHARACTER 是/否:ALTER TABLE table-name ADD COLUMN column-name BIT

我还没有弄清楚如何创建的唯一类型是超链接。有谁知道那个的语法?

【问题讨论】:

    标签: sql ms-access types


    【解决方案1】:

    这是一种不能使用 DDL 但必须使用 DAO 的情况。您正在寻找的是 DAO Field 类型的 .Attributes 属性。在 VBA 中,此代码可以解决问题(您必须弄清楚如何在 C# 中使用 DAO 来完成此操作):

      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 UI 中创建一个超链接字段,然后检查其数据类型)。 dbHyperlinkField 的值为 32768,但不能直接指定为数据类型 -- 它是备注字段的子属性。

    这是 Access 扩展 Jet 的一个案例,它使用自定义属性来处理与有限数量的 Jet 数据类型不同的数据。同样清楚的是,超链接字段类型仅在您使用来自 Access 本身的数据时才相关。如果您使用其他应用程序来处理数据,那么使用超链接数据字段将一无所获。

    另外,我和那些建议使用超链接类型字段的人在一起,因为我已经尝试过了,这只是一个麻烦。此外,鉴于它实际上是一个备忘录字段,它会受到备忘录字段带来的所有问题的影响。也就是说,数据实际上并没有与数据表一起存储——所有存储在主记录中的是一个指向存储真实数据的数据页的指针,而这些指针是 Jet 较脆弱的部分之一。备忘录值得冒险,因为当您需要存储超过 255 个字符时,您需要这样做。我看不出 Access 特定的超链接字段类型添加了任何重要的功能,因此在代码中使用它是值得的,或者它作为备忘录字段在幕后实现的事实所带来的风险。

    【讨论】:

      【解决方案2】:

      我在 C# 中使用 ADOX 来解决这个问题,我发现这样做的唯一方法是在表中创建列之后设置 "Jet OLEDB:Hyperlink" 属性,但 在实际添加表之前到 Tables 集合。

      以下示例需要对 Microsoft ADO Ext 的 COM 引用。 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);
      

      【讨论】:

      【解决方案3】:

      虽然微软通过将数据库中的超链接字段作为具有属性的对象来使事情复杂化,但使用这种语法设置它似乎相当简单:-

      更新我的表 SET HyperlinkField = "(要显示的文本)#(目标 URL)#(超链接子字段,如果需要)" WHERE 子句

      实际上,我正在使用它在表格上创建一个表单,其中链接指向文件而不是网址(它是图纸列表,因此用户可以单击链接打开图纸)。在这种情况下,URL 是文件的 RELATIVE 路径,例如“..\documents\myFile1.dat”。

      我知道我可以使用其他方法来实现相同的功能,但用户理解超链接。

      顺便说一句,我还没有测试过移动源数据库时这些链接的行为。

      【讨论】:

        【解决方案4】:

        您将使用两个 CHARACTER 字段来表示超链接的内容,一个包含您希望超链接链接到的资源的 URL(存储为纯文本),另一个包含保存浏览器中显示的文本(即,如果浏览器中显示的文本与 URL 本身不同)。

        在C#网页中显示链接时,可以创建超链接:

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

        【讨论】:

          【解决方案5】:

          按照 raven 指令,虚拟程序员(像我一样)可以使用这个子程序通过访问 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:\ 的链接是..

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

          执行它是...

          CurrentDB.Execute SQL
          

          【讨论】:

            【解决方案6】:

            超链接的数据类型在sql中没有真正的概念。您可以像存储任何文本一样存储 url,然后当您在应用程序中使用它时,您将在该端创建超链接。

            【讨论】:

            • 嗯,MS Access 中有一个超链接的概念。它是可用的数据类型之一,所以我认为必须有一种方法可以在 MS Access SQL 中创建它。
            • MS Access 中的超链接不是数据类型,而是可以放在访问表单上的对象。
            • 这个答案被接受,但错误。 MS Access 提供 Hyperlink 列类型,这是一个经过特殊处理的 memo 列,其文本采用特殊的四字段格式,字段分隔符为 # 字符;可以使用 SQL UPDATEINSERT 查询为其创建内容。所以迈克霍尔顿的答案是正确的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多