2009-08-31 12 views
0

Est-ce que quelqu'un a une idée de comment utiliser count (*) dans une requête dynamique avec le bloc d'application d'accès aux données de la bibliothèque d'entreprise?Nombre (*) en utilisant la bibliothèque d'entreprise

J'utilise:

Public Shared Function selectCount(ByVal code As String) As Integer 
    Dim query As String = "SELECT COUNT(*) " & _ 
          "FROM " & _ 
          "Data " & _ 
          "WHERE " & _ 
          "Code = '" & code & "'" 
    Dim db As Database = DatabaseFactory.CreateDatabase() 
    Return db.ExecuteScalar(System.Data.CommandType.Text, query) 
End Function 

Cette erreur est jeté:

L'interface ITransactionLocal est pas pris en charge par le fournisseur 'Microsoft.Jet.OLEDB.4.0'. Les transactions locales ne sont pas disponibles avec le fournisseur actuel.

+0

Les autres requêtes fonctionnent-elles? En utilisant le même bit de code juste sans count()? –

+0

J'ai recherché le message d'erreur et j'ai trouvé que l'ajout de "OLE DB Services = -4" à ma chaîne de connexion a résolu le problème en utilisant le code ci-dessus. Donc, il semble que mon code n'était pas techniquement faux, juste un problème avec la chaîne de connexion (bien que ça fonctionnait bien avant!) – Andrew

Répondre

0

J'ai regardé le message d'erreur et j'ai constaté que l'ajout de "OLE DB Services = -4" à ma chaîne de connexion a résolu le problème lors de l'utilisation du code ci-dessus. Donc, il semble que mon code n'était pas techniquement faux, juste un problème avec la chaîne de connexion (bien que cela fonctionnait bien avant!)

+0

Pourquoi avez-vous créé et accepté votre propre réponse? Pourquoi ne pas accepter la réponse de l'atelier Alex, c'est correct. –

+0

La réponse d'Alex était correcte. Cependant, ce n'était pas la cause première de mon problème. Ma mise en œuvre a également fonctionné, mais pas avant d'avoir ajouté "OLE DB Service = -4" à la chaîne de connexion, c'est pourquoi j'ai créé ma propre réponse au cas où quelqu'un aurait eu le même problème pour la même raison. Si les gens pensent que ce n'est pas la bonne façon de faire cela, je suis heureux de changer la réponse à Alex. – Andrew

3

Avez-vous essayé de créer une commande SQLC, puis utilisez Cmd. ExecuteScalar?

De plus, vous utilisez une variable dans votre requête! Cela nécessite définitivement une SQLCommand paramétrée juste pour éviter l'injection de code SQL! Peu importe si vous pouvez garantir que c'est sûr ou non. La meilleure pratique consiste à toujours utiliser des paramètres à la place. (Pourquoi? Parce qu'un autre développeur qui regarde votre code va apprendre par l'exemple, et vous ne voulez pas qu'ils apprennent de mauvaises pratiques!)

Avez-vous essayé d'ajouter "OLE DB Services = -4" à votre chaîne de connexion déjà ? J'ai entendu dire que cela pourrait résoudre cette erreur de transaction. :-) (Eh bien, je l'avoue, j'ai édité cette réponse après avoir lu votre commentaire.) Quoi qu'il en soit, cette option est liée à transactionenlistment de la base de données. Vous remplacez le paramètre en ajoutant cette valeur. (Ouais, je googlé sans vergogne pour cela.) Il semble que vos services OLE DB ont été modifiés ou peut-être qu'ils sont simplement différents parce que vous êtes sur un système différent.

+0

Vous avez absolument raison. Merci pour le conseil; Je vais changer toutes mes requêtes pour utiliser les paramètres maintenant: D – Andrew

Questions connexes