Pergunta

Eu tenho um repetidor e sua SQLDataSource aninhado dentro de um GridView TemplatedField.
SelectCommand fonte de dados do repetidor é definida usando o FormatString de um Eval do Gridview.
O SelectCommand tem uma cláusula WHERE que é comparar uma string.
Porque eu já tenha usado as aspas simples e duplas, eu estou tendo problemas para delimitar a cadeia no SQL cláusula WHERE.

Como posso adicionar aspas simples dentro de um Eval FormatString?

Eu tentei usar ' Substituir '.
Eu tentei usar ' caracteres especiais ' (... ONDE StringField = '{0}'. ..)

Sem sorte até agora. Agradeço qualquer ajuda que você pode ser capaz de oferecer.

<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>
Foi útil?

Solução

Não se esqueça que uma página .aspx é simplesmente XML. Você acabou de escapar as aspas, como faria normalmente.

Por exemplo:

<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 a expressão acima é a ligação de dados entre o valor <%# e %> torna-se:

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

... que produz na página HTML como saída quando databound com uma variedade de objetos com "ID" valores de propriedade de 1 a 5:

Este é o item '1'.
Este é o item '2'.
Este é o item '3'.
Este é o item '4'.
Este é o item '5'.

Outras dicas

Guarde as suas consultas SQL nas propriedades em sua classe de página. Não só trabalhar :-) mas faz seu código mais fácil de ler e manter.

Oh, e você deve usar parâmetros em suas consultas em vez de fazer as substituições de corda. Que vai resolver o problema removendo a necessidade de aspas simples.

Por que você não definir esta cláusula WHERE como um const em sua codebehind. Definir:

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

Em seguida, sua propriedade SelectCommand seria:

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

Você tentou escapar das aspas simples?

... WHERE (StringField = \'{0}\') ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top