Domanda

Ho un ripetitore e la sua SqlDatasource nidificata all'interno di Gridview TemplatedField.
L'origine dati SelectCommand del ripetitore viene impostata utilizzando FormatString di un Eval da Gridview.
SelectCommand ha una clausola WHERE che consente di confrontare una stringa.
Poiché ho già utilizzato le virgolette singole e doppie, ho problemi a delimitare la stringa nella clausola WHERE di SQL.

Come posso aggiungere virgolette singole all'interno di una stringa di formato Eval?

Ho provato a utilizzare " Sostituisci ".
Ho provato a utilizzare " Caratteri speciali '(... WHERE StringField =' {0} '. ..)

Nessuna fortuna finora. Apprezzo qualsiasi aiuto tu possa essere in grado di offrire.

<asp:GridView ID="GridView1" runat="server" DataSourceID="DataSource1" DataKeyNames="Foo" AutoGenerateColumns="False" AllowSorting="true" >
    <Columns>
        <asp:BoundField DataField="Foo" HeaderText="Foo" SortExpression="Foo" />
        <asp:BoundField DataField="Bar" HeaderText="Bar" SortExpression="Bar" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSourceNested">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("Blah") %>'></asp:Label>
                    </ItemTemplate>
                </asp:Repeater>
                <asp:SqlDataSource ID="DataSourceNested" runat="server" DataFile="~/App_Data/DatabaseName"
                    SelectCommand='<%# Eval("Bar", "SELECT Blah FROM TableName WHERE (StringField = {0})") %>' >
                </asp:SqlDataSource>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
È stato utile?

Soluzione

Non dimenticare che una pagina .aspx è semplicemente XML. Sfuggi alle virgolette come faresti normalmente.

Ad esempio:

<asp:Repeater ID="repeatTheLabel" runat="server">
    <ItemTemplate>
        <asp:Label ID="Label1" Text="<%# Eval(&quot;Id&quot;, &quot;This is item '{0}'.&quot;) %>" runat="server" />
    </ItemTemplate>
    <SeparatorTemplate>
        <br />
    </SeparatorTemplate>
</asp:Repeater>

Quando l'espressione sopra è data dal database, il valore tra <%# e %> diventa:

  

Eval("Id", "This is item '{0}'.")

... che produce sulla pagina HTML come output quando database con un array di oggetti con " Id " valori di proprietà da 1 a 5:

  

Questo è l'elemento '1'.
  Questo è l'articolo '2'.
  Questo è l'articolo '3'.
  Questo è l'articolo '4'.
  Questo è l'elemento '5'.

Altri suggerimenti

Archivia le tue query sql in proprietà nella tua classe Page. Non solo funziona :-), ma semplifica la lettura e la manutenzione del tuo codice.

Oh, e dovresti usare i parametri nelle tue query invece di fare sostituzioni di stringhe. Ciò risolverà il problema eliminando la necessità di virgolette singole.

Perché non definisci questa clausola WHERE come una const nel tuo codebehind. Definire:

protected const string SELECTCLAUSE = 
"SELECT Blah FROM TableName WHERE (StringField = '{0}')";

Quindi la proprietà SelectCommand sarebbe:

SelectCommand='<%# Eval("Bar", SELECTCLAUSE ) %>'

Hai provato a sfuggire ai caratteri di virgoletta singola?

... WHERE (StringField = \'{0}\') ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top