我有一个非常简单的 Javascript 函数,它可以访问 MS SQL 服务器并返回一些记录。有一个单元格,我只想在它唯一时才显示在顶部表格行中。
我相信我的问题是 var 提升,因为我在 while 循环中分配的变量不起作用,因为该值不是从要比较的最后记录中携带的。这是代码
function searchIndex()
{
var termcounter = "";
flyoutHTML = '<table>';
var adOpenDynamic = 2
var adLockOptimistic = 3
var conn = new ActiveXObject("ADODB.Connection");
var connectionstring = "Provider=SQLOLEDB;Server=XXXXXXXX;INTEGRATED SECURITY=SSPI;DATABASE=YYYYYYYYYY;"
conn.Open(connectionstring)
var rs = new ActiveXObject("ADODB.Recordset")
rs.Open("SELECT field1, field2, field4, field4, field5 FROM dbo.table;", conn)
if (rs.eof)
{
flyoutHTML += '<tr><td align="center">No Records Found!</td></tr>';
}
else
{
while(!rs.eof)
{
if (termcounter != rs(0))
{
var termcounter = rs(0);
flyoutHTML += '<tr>';
flyoutHTML += '<td colspan="3">' + rs(0) + '</td>';
flyoutHTML += '</tr>';
}
flyoutHTML += '<tr>';
flyoutHTML += '<td>' + rs(1) + '</td><td>' + rs(2) + '</td><td>' + rs(3) + '</td>';
flyoutHTML += '</tr>';
rs.movenext
}
rs.close
conn.close
flyoutHTML += '</table>';
}
把“var”去掉var termcounter = rs(0);
关于提升,您可能是对的——JavaScript 没有块作用域,因此您两次声明 termcounter 时它都在同一作用域中。这是一个非常常见的错误,因为 JavaScript 看起来像具有块作用域的基于 C 的语言。
在条件块或循环块中声明 var 相当于在该块所在函数的开头声明它(按作用域而言)。
如果你总是将 var 声明放在函数的顶部,而不是放在条件块或循环块中,那么你会少掉一些头发。参见克罗克福德 http://www.jslint.com/lint.html#scope。您可以使用JSLint http://www.jslint.com/警告你。 (哦,顺便说一下,您缺少了大量的分号——JSLint 会伤害您的感情。)
那你为什么要重新声明呢?删除第二个“var”并执行分配。
微软的东西对我来说很陌生,但我发现 rs(0) 语法令人困惑。 rs 是一个对象吗?或者是否有某种魔法可以让它变成一个函数(JS 永远不知道)?我做了一些谷歌搜索 http://www.kuro5hin.org/story/2005/7/14/13942/7643我想知道您是否需要使用 rs.fields(0) 或 rs.fields(0).name 或 rs.fields(0).value 或其他东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)