У меня есть Repeater и его SqlDatasource, вложенный в Gridview TemplatedField.
Источник данных SelectCommand ретранслятора устанавливается с помощью FormatString Eval из Gridview.
В SelectCommand есть предложение WHERE, предназначенное для сравнения строки.
Поскольку я уже использовал одинарные и двойные кавычки, у меня возникли проблемы с разделением строки в предложении SQL WHERE.
Как добавить одинарные кавычки внутри Eval FormatString?
Я пробовал использовать Заменять.
Я пробовал использовать 'Специальные символы' (... WHERE StringField = '{0}' ...)
Пока не повезло. Я ценю любую помощь, которую вы можете предложить.
<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>





Вы пробовали экранировать символы одиночных кавычек?
... WHERE (StringField = \'{0}\') ...
И чтобы убедиться, что я не испортил что-то еще с тегом источника данных, я переделал SQL, чтобы использовать целое число в WHERE вместо строки, и это сработало идеально. Не возвращает нужные мне данные, но доказал, что объявление источника данных и SQL не были заблокированы.
Почему бы вам не определить это предложение WHERE как константу в вашем коде. Определять:
protected const string SELECTCLAUSE =
"SELECT Blah FROM TableName WHERE (StringField = '{0}')";
Тогда ваше свойство SelectCommand будет:
SelectCommand='<%# Eval("Bar", SELECTCLAUSE ) %>'
Спасибо, Keltex, это работает. И не обижайтесь, но должно быть более элегантное решение. Это просто кажется чем-то вроде «грубой силы» - делать это таким образом. У кого-нибудь еще есть другие идеи?
Не забывайте, что страница .aspx - это просто XML. Вы просто избегаете кавычек, как обычно.
Например:
<asp:Repeater ID = "repeatTheLabel" runat = "server">
<ItemTemplate>
<asp:Label ID = "Label1" Text = "<%# Eval("Id", "This is item '{0}'.") %>" runat = "server" />
</ItemTemplate>
<SeparatorTemplate>
<br />
</SeparatorTemplate>
</asp:Repeater>
Когда приведенное выше выражение привязано к данным, значение между <%# и %> становится:
Eval("Id", "This is item '{0}'.")
... который создается на странице HTML в качестве вывода при связывании данных с массивом объектов со значениями свойства Id от 1 до 5:
This is item '1'.
This is item '2'.
This is item '3'.
This is item '4'.
This is item '5'.
Привет, Айдсман, я пробовал использовать & quot; и эта техника не работает. На странице появляется сообщение об ошибке компилятора: BC32017: запятая, ')' или ожидается допустимое продолжение выражения '. Я могу ошибаться, но я считаю, что механизм рендеринга ASP.NET должен преобразовать его в цитату раньше, чем требуется.
Странный Дэвид. Код ярлыка, который я разместил, был протестирован и работал нормально.
Я думаю, что проблема заключается в том, что я делаю это внутри строки формата Eval. Может быть, Eval преобразует "& quot; в кавычки, а затем появляется механизм рендеринга ASP.NET и выдает ошибку? Я не уверен.
Дэвид, вы не забыли поменять кавычки вокруг значения атрибута (т.е. изменить SelectCommand = '<% # на SelectCommand = "<% #), когда вы экранировали кавычки?
Aydsman, Хорошенькая, вот исправил. Я не подумал так поменять местами внешние и внутренние кавычки.
Рад слышать это, Дэвид. Я бы порекомендовал вам подумать о том, чтобы последовать совету @Rune и полностью избавиться от необходимости делать это для лучшей архитектуры.
Сохраните свои sql-запросы в свойствах вашего класса Page. Это не только работает :-), но и упрощает чтение и сопровождение кода.
Да, и вы должны использовать параметры в своих запросах вместо замены строк. Это решит проблему, исключив необходимость в одинарных кавычках.
Привет, Тай, я просто попробовал это (видел на weblogs.asp.net/jgalloway/archive/2005/10/15/427577.aspx), но он выдал ошибку «Тег сервера неправильно сформирован» в строке объявления источника данных.