2017-09-03 1 views
-1

Par une raison inconnue la result variable dans la ligne de code suivanteComment intriguer Tcl "liste comme chaîne" comme liste?

set result [[$sqlCmd execute] allrows -as lists] 

obtient la chaîne qui ressemble à la liste: {2 3 4 5}

Si j'écris puts "result $result => [llength $result]" imprime {2 3 4 5} => 1

si j'écris puts [list $result], il imprime {{2 3 4 5}}, ce qui est correct car list crée la liste à partir d'une chaîne.
Y at-il un moyen de convertir cette chaîne à ce qu'elle devrait être - list - sans aucune étape de traitement de chaîne comme la suppression des accolades et la séparation des chaînes à la liste par split fonction? Je suggère que cela doit être une interprétation mais je suis incapable de trouver une bonne solution.

+0

Ce n'est pas un expert TCL, mais cela ressemble à votre commande SQL qui vous donne une liste de longueur 1 dont 1 élément est une autre liste. Si la commande avait sélectionné deux lignes, elle vous aurait donné une liste de longueur 2 dont les éléments étaient des listes individuelles représentant des lignes individuelles. – user2357112

+0

@ user2357112 Je ne suis pas sûr de comprendre ce que vous voulez dire. Il semble bonne suggestion que la liste de longueur-1 devient notlist. Mais comment cela peut-il se produire? Et en cours d'exécution dans la console SQL Server, la requête renvoie exactement une ligne de données, ce qui est attendu. Alors, pourquoi, en fait, devrait-il retourner une liste de longueur différente. S'il vous plaît expliquer, que voulez-vous dire. – OlegG

+0

"liste de longueur-1 devient notlist" - quoi? Non, c'est toujours une liste. Pourquoi pensez-vous que ce n'est pas? – user2357112

Répondre

1

allrows donne une liste de listes, chaque sous-liste représentant une ligne. Il y a 1 ligne dans cette liste, 2 3 4 5, donc la longueur est 1. Vous pouvez indexer ou itérer sur la liste les moyens habituels pour accéder à son élément.

# If you're assuming there will only be one row 
set only_row [lindex $result 0] 

# Or if you want to iterate over all rows 
foreach row $result { 
    do whatever with $row 
} 
+0

Cette ligne devrait être listée. Mais ce n'est pas. – OlegG

+0

@OlegG: C'est * une * liste. – user2357112

+0

Oui. Le code [lindex $ result 0 0] renvoie 2. Merci! :) – OlegG

2

La méthode allrows renvoie toujours une liste, un par ligne (même quand il n'y a qu'une seule ligne renvoyée). Lorsque l'option -as lists est transmise, chaque élément de cette liste est lui-même une liste représentant les colonnes de cette ligne.

Ainsi, pour itérer sur les colonnes de cette ligne, vous feriez:

set result [[$sqlCmd execute] allrows -as lists] 
set rowresult [lindex $result 0] 
foreach col $rowresult { 
    puts "I've got a '$col'" 
} 

Vous êtes généralement recommandé d'utiliser la valeur par défaut qui représente les lignes que les dictionnaires indexés par nom de colonne, comme cela a un meilleure représentation de SQL NULL s (c'est-à-dire que la colonne est absente alors au lieu d'être la valeur nulle désignée par le pilote, qui est souvent et de manière ambiguë la chaîne vide).

+0

Merci pour vos conseils. Malheureusement, ce n'est pas mon cas. – OlegG