2011-01-11 3 views
2

J'essaie d'insérer des variables dans ma chaîne de connexion en espérant qu'elles seront enregistrées pour l'exécution de plusieurs requêtes.comment insérer des variables dans la chaîne de connexion vb.net

Ce que je suis en train est quelque chose comme ceci:

Private sConnectionString As String = "Provider=TDOLEDB;Data Source=TDDEV;Persist Security Info=True;User ID="&user&";Password="&pass&";Default Database=bcpm_ddbo;Session Mode=ANSI;" 

mais il ne fonctionne pas.

OU

Je ne me dérangerait pas de faire quelque chose comme ci-dessous, mais seulement une invite et laisser la connexion ouverte?

Private sConnectionString As String = "Provider=TDOLEDB;Data Source=TDDEV;Persist Security Info=True;Prompt=Complete;Default Database=bcpm_ddbo;Session Mode=ANSI; 

"

toute aide serait grandement appréciée !!!

Répondre

3

La raison pour laquelle votre code d'origine ne fonctionne pas est que vous utilisez les éléments suivants: Le premier & est bon. Mais la seconde & est ambiguë dans ce cas, car un nom de variable immédiatement suivi par un & a une signification spéciale dans VB . Pour que cela fonctionne, vous devez insérer un espace avant le second &.

En fait, vous devriez toujours insérer des espaces avant et après chaque opérateur binaire. Cela rend le code infiniment plus lisible.

"…" & user & "…" 

Maintenant le code fonctionne. Mais en utilisant String.Format est encore plus lisible ici.


La vraie raison est que avec les anciennes versions BASIC et VB (et toujours avec Option Explicit Off, qui est un style très mauvais!) Les variables ne doivent être déclarés. Pour avoir encore la possibilité de dire que la variable x est d'un type donné, on pourrait ajouter un suffixe de type. & est le suffixe de type pour Long dans VB6 (et probablement aussi dans VB.NET mais je ne l'ai pas cherché).

+0

J'utilise secondement 'String.Format' à la place de la concaténation. –

+0

Mais dans le "String.Format" il cherche à spécifier un nom d'utilisateur et mot de passe - ils sont définis côté serveur et ne peuvent pas être codés en dur dans l'application, car ils devront être changés entre au moins 10 utilisateurs, une fois tous les 3 mois . - Konrad J'apprécie vraiment l'explication! – gfuller40

+0

@gfuller: rien ne doit être codé en dur. 'String.Format' peut utiliser des variables très bien. –

0

Selon le fournisseur de client db vous pouvez utiliser OracleConnectionStringBuilder ou SqlConnectionStringBuilder. Ces classes exposent les champs de chaîne de connexion communs propriétés (comme DataSource , Mot de passe etc) qui sont get; set;

0

Je ne suis pas exactement ce que vous essayez de faire, mais il me semble que l'utilisation String.Format irait en partie à résoudre votre problème - construire un format:

Private sConStrFormat As String = "Provider=TDOLEDB;Data Source=TDDEV;Persist Security Info=True;User ID={0};Password={1};Default Database=bcpm_ddbo;Session Mode=ANSI;" 

Je suppose que vous liriez le format de votre chaîne de connexion à partir de votre fichier de configuration (app.config/web.config), de sorte que vous définiriez le format là-bas et utilisez ensuite String.Format pour insérer le nom d'utilisateur et le mot de passe corrects.

Puis, quand vous voulez l'utiliser vous venez:

Dim UserName As String = "MyUserName" 
Dim Password As String = "MyPassword" 
sConStr = String.Format(sConStrFormat, UserName, Password) 
Using Con As SqlConnection = new SqlConnection(sConStr) 
    Con.Open 
    'Do whatever you need with your open connection... 
End Using 
'.... 

Est-ce que faire ce que vous cherchez? L'alternative ConnectionStringBuilder serait plus préférable - vous avez juste besoin d'écraser les propriétés UserID et Password (qui sont Get/Set), mais cela est parfaitement utilisable.

Les alternatives sont d'activer la sécurité intégrée et de demander à l'utilisateur de se connecter à l'application et d'utiliser une usurpation d'identité ou d'utiliser son identité Windows pour son interaction avec la base de données. Consultez l'espace de noms System.Security.Principal et la classe WindowsIdentity pour obtenir des pointeurs sur la façon de procéder.

+0

Merci beaucoup, vous les gars! C'est une application multi-utilisateur, mais chaque utilisateur aura son propre login Teradata. Cela fonctionnera-t-il avec ça? Je veux avoir un formulaire de connexion et stocker les données des txtboxes à la chaîne et réutiliser ici dans la chaîne de connexion. – gfuller40

+0

Vous devriez probablement également vérifier SecureString si vous allez le garder pour le réutiliser. Laissant le mot de passe dans la mémoire dans un format facilement lisible n'est pas vraiment la meilleure chose à faire. – BenAlabaster

+0

@ gfuller40 De rien, je suis contente que nous puissions aider – BenAlabaster

0

Je ne sais pas si je comprends. Vous ne pouvez pas réutiliser une connexion avec différents utilisateurs. Vous allez avoir besoin d'une nouvelle connexion pour chaque utilisateur que vous souhaitez connecter à la base de données. Si vous essayez juste de le rendre plus facile à formater la chaîne elle-même, vous pouvez utiliser la réponse de Nick ou string.Format:

Dim format As String = "Provider=TDOLEDB;Data Source=TDDEV;Persist Security Info=True;User ID={0};Password={1};Default Database=bcpm_ddbo;Session Mode=ANSI;" 
Dim connectionString1 As String = String.Format(format, "some username", "some password") 
Dim connectionString2 As String = String.Format(format, "another username", "another password") 
Questions connexes