2009-07-21 10 views
0

J'essaie d'exécuter du code qui copiera les champs dans une nouvelle table, en les déplaçant d'une table _New à la table d'origine. Le code VBA qui fait cela fonctionne en tant que tel:Valeur "Null" dans les requêtes

SQLStatement = CStr("INSERT INTO " & TName & " SELECT * FROM " & TName & "_New") 
Log.WriteLine "Running query with string """ & SQLStatement & """ " 
QueryTimer = Timer 
DoCmd.RunSQL SQLStatement 
Log.WriteLine "Query time: " & (Timer - QueryTimer) 

Le journal est juste une poignée de procédures dans un module de classe I jeté ensemble. Sa sortie sur l'erreur est

@142921: Running query with string "INSERT INTO Records SELECT * FROM Records_New" 
@142941: Error Date/Time: 7/21/2009 2:29:40 PM 
@142941: Error # & Description: 3162, You tried to assign the Null value to a variable that is not a Variant data type. 

Je peux confirmer que TName et SQLStatement sont les deux chaînes valides au moment de l'opération SQL est exécutée, et que les sources (Donnés et Records_New) sont valides. Option Explicit est défini ailleurs dans le fichier pour éviter toute confusion due aux fautes de frappe. L'erreur est renvoyée sur la ligne DoCmd.

Pourquoi cela aurait-il une valeur de Null, même si DoCmd.RunSQL ne renvoie pas de valeur?

+1

Quelle ligne est-il jeter l'erreur? Pouvez-vous essayer d'ajouter "option explicite" en haut de votre code et voir si elle compile encore? – JohnFx

+0

Ajout d'informations pour répondre à vos questions. –

+0

Avez-vous essayé d'exécuter la requête directement (en dehors de votre code). Cela pourrait éclairer le problème. – JohnFx

Répondre

3

Pouvez-vous publier les descriptions de tables pour Records and Records_New tables? Je parierais que vous essayez d'insérer une valeur NULL dans l'une des colonnes de la table "Records" (et la description de la colonne n'est pas NULL).

Espérons que cela aide.

+0

Cela s'est avéré être le problème. La source (Records_New) était une requête Access stockée qui contenait tous les enregistrements d'une table qui n'existait pas dans la table Records (basée sur les enregistrements ayant un numéro d'identification automatique "Null"). Le 'INSERT' a essayé d'appliquer un numéro automatique' Null', ce qui n'est pas autorisé. Le masquage du résultat de la vérification du numéro d'identification a corrigé le problème. –

-1

Peut-être que Timer a besoin de parens?

QueryTimer = Timer() 
+0

'Timer' est un VBA intégré qui retourne des fractions de seconde depuis le 1/1/1970. Son utilisé dans d'autres endroits sans problème. La ligne iffy est la ligne 'DoCmd.RunSQL'. –

+0

Fonction de temporisation: "Renvoie un Single représentant le nombre de secondes écoulées depuis minuit ... Dans Microsoft Windows, la fonction Timer retourne des parties fractionnaires d'une seconde" (http://office.microsoft.com/fr-fr/access/HA012289231033 .aspx) Notez qu'il peut être utilisé comme une expression dans une requête de moteur de base de données Access. – onedaywhen

1

Je pense qu'il sera utile si vous modifiez également l'instruction d'insertion pour être plus précis sur les colonnes qu'il insère/sélectionne. Vous demandez des bugs en étant si non spécifique. Cela peut sembler ne pas répondre à votre réponse, mais je soupçonne que les colonnes de la table de sélection et de la table de destination ne sont pas alignées, ou qu'il y a un champ dans la table de destination qui annule null.

Essayez ceci:

Dans une nouvelle requête (en vue SQL) coller votre requête « INSERT INTO enregistrements SELECT * FROM Records_New » et essayer de l'exécuter manuellement. Je parie que vous obtenez une erreur plus spécifique et pouvez résoudre la requête avant de l'exécuter avec la complexité supplémentaire du code qui l'entoure.

+0

Coller dans la requête SQL donne une boîte de dialogue d'erreur avec le même message qui a été intercepté dans le code. L'aide sur cette erreur ne fournit aucune explication, puisque je ne peux pas comprendre ce qui a été réglé sur 'Null' en premier lieu. –

+0

Dans ce cas, je suggère de réécrire la requête pour être plus explicite sur les champs exacts dans les tables source et destination. Vérifiez également deux/trois qu'aucun des champs de la table de destination n'autorise les valeurs nulles, et que les types de champs sont les mêmes dans les deux tables. – JohnFx

0

INSERT INTO Statement (Microsoft Access SQL)

Votre instruction SQL INSERT est incorrecte - il devrait être:

INSERT INTO Records SELECT * FROM [Records_New]; 

Voici ce que vous devez utiliser:

CStr("INSERT INTO " & TName & " SELECT * FROM [" & TName & "_New)"];") 
+0

À quoi servent les «n»? Je n'ai jamais vu cela dans la syntaxe SQL avant? –

+0

Il s'agit d'un alias de table, donc vous savez que vous recevez * de la table RECORDS_NEW sans vous soucier de ce que cela pourrait prendre de RECORDS à la place ou à la place. –

+0

Votre syntaxe donne une nouvelle erreur: '@ 151343: Erreur # & Description: 3075, Erreur de syntaxe dans l'expression de requête 'SELECT n. * FROM Records_New n'.' –