2009-07-23 8 views
3

J'ai une fonction Javascript très simple qui frappe un serveur MS SQL et retourne des enregistrements. Il y a une cellule que je veux afficher uniquement dans la ligne du tableau supérieur lorsqu'elle est unique. Je crois que mon problème est le hissage de var car la variable que j'affecte dans la boucle while ne fonctionne pas parce que la valeur n'est pas transmise des derniers enregistrements à comparer. Voici le codeJavascript var le problème de levage

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

} 
+1

Google devient omniprésent. Je viens de googler "javascript var hoisting" afin d'obtenir des documents officiels, et le premier résultat sur la page était cette question. –

+0

Haha. C'est foutu! – Nosredna

Répondre

6

Prenez le « var » au large de la var termcounter = rs(0);

Vous avez probablement raison au sujet de levage - JavaScript n'a pas la portée du bloc, donc deux fois que vous déclarez termcounter qu'il est dans le même portée. C'est une erreur très courante, car JavaScript ressemble à des langages C qui ont une portée de bloc.

La déclaration d'une variable var dans un bloc conditionnel ou en boucle équivaut à la déclarer au début de la fonction dans laquelle se trouve le bloc, champ d'application.

Vous perdrez moins de poils si vous placez toujours vos déclarations var en haut des fonctions - jamais dans des blocs conditionnels ou en boucle. See Crockford. Vous pouvez utiliser JSLint pour vous prévenir. (Oh, au fait, il vous manque une tonne de points-virgules - JSLint va blesser vos sentiments.)

Alors pourquoi le redécouvrez-vous? Déposez le second "var" et faites juste l'assignation. Le contenu Microsoft est étranger à moi, mais je trouve la syntaxe rs (0) déconcertante. Est-ce que rs est un objet? Ou y a-t-il une sorte de magie qui en fait aussi une fonction (on ne sait jamais avec JS)? I did some Googling et je me demande si vous devez utiliser rs.fields (0) ou rs.fields (0) .name ou rs.fields (0) .value ou quelque chose.

+0

Je me souviens d'avoir déjà vu un cas dans IE6 où les éléments du tableau étaient lus en utilisant des parenthèses, pas des crochets. Et ça a marché. –

+0

Ooo. Vous me donnez une de ces migraines IE6 dont il est si difficile de se débarrasser! – Nosredna

+1

Je viens d'essayer parens plutôt que des crochets dans la console de Chrome. Ne pas aller. _TypeError: l'objet n'est pas une fonction_ Je n'entendrai plus parler de votre folie IE6. :-) – Nosredna

3

Vous avez ceci:

var termcounter = rs(0); 

Je ne pense pas que vous voulez être redéclarant ici - enlever var:

termcounter = rs(0);