2011-05-25 3 views
2

J'ai donc récemment travaillé sur un script VBA pour transférer une base de données complète de dossiers médicaux d'étudiants de leur ancien système à une table, 68 champs, à un nouveau système dynamique avec 24 les tables.Trop peu de paramètres. Prévu 1 - mais j'en ai un

Il n'y avait pas de problème pour les premières tables, mais j'ai ensuite rencontré ce problème. La ligne de code jeter l'erreur est:

Set rstFrom = CurrentDb.OpenRecordset("select " & Flat & ".Student," & Flat & ".School," & Flat & ".Social," & Flat & ".FamilyHist from " & Flat & " WHERE 1=1")` 

Flat est une chaîne qui stocke le nom de la base de données plat (ce qui est parce que je travaille avec une base de données fictive afin qu'ils auront besoin d'un moyen pratique et rapide modifier le code que je fais pour travailler sur le vrai)

rstFrom doit contenir uniquement les colonnes de la table de 68 champs qui sont pertinentes pour la Table FamilyHistory qui n'a vraiment besoin que des studentID et FamilyHistory) - notez que la table d'origine n'a pas affecté studentID s, donc je dois utiliser le nom, école et sociale de déterminer que je traite avec le même enfant et regarder leur studentID

Lorsque cette ligne de code court, je reçois l'erreur suivante:

Run-time error '3061': 

Too few parameters. Expected 1. 

Il est clair que je 1 paramètre, il est:

"select " & Flat & ".Student," & Flat & ".School," & Flat & ".Social," & Flat & ".FamilyHist from " & Flat & " WHERE 1=1"

(qui, après analyse est):

"select Demos.Student,Demos.School,Demos.Social,Demos.FamilyHist from Demos WHERE 1=1"

Le cas où 1 = 1 est requis lorsque vous travaillez avec Access VBA ou bien il ne renvoie que le premier enregistrement qui correspond, pas tous les enregistrements correspondants.

Est-ce que quelqu'un d'autre a eu le même problème que résolu? J'ai remarqué une chose. Quand je change le paramètre à:

"select Demos.Student from Demos WHERE 1=1"

Il est capable de franchir cette ligne sans problème, même si cela provoque des problèmes plus tard quand j'ai besoin de lire d'autres données que je ne l'ai pas récupérer. J'ai pensé que c'était intéressant, cependant, que l'erreur semble provenir du SQL et non de la fonction OpenRecordset.

+0

Je ne sais pas pourquoi vous obtenez cette erreur, mais pourquoi ne pas juste pop sql dans une chaîne et passez ensuite que le paramètre? –

+0

Déjà essayé. 'CurrentDb.OpenRecordset (" sélectionnez Demos.Student, Demos.School, Demos.Social, Demos.FamilyHist à partir de Demos WHERE 1 = 1 ")' me donne la même erreur. – stevendesu

+4

Vérifiez les noms des champs dans le SQL par rapport à ce que vous avez dans la table.Je pense, soit le nom de champ dans SQL ci-dessus est mal orthographié ou vous n'avez pas un ou plusieurs champs (d'instruction SQL) dans la table. – shahkalpesh

Répondre

4

Vérifiez les noms des champs dans le SQL par rapport à ce que vous avez dans la table.

Je pense que le nom du champ dans SQL ci-dessus est mal orthographié ou que vous n'avez pas un ou plusieurs champs (d'instruction SQL) dans la table.

0

Les paramètres de texte de la requête d'insertion doivent comporter une seule citation. J'ai rencontré le même problème avec une requête utilisant Visual C++.

Voici le code que je fini par utiliser ...

void FileInterface::TblWrite(CDatabase* db, rec* r) 
{ 
    string sqlQuery = "insert into THREATS(ID,CODE,ID,LAT,LON,SHOW_A,SHOW_B) Values(" + 
     to_string((_Longlong)r->num) + "," + 
     to_string((_Longlong)r->code) + "," + 
     "'" + r->id + "'" + "," + 
     to_string((long double)r->lat) + "," + 
     to_string((long double)r->lon) + "," + 
     "1" + "," + 
     "1" + 
     ")"; 
    db->ExecuteSQL(sqlQuery.c_str()); 
} 
Questions connexes