1

Besoin d'un moyen de se connecter à un db SQL unique via la connexion dans ASP classique.ASP Classic Webapp - Connexion à une base de données SQL différente via la connexion

LA CONFIGURATION

  • Webapp: ASP classique/SQL 2005.
  • magasins Webapp informations pour plusieurs entreprises.
  • Toutes les données stockées dans un SQL maître 2005. Tous les DB seront sur le même serveur.
  • Chaque utilisateur dispose d'une connexion unique, (société, ID utilisateur, mot de passe)
  • Connection est avec db maître inclure fichier à l'aide de la connexion DSN
  • IE: (dbConn.Open « driver = {SQL Server}; serveur = 11.22.333.444; base de données = mywebdb », "monlogin", "mypassword")

LE BESOIN:

Vous voulez diviser les entreprises dans leur propre base de données. Lorsque l'utilisateur se connecte, le nom de l'entreprise indique à l'application d'utiliser une connexion SQL unique pour chaque entreprise.

Étant donné que les fichiers dynamiques inclus ne sont pas une option, quelle est la meilleure route à suivre?

Merci!

+0

[gripe] "logins" est un nom pluriel, pas un verbe. Essayez "Lorsque l'utilisateur se connecte, ...". [/ Gripe] – Martha

Répondre

0

Cependant, vous finirez par faire varier votre chaîne de connexion en fonction de l'entrée de l'utilisateur. N'utilisez pas directement l'entrée de l'utilisateur, mais validez-la par rapport à une liste de valeurs acceptables. Je suggère une instruction Select Case à faire:

' Do this when logging in: ' 
Dim companyName 
companyName = Request.Form("companyName") 

Select Case companyName 
Case "company1" 
    Session("companyDB") = "company1" 
Case "company2" 
    Session("companyDB") = "company2" 
Case Else 
    Session.Contents.Remove("companyDB") 
    ' Invalid login! ' 
End Select 

' Do this when connecting to the database: ' 
Dim connectionString 
If Session("companyDB") Then 
    connectionString = "...database=" & Session("companyDB") & "..." 
Else 
    ' Invalid login, go log in again ' 
End If 

Gardez à l'esprit que cela va conduire à des problèmes si vous avez des utilisateurs qui veulent ouvrir une entreprise dans un onglet et une autre société dans un autre onglet. Ils vont se demander pourquoi ils ne peuvent voir que des informations sur l'entreprise dans laquelle ils se sont connectés récemment.

Si cela pose un problème, vous souhaiterez probablement passer un jeton dans la chaîne de requête sur chaque lien. Cela ajoute de la complexité, mais pas beaucoup (à part la tâche fastidieuse de changer chaque lien). Il serait alors ressembler à ceci:

' Do this when logging in: ' 
Dim companyName 
companyName = Request.Form("companyName") 

Select Case companyName 
Case "company1" 
    Session("company1 - db") = "company1DBName" 
Case "company2" 
    Session("company2 - db") = "company2DBName" 
Case Else 
    ' Invalid login! ' 
End Select 


' Do this when connecting to the database: ' 
Dim connectionString, companyToken 
companyToken = Request("companyToken") 
If Session(companyToken & " - db") Then 
    connectionString = "...database=" & Session(companyToken & " - db") & "..." 
Else 
    ' Invalid login, go log in again 
End If 

Cela suppose que le jeton sera le même que le nom de la société, pour plus de simplicité. Ainsi, par exemple, quelqu'un se connectera à "company1". Ayant réussi, ils obtiennent une variable de session appelée "company1 - db", qui contient le nom de la base de données (dans ce cas, "company1DBName"). Maintenant, chaque lien doit avoir une chaîne de requête, comme "? CompanyToken = company1" Donc, lorsque vous vous connectez à la base de données, vous prenez ce jeton et vous l'utilisez pour trouver le bon nom de base de données: Session (" company1 "+" - db ") =" company1DBName "

S'ils ne se sont pas encore connectés à cette société (ou s'ils ne font que composer un nom de société), ils n'auront pas cette variable de session, et ils devez aller à l'écran de connexion.

S'ils se connectent sous deux sociétés à la fois, vous pouvez maintenant le gérer car vous obtiendrez le nom de la base de données sur chaque lien.

Avez-vous du sens?Quoi que vous fassiez, n'utilisez pas l'entrée utilisateur pour créer directement la chaîne de connexion. En d'autres termes, ce qui suit est la mauvaise façon :

Dim connectionString 
connectionString = "...database=" & Request.Form("companyDB") & "..." 

Bonne chance!

+0

Où sont les pages existantes à partir de laquelle la chaîne de connexion? – AnthonyWJones

+0

WOW - réponse rapide! La chaîne de connexion est stockée dans le fichier INCLUDE. L'exemple de cas de sélection ci-dessus était quelque chose avec lequel je jouais. Cela fonctionne mais je dois ajouter une compagnie à la chaîne à chaque fois. Que diriez-vous de valider la connexion pour vous assurer que votre entreprise est valide, puis enregistrez-la comme variable de session pour créer la chaîne de connexion? –

+0

C'est aussi une solution viable; J'ai édité ma réponse pour montrer comment cela serait fait, et pour montrer comment éviter un piège potentiel d'utiliser la session comme ça. –

1

La chaîne de connexion doit être stockée où bon? A include .asp je suppose.

Ajoutez du code dans cet include pour examiner le nom de la société (stocké dans la session?) Et corrigez la chaîne de connexion en conséquence.

Modifier:

Le problème est que vous pouvez avoir le code là-bas dans une myriade de différentes pages ASP qui suppose la chaîne de connexion appropriée est disponible dans une variable déclarée en vous db.asp fichier inclus (permet de l'appeler m_connStr). Vous ne voulez pas avoir à modifier toutes ces pages pour répondre à cette nouvelle exigence.

Ainsi, vous ne voulez éditer que le fichier d'inclusion db.asp et vous voulez juste que m_connStr pointe magiquement vers le bon DB. Avoir votre page de connexion une fois que vous connaissez la société définir le nom de la base de données dans une variable de session.

Votre code existant a la chaîne de connexion comme ceci: -

m_connStr = "driver={SQL Server};server=11.22.333.444 database=mywebdb", "mylogin", "mypassword" 

Nous utiliserons donc un modèle: -

m_connStrTemplate = "driver={SQL Server};server=11.22.333.444 database=%db%", "mylogin", "mypassword" 

If Session("database") <> "" Then 
    m_connStr = Replace(m_connStrTemplate, "%db%", Session("database")) 
End If 

Remarque une variable de session de base de données non-existant provoque la chaîne de connexion Pour ne pas être défini, vous ne pouvez pas vous connecter accidentellement à une base de données par défaut.

Désormais, pour toutes vos pages ASP, c'est comme d'habitude, mais la chaîne de connexion variera en fonction de la société associée à l'utilisateur connecté.

+0

Merci à tous pour l'excellente rétroaction - le modèle de code AWJ devrait fonctionner parfaitement - s'intègre dans mon fichier db_include existant - quelques lignes de changement de code permettent à mon application entière d'aller à la base de données respective de l'entreprise. –

Questions connexes