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

时间:2015-11-15 18:47:29

标签: javascript dao hta

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

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

在下面的db_update函数中,我传递的是一个对象,其属性名称与记录集中的字段名称相匹配。例程很灵活,允许我避免硬编码字段名称。我这样做,但想改变这种格式,它将无法正常工作。我无法使用DAO和Javascript在任何地方找到任何信息。例程中的一个注释表示“它在此线路上失败”。 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 个答案:

答案 0 :(得分:0)

新解决方案

这是我的最终解决方案,它的工作速度更快。搜索字段位于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();
}