2009-03-18 10 views
2
<asp:HiddenField ID="hfDualInitials" runat="server" Visible="false" OnInit="hfDualInitials_OnInit" /> 
    <asp:SqlDataSource ID="sdsStoreNo" runat="server" ConnectionString="<%$ ConnectionStrings:ConnStr %>" 
     SelectCommand="select * from AccountCancellation_Process 
         where store_num in (select distinct storeno from franchisedata where initials in (@DualInitials)) 
         order by CustomerName ASC" > 
     <SelectParameters> 
      <asp:ControlParameter ControlID="hfDualInitials" DbType="String" Name="DualInitials" /> 
     </SelectParameters>      
    </asp:SqlDataSource> 

J'ai un SQLDataSource avec la commande de sélection ci-dessus et le code ci-dessous pour définir la valeur HiddenFieldASP.net: Variable SQLDataSource et session

Protected Sub hfDualInitials_OnInit(ByVal sender As Object, ByVal e As EventArgs)   
    Dim _DualInitials As String = "('P2','7T')" 
    Session.Add("DualInitials", _DualInitials) 
    Me.hfDualInitials.Value = Session("DualInitials") 
End Sub 

Je se moquant de la session avec ('P2' , '7T') qui va passer dans la commande sql ci-dessus. quand je lance la requête:

select * from AccountCancellation_Process where store_num in (select distinct storeno from franchisedata where initials in ('P2','7T')) 

il renvoie des données, mais dans ma SQLDataSource commande select. Il ne retourne rien. ma conjecture est à cause des initiales dans (@DualInitials) le() qui est déjà dans le champ caché mais si je supprime le() et ai juste @DualInitials. J'obtiendrai "Syntaxe incorrecte près de '@DualInitials'."

Est-ce que quelqu'un sait une solution de contournement ou où je me trompe?

Répondre

1

Consultez les réponses à la question ADO.NET TableAdapter parameters.

Vous avez une requête avec un paramètre de chaîne, pas un paramètre de tableau. Donc, quand vous passez « (« P2 », « 7T ») » vous pensez que la requête finale est

WHERE initials IN ('P2', '7T') 

En réalité, il est

WHERE initials IN ('(''P2'', ''7T'')') 

Si elle ne va être deux initiales alors réécrivez juste en utilisant l'instruction OR. Sinon je ne connais pas de bonne solution en dehors de celles mentionnées dans l'autre thread.

+0

Une raison particulière pour laquelle je suis ici -1? L'instruction IN traite le paramètre en tant que chaîne et non en tant que séquence. J'ai donné une solution au problème de Jack. wtf? – Ruslan

0

Vous ne pouvez pas paramétrer une instruction IN dans SQL comme ça. Vous devrez utiliser la concaténation de chaîne du SQL à la place (mauvaise) ou une autre technique comme l'analyse d'une chaîne délimitée.

0

Sans exécuter l'exemple, je ne peux pas être sûr, mais qu'en est-

WHERE initials IN (<%=Eval(@DualInitials)%>)