当我从数据库中选择项目时,我想用空字符串替换字段的任何空值。目前,我所拥有的在SQL Management Studio中运行良好,但当我将其放在C#代码的SELECT语句中时,如果值为null,我希望为空的列将不会显示。我没有看到任何错误消息显示。
我仍在学习SQL,所以我不知道如何修复查询,以便在浏览器中的网格视图中显示所有3列,无论ThumbnailUrl字段是否为null。
感谢您的帮助!谢谢
设计器中的网格视图代码:
<cb:SortedGridView ID="SearchResultsGrid" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductId" GridLines="None" SkinID="PagedList" Width="100%" Visible="false" >
<Columns>
<asp:TemplateField HeaderText="Thumbnail">
<ItemStyle HorizontalAlign="Center" />
<ItemTemplate>
<asp:HyperLink ID="NodeImageLink" runat="server" NavigateUrl='<%# UrlGenerator.GetBrowseUrl((int)Eval("ProductId"), CatalogNodeType.Product, (string)Eval("Name")) %>'> <asp:Image ID="NodeImage" runat="server" ImageUrl='<%# Eval("ThumbnailUrl") %>' Visible='<%# !string.IsNullOrEmpty((string)Eval("ThumbnailUrl")) %>' AlternateText='<%# Eval("Name") %>' /> </asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="SKU" SortExpression="Sku">
<HeaderStyle HorizontalAlign="Left" />
<ItemTemplate>
<asp:HyperLink ID="ProductSku" runat="server" Text='<%#Eval("Sku")%>' SkinID="FieldHeader" /><br />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Item" SortExpression="Name" >
<HeaderStyle HorizontalAlign="Left" />
<ItemTemplate>
<asp:HyperLink ID="ProductName" runat="server" Text='<%#Eval("Name")%>' SkinID="FieldHeader" /><br />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Assigned">
<ItemStyle Width="50px" HorizontalAlign="Center" />
<ItemTemplate>
<asp:ImageButton ID="AttachButton" runat="server" CommandArgument='<%#Container.DataItemIndex%>' AlternateText="Add" ToolTip="Add" SkinID="AddIcon" OnClientClick="this.visible=false" OnClick="AttachButton_Click" Visible='<%#!IsProductLinked((int)Eval("ProductId"))%>' />
<asp:ImageButton ID="RemoveButton" runat="server" CommandArgument='<%#Container.DataItemIndex%>' AlternateText="Remove" ToolTip="Remove" SkinID="DeleteIcon" OnClientClick="return confirm('Are you sure you want to remove this item from this option?')" OnClick="RemoveButton_Click" Visible='<%#IsProductLinked((int)Eval("ProductId"))%>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
There are no products that match the search text.
</EmptyDataTemplate>
</cb:SortedGridView>
这是代码:
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandType = CommandType.Text;
if (SearchName.Text != "")
{
try
{
cmd.CommandText = "SELECT ProductID, ISNULL(ThumbnailUrl, '') AS ThumbnailUrl, Name, Sku FROM ac_Products WHERE Name LIKE '%' + @Name + '%'";
cmd.Parameters.AddWithValue("@Name", SearchName.Text);
cn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
SearchResultsGrid.DataSource = dt;
SearchResultsGrid.DataBind();
SearchResultsGrid.Columns[0].Visible = ShowImages.Checked;
}
catch (Exception x)
{
Logger.Error(ErrLoc + " PopulateSearchGrid(): ", x);
errorLbl2.Text = "PopulateSearchGrid() Name Search Error: " + x.Message.ToString();
}
finally
{
cn.Close();
}
}
我不太清楚你说的"不显示"是什么意思。空值实际上不会显示任何内容。我怀疑这是否是SQL问题,因为您的语句看起来不错(除了我在底部写的关于参数化查询的内容)。我想这是一个有约束力的问题。您可以尝试以下操作之一:
- 尝试
ISNULL(ThumbnailUrl, '-') AS ThumbnailUrl
而不是ISNULL(ThumbnailUrl, '') AS ThumbnailUrl
,然后检查您现在是否看到-
- 如果这是一个Windows窗体应用程序,您可以尝试在设计器中将列添加到网格中,并将
AutoGenerateColumns
属性设置为false
。请注意,只能在代码中设置此属性,而不能在设计器中设置 - 如果这是WPF,请检查您是否真的有所需字段的列定义。也许您在绑定配置上有拼写错误?绑定名称区分大小写!如果从数据库返回
ThumbnailUrl
,则绑定ThumbNailUrl
将不起作用
附带说明:对尝试使用参数化查询表示赞许,但它认为您在这种情况下做得不对。应该是这样的:
cmd.CommandText = "SELECT ProductID, ISNULL(ThumbnailUrl, '') AS ThumbnailUrl, Name, Sku FROM ac_Products WHERE Name LIKE @Name";
cmd.Parameters.AddWithValue("@Name", String.Format("%{0}%", SearchName.Text));