如何使用 Javascript 迭代 DAO 字段集合

Posted

技术标签:

【中文标题】如何使用 Javascript 迭代 DAO 字段集合【英文标题】:How can I iterate the DAO fields collection with Javascript 【发布时间】:2016-02-16 20:26:20 【问题描述】:

我编写了一个运行良好的 html 应用程序。这些是以 .hta 结尾的文件,只能使用 Internet Explorer 打开。在应用程序中,我使用了一个具有属性名称的对象作为数据库的键值。由于这是 Windows 和 Microsoft,我决定转换为 DAO。多年来,我在 DAO 方面做了很多工作,但总是使用 VB、VBA 或 .net 语法,而不是 javascript

使用 Javascript,如果我将记录集中的字段命名为记录集对象的属性,即使用句点,它们是可访问的,但是我必须以这种方式进行硬编码,并且它不是动态的。我想要做的是遍历记录集对象的 Fields 集合并获取字段名称。我无法让它工作。它一直说“无法从对象的空实例中获取名称”。

在下面的 db_update 函数中,我传递了一个属性名称与记录集中的字段名称匹配的对象。该例程很灵活,允许我避免对字段名称进行硬编码。我正在这样做,但想更改为这种格式,它不会工作。我无法在任何地方使用带有 Javascript 的 DAO 找到任何信息。例程中的注释说“它在这条线上失败”。 Count 属性以正确的值存在于 Fields 集合中,因此存在 Fields 集合。

function setup() 
  db_engine = new ActiveXObject("DAO.DBEngine.36");
  fso = new ActiveXObject("Scripting.FileSystemObject");
.....
  if (fso.FileExists(mdb)) fso.DeleteFile(mdb);
  db_db = db_engine.CreateDatabase(mdb,";LANGID=0x0409;CP=1252;COUNTRY=0");
  var table = db_db.CreateTableDef("file"), ord=1;
  db_create_field(table,"id",4,4,ord,false,false);
  ord++;
  db_create_field(table,"path",10,255,ord,false,false);
  ord++;
  db_create_field(table,"local",3,2,ord,false,false);
  ord++;
.....

function db_create_field(table,name,type,length,ordinal,required,allow_zl) 
  var fld = table.CreateField(name,type,length);
  fld.Attributes = 1;
  fld.OrdinalPosition = ordinal;
  fld.ValidationRule = "";
  fld.ValidationText = "";
  fld.Required = required ? -1 : 0;
  try 
    fld.AllowZeroLength = allow_zl ? -1 : 0;
  
  catch(e) 
  
  table.Fields.Append(fld);

function db_update(wad) 
  var rst=db_db.OpenRecordset("SELECT * FROM file WHERE path='"+wad.path+"'",2);
  if (rst.EOF) 
    rst.AddNew();
    rst.id = file_id++;
    rst.path = wad.path;
  
  else 
    rst.edit();
  
  var count=rst.Fields.Count, name;
  for (var j=0;j<count;j++) 
    name = rst.Fields[j].Name;  // IT FAILS ON THIS LINE FOR "NAME"
    if (wad.hasOwnProperty(name)) rst.Fields[j] = wad[name];
  
  rst.Update();
  rst.Close();

【问题讨论】:

也许我必须实例化一个枚举器对象。这是迭代文件系统对象的文件和文件夹集合所需要的。也许这同样适用于这里。我会试试的。 【参考方案1】:

新解决方案

这是我的最终解决方案,它运行得更快。搜索字段位于 wad 之外,因此不会进行不必要的更新,也不需要枚举。如果 wad 中的属性不在记录集字段列表中,当然会产生错误。

function db_update(path,wad) 
  var rst=db_db.OpenRecordset("SELECT * FROM file WHERE path='"+path+"'",2);
  if (rst.EOF) 
    rst.AddNew();
    rst.id = file_id++;
    rst.path = path;
  
  else 
    rst.edit();
  
  var keys = object_keys(wad);
  for (var j=0;j<keys.length;j++) rst[keys[j]] = wad[keys[j]];
  rst.Update();
  rst.Close();

function object_keys(obj) 
  var keys = [], j = 0;
  for (keys[j++] in obj) ;
  return keys;

上一个答案:

是的,枚举有效。我更改了 db_update 例程,如下所示。我希望我在发布之前考虑过枚举。也许这会对其他人有所帮助。

function db_update(wad) 
  var rst=db_db.OpenRecordset("SELECT * FROM file WHERE path='"+wad.path+"'",2);
  if (rst.EOF) 
    rst.AddNew();
    rst.id = file_id++;
    rst.path = wad.path;
  
  else 
    rst.edit();
  
  var en = new Enumerator(rst.Fields), name;
  for (;!en.atEnd();en.moveNext()) 
    name = en.item().Name;
    if (wad.hasOwnProperty(name)) en.item().Value = wad[name];
  
  rst.Update();
  rst.Close();

【讨论】:

以上是关于如何使用 Javascript 迭代 DAO 字段集合的主要内容,如果未能解决你的问题,请参考以下文章

DAO、ORM 和查询

如何设计一个DAO更新方法

如何快速清除 JavaScript 对象?

如何迭代Java中的枚举字段? [复制]

如何避免Kotlin暴露的N + 1查询问题。 (通过DAO的Reference.id.value字段获取值时)

如何通过 VB6 使用 DAO.Relation?