2016-02-08 1 views
0

je le code suivant qui fonctionne parfaitement bien dans le cadre de mon programme:Utilisation des caractères génériques avec des paramètres dans vb.net ADO

.CommandText = .CommandText & " and [Name] = ?" 

ajouter le paramètre à l'aide:

.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, Name.Text)) 

Cela fonctionne parfaitement, mais je veux vraiment chercher tout ce qui contient la valeur dans Name.Text. Je cherchai des dizaines d'articles qui disent que vous pouvez faire ce qui suit, mais il retourne toujours 0 même si il y a des matches de données definilty:

.CommandText = .CommandText & " and [Name] like '%' + ? + '%'" 
.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, Name.Text)) 

J'ai maintenant essayé la suggestion ci-dessous, mais le jeu d'enregistrements renvoie 0 résultats: J'utilise Microsoft Visual Studio 2015 en écrivant dans vb.net en utilisant ADODB pour me connecter à une instance de SQL Server 2014. Une trace SQL de la suggestion de CodingGorilla révèle les exécutions SQL suivantes lors de l'exécution. Je ne sais pas assez pour comprendre pourquoi ça ne marche pas!

exec sp_executesql N'SELECT * FROM qFormsAndName Where [FormType] Like ''R1%'' and [Name] like @P1 ORDER BY [CurrentStatus], [DateReceived];',N'@P1 char(100)','%JONES% 

S'il vous plaît quelqu'un peut-il vous aider?

+0

OK J'ai résolu ce problème pour tous ceux qui trébuchent sur ce problème. Vous verrez que dans mon .parameters.append j'ai mis une longueur de texte "par défaut" de 100. Cela fonctionne pour les requêtes "= Param" (pour une raison quelconque) mais ne fonctionne pas pour les requêtes Like car le paramètre suppose des caractères espace après le texte.Comme% P1% où P1 est un paramètre, il trace comme Comme "% JONES%" –

Répondre

0

Je voudrais essayer une légère variation sur ce point:

.CommandText = .CommandText & " and [Name] like ?" 
.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, "%" + Name.Text + "%")) 

Cela devrait fonctionner, même si ce n'est pas une réponse directe à laquelle votre version du code ne fonctionne pas.

+0

Cela ne fonctionne pas non plus. J'ai mis le nom "JONES" dans la zone de texte, et il y a des enregistrements dans ma base de données tels que "EWAN JONES" et "CHARLOTTE JONES", et toujours le jeu d'enregistrements dit 0 résultats. Si je change comme à = et supprime les%, je dois mettre "EWAN JONES" dans la zone de texte, mais il retourne les enregistrements corrects. –

+0

CodingGorilla, est-ce important que ma requête select soit sélectionnée dans une vue, pas dans une table? C'est seulement une vue pour pré-définir les jointures. le SQL complet lit: "SELECT * FROM qFormsAndName Où [FormType] Aime" R1% "et [Nom] comme? ORDER BY [CurrentStatus], [DateReceived];" –

+0

Cela devrait marcher contre une vue * ou * une table. Pouvez-vous voir la requête finale qu'il exécute via SQL Profiler? – CodingGorilla

0

Répondez comme un commentaire à la question d'origine, mais pour tous ceux qui voient cela, la longueur du texte doit être la longueur du texte du paramètre, donc: .Parameters.Append (SearchCom.CreateParameter ("@ Name", ADODB .DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, tbName.Text))

à: .Parameters.Append (SearchCom.CreateParameter ("Nom @", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput , tbName.TextLength, tbName.Text))

ou:

.Parameters.Append (SearchCom.CreateParameter ("@ Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, len (tbName.Text), tbName.Text))

0

Plutôt que de personnaliser la définition de paramètres en fonction l'entrée, il serait préférable de passer juste à plus approprié varchar type de données, qui spécifie une chaîne de longueur variable, plutôt que char qui spécifie une chaîne de longueur fixe:

.CommandText = .CommandText & " and [Name] like ?" 
.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adVarChar, _ 
    ADODB.ParameterDirectionEnum.adParamInput, 100, "%" + Name.Text + "%")) 

(aussi, si vous êtes vraiment, Comme vous le dites dans votre question, en utilisant VB.Net, VS 2015 et SQL Server 2014, je vous recommande sérieusement de passer à l'utilisation de ADO.Net plutôt que de l'ancienne ADO, qui date de 2000)