C# - 在SQL SELECT上将null设置为空字符串?

时间:2014-02-17 14:56:27

标签: c# asp.net sql select null

当我从数据库中选择项目时,我想用空字符串替换字段的任何空值。目前,我在SQL Management Studio中的工作正常,但是当我将它放在我的C#代码的SELECT语句中时,如果值为null则我想要为空的列不显示。我没有看到任何错误消息显示。

我还在学习SQL,所以我不确定如何修复查询,以便在gridview中的浏览器中显示所有3列,无论ThumbnailUrl字段是否为null。

任何帮助表示赞赏!谢谢!

设计师中的Gridview代码:

 <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();
        }
    }

1 个答案:

答案 0 :(得分:1)

我不太确定你的意思是“不显示”。空值实际上不显示任何内容。我怀疑这是一个SQL问题,因为你的语句看起来很好(除了我在底部写的有关参数化查询的内容)。我想这是一个有约束力的问题。您可以尝试以下方法之一:

  1. 而不是ISNULL(ThumbnailUrl, '') AS ThumbnailUrl尝试ISNULL(ThumbnailUrl, '-') AS ThumbnailUrl并检查您是否现在看到-
  2. 如果这是Windows窗体应用程序,您可以尝试将列添加到设计器中的网格,并将AutoGenerateColumns属性设置为false。请注意,您只能在代码中设置此属性,而不能在设计器中设置。
  3. 如果这是WPF,请检查您是否确实具有必填字段的列定义。也许你的绑定配置有拼写错误?绑定名称区分大小写!如果从数据库返回ThumbnailUrl,则绑定ThumbNailUrl将不起作用。
  4. 作为旁注:试图使用参数化查询竖起大拇指,但在这种情况下它并不认为你做得对。它应该是这样的:

    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));