Prob : Type de données VB6 et SQL Server

Prob : Type de données VB6 et SQL Server - VB/VBA/VBS - Programmation

Marsh Posté le 20-04-2007 à 14:05:42    

Bonjour :)  
 
Donc j'ai un petit probleme.
 
Je possede une application vb6 sur un poste client, cette application à besoin d'une base de données,
 
celle-ci se trouve sur le poste serveur plus précisement sur Windows 2000 serveur, c'est une base de données sql server.
 
La connexion du logiciel vers la base de données se passe bien (sans dsn).
 
J'ai voulu rajouter une gestion des utilisateurs dans cette application donc sur un poste client lorsque que l'on lance l'application vb cette personne arrive sur une form F_admin
 
elle rentre son login et mot de passe puis elle accede aux differente form celon sa catégorie (administrateur, responsable, secraitaire).
 
Les utilisateurs son gerer dans la base de données (une table utilisateur et type_utilisateur).
 
Le probleme c'est que le type de données dans sql server pr le login et mot de passe est du text  
 
et dans vb ma requete qui extrai le login n'extrai rien du tout.  
J'ai changé le type de donné du champ login en car (15). Ma requete cette foi si extrait bien le login mais par exemple si la personne s'appelle richard vb extrait "richard        " et donc la verification du ma variable local est differente...
 
Du coup je ne vois pas comment faire.
 
Y'a t'il possibilité de declarer un certain nombre de caractere dans vb? ou sinon comment que je peux faire .
 
 
 

Reply

Marsh Posté le 20-04-2007 à 14:05:42   

Reply

Marsh Posté le 20-04-2007 à 14:13:35    

peux-tu nous donner tes lignes de codes pour qu'on voit de quoi il s'agit stp ?
ton create table et ta requete
 
d'autre part, l'orthographe n'est pas une option  :non:

Reply

Marsh Posté le 20-04-2007 à 14:20:34    

Si les caractères qui suivent le mot « richard » sont des espaces alors tu peux utiliser les fonctions RTrim$ ou Trim$
 
En VB tu peux déclarer une variable texte d'une longueur précise avec la syntaxe :
Dim sLogin As String * 15
 
Mais cela peut poser des problèmes en paramètre de certaines API car cela formate systématiquement ta chaine avec des blancs à la fin si celle-ci est d'une longueur inférieure à ta déclaration (comme initialement pour ton champ SQL).
 
Exemple :
Dim s As String * 10
s= "12"
MsgBox "-" & s & "-"     ' renvoie « -12        - »
MsgBox "-" & RTrim$(s) & "-"     ' renvoie « -12- »
 
 
 

Reply

Marsh Posté le 20-04-2007 à 14:27:32    

=> TEXT ça sert à stocker des informations de plus de 8000 caractères. Donc à moins que le mot de passe de test utilisateurs soit le contenu de l'encyclopédie universalis, ça n'a pas d'intérêt (TEXT stocke jusqu'à 4 Go)
 
CHAR(x) a une taille fixe de X caractèes.
Ca veut dire que si tu écrit "TOTO" dans un CHAR(15) ça va stocker en réalité : "TOTO           " (avec 11 espaces derrière).
Et en SQL, 'TOTO           ' <> 'TOTO'
Tu vas donc devoir user et abuser de la commande TRIM() ce qui est loin d'être une bonne idée.
 
Passe-moi ça tout de suite en VARCHAR(20) (20 caractères pour un login et un mot de passe, ça me semble amplement suffisant, alors que 15 pourraît s'avérer trop court.
Tu peux aussi utiliser NVARCHAR() si tu veux permettre à tes utilisateurs d'utiliser des caractères étendus pour leur mot de passe (genre un mot de passe écrit en arabe, c'est assez pratique pour se protéger, puisque même écrit sur un bout de papier dans un tirroire, ça va empêcher 95% des petits malins de savoir l'écrire ;))
 
Sinon, en VB, pour reproduire le comportement de CHAR(x) alors tu peux déclarer tes variables comme ceci :

Code :
  1. Dim login As String * 15


 
MAIS JE TE LE DECONSEILLE TRES FORTEMENT !

Reply

Marsh Posté le 20-04-2007 à 14:28:02    

groumpf grillé.
 
m'enfin dans tous les cas, VARCHAR ou NVARCHAR est la seule solution recevable :o

Reply

Marsh Posté le 20-04-2007 à 14:39:09    

jpcheck a écrit :

peux-tu nous donner tes lignes de codes pour qu'on voit de quoi il s'agit stp ?
ton create table et ta requete

 

d'autre part, l'orthographe n'est pas une option  :non:

 


Voici ma table utilisateurs http://img245.imageshack.us/img245/9630/sqlserverkh8.th.jpg

 


Voici mon code vb : http://img297.imageshack.us/img297/8913/vbkl5.th.jpg

 

Donc ma variable locale login ne récupère rien et ma requete récupére  = "hélène         " (si l'utilisateur tape hélène dans le champ du login)

 

en string sur vb bien sur


Message édité par nicquehen le 20-04-2007 à 14:40:35
Reply

Marsh Posté le 20-04-2007 à 14:43:40    

En vchar 20 sur sql server  
en String * 20 sur vb  
 
 
Ma variable login extrait des caractère bizarre de la forme de carré :p.

Reply

Marsh Posté le 20-04-2007 à 14:45:43    

En nvarchar 20 sur sqlserver

 

la meme chose d'ailleur


Message édité par nicquehen le 20-04-2007 à 14:45:55
Reply

Marsh Posté le 20-04-2007 à 15:13:59    

2 clés primaires dans une table ?  :pt1cable:  
ca se programme comme ca

Reply

Marsh Posté le 20-04-2007 à 15:24:40    

C'est pour gerer la relation sinon il prend pas en compte mes jointure dans vb

Reply

Marsh Posté le 20-04-2007 à 15:24:40   

Reply

Marsh Posté le 20-04-2007 à 15:57:08    

au lieu de faire un .open "ta_requete"
passe par un :
dim RS as DAO.RecordSet
set RS = tabase.openrecordset("ta_requete" )
puis travaille sur  
RS!ton_champs :)

Reply

Marsh Posté le 20-04-2007 à 16:18:00    

tu crois que ado gere mal les type de données? et de passé en dao serait mieu?

Reply

Marsh Posté le 20-04-2007 à 16:28:53    

j'ai mis DAO par habitude, ce n'est pas nécessaire de le mettre il me semble
dim RS as RecordSet devrait faire l'affaire :)

Reply

Marsh Posté le 20-04-2007 à 18:25:19    

jpcheck a écrit :

2 clés primaires dans une table ?  :pt1cable:  
ca se programme comme ca


c'est pas "deux clés primaires", mais une clé composite. ce sont les tuples composés des deux colonnes qui forment la PK.
 
ainsi : 1,1 ; 1,2 ; 2,1 sont des valeurs possibles pour la PK, ce qui est impossible à obtenir avec une clé simple. ça fait 100% partie de merise, et ça permet l'utilisation d'index de PK bien plus optimisés qu'une clé simple.
 
 
edit : ceci dit, il est parfaitement possible (et prévu par merise) d'avoir deux "clés primaires". plus exactement, il y a une clé primaire et une ou plusieurs clés composites. aujourd'hui, ça se traduit généralement par un index unique.
 
par exemple, dans une table utilisateur, tu vas avoir une PK et au moins deux clés compostites :
PK : ID
ALT1 : LOGIN
ALT2 : EMAIL
 
Car chacune de ces trois colonnes ne peut contenir QUE des valeurs identiques (email pouvant dans certains cas être null, possibilité qu'apporte la clé alternative)


Message édité par MagicBuzz le 20-04-2007 à 18:30:58
Reply

Marsh Posté le 20-04-2007 à 18:28:39    

sinon...
 
Lance ce script (pour les alter, je suis pas sûr de la syntaxe... change les types en varchar(20) quoi...)
Surtout, une fois le changement de type effectué, lance bien le update ! Sinon les blancs inserrés abusivement par CHAR(15) vont rester.

Code :
  1. ALTER TABLE utilisateurs ALTER COLUMN id_util AS varchar(20)
  2. go
  3. ALTER TABLE utilisateurs ALTER COLUMN pwd_util AS varchar(20)
  4. go
  5. UPDATE utilisateurs SET id_util = trim(id_util), pwd_util = trim(pwd_util)
  6. go


 
Ensuite, dans ton code VB, partout où t'as mis des string * 15 ou stirng * 20, remet string tout court.
 
Et ça va marcher.

Reply

Marsh Posté le 20-04-2007 à 22:27:37    

Merci bien sa marche nikel :) la fonction trim n'est pas trouvé par sql server j'ai donc fait avec rtrim.
 
 
UPDATE utilisateurs SET id_util = rtrim(id_util), pwd_util = rtrim(pwd_util)
 
 
Maintenant j'ai une nouvelle erreur qu'il faut que je contourne.
 
Lorsque par exemple lorsque je clic sur mon bouton valider et que l'utilisateur ou le mot de passe (ou les deux ) n'est pas valide.  
 
Vb renvoie directement une erreur  : http://img440.imageshack.us/img440/6352/erreuriduy0.th.jpg
 
Car en effet il ne trouve pas le login dans la base de donnée mais je ne vois pas pallier l'erreur vb car il bloque direct au IF et il s'arrete il ne fais pas le else avec le message d'erreur.  

Reply

Marsh Posté le 20-04-2007 à 22:30:13    

avec un on error goto fin:  
 
.....
fin:
end sub
 
ca pourrait peut etre marcher
 
EDIT: quelqu'un qui a du gout
death note c'est de la balle mais mieu en scan


Message édité par ingenieurcesi le 20-04-2007 à 22:32:35
Reply

Marsh Posté le 20-04-2007 à 22:39:08    

même pas besoin de gestion d'erreur tardive...
 
avant de lire dans le recordset, tu vérifies qu'il n'est pas à EOF :
 

Code :
  1. if RS.EOF then
  2.   msgbox("dtc" )
  3. else
  4.   msgbox("supaïr t'as un mot de passe valide" )
  5. end if

Reply

Marsh Posté le 20-04-2007 à 23:10:17    

Merci de vos réponses tout cela marche parfaitement :).
 

Reply

Marsh Posté le 21-04-2007 à 13:35:25    

Allé une petite question encore :p  
 
 
Comment transformer la premiere lettre d'un champ en majuscule?
 
Par exemple si dans mon champ login je tape "nicolas"
Que le "n" se tranforme en majuscule automatiquement.
 

Reply

Marsh Posté le 21-04-2007 à 14:52:29    

regarde si ton sgbd propose ce type de fonctions. généralement, ça s'appelle... hmmm... mince, je sais plus :) capitalize ou un truc du genre. sinon, va falloir le faire à la main avec des sous-chaînes

Reply

Marsh Posté le 22-04-2007 à 20:27:16    

a voir =>UCASE

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed