Пропустить установку значения параметра sql в SqlDataSource в WebForm

Я создаю веб-форму в asp.net и хочу отображать gridview с данными из asp:SqlDataSource
Моя проблема возникает, когда я пытаюсь пропустить (передать null) значения для некоторых параметров.

Вот некоторые фрагменты моего кода

В файле aspx sqldatasource выглядит так

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 
        SelectCommand="art_bat_art" SelectCommandType="StoredProcedure">
        <SelectParameters>
            <asp:Parameter Name="art_naz" DefaultValue="HLA"  ConvertEmptyStringToNull="true" Type="String" />
            <asp:Parameter Name="art_sifra"     DbType="String"  Direction="Input"/>
            <asp:Parameter Name="vrsta_id" DefaultValue="3"   ConvertEmptyStringToNull="true" Type="Int32" />     
            <asp:Parameter Name="podvrsta_id" DefaultValue="13"   ConvertEmptyStringToNull="true" 
                Type="Int32"  />
            <asp:Parameter Name="podgrupa2"  DefaultValue="1365"   ConvertEmptyStringToNull="true" Type="Int32"      /> 
            <asp:Parameter Name="podosobine"   DefaultValue="1:9241"  ConvertEmptyStringToNull="true" 
                Type="String"  />
            <asp:Parameter Name="podosobineOR" DefaultValue="true"   ConvertEmptyStringToNull="true" 
                Type="Boolean"  />
        </SelectParameters>

Моя сетка выглядит так:

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="id" DataSourceID="SqlDataSource1">

И проблемы возникают в коде. Один из параметров моей хранимой процедуры является необязательным. Если я передам его как null в SQL, хранимая процедура все равно будет выполняться.

Я пытаюсь пропустить и передать этот параметр следующим образом

public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {


        }
        protected void Button1_Click1(object sender, EventArgs e)
        {
            SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = DBNull.Value; //Cannot implicitly convert type 
            SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = System.Data.SqlTypes.SqlString.Null;   //Cannot implicitly convert type 
            SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = System.Data.SqlTypes.SqlString.Null.ToString();   //IT compiles but i get NULL as text in SQL
            //IF I Just skip seting of this parametar, My SqlDataSource won't call stored proce 
            SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = string.Empty; //Again no execution of stored proce
            //Even if I call SqlDataSource1.DataBind(); //nothing cames to sql 
            GridView1.DataBind();
        }
    }

person adopilot    schedule 24.03.2011    source источник


Ответы (2)


Вам придется отредактировать свой SQL (или сохраненный процесс), чтобы иметь возможность обрабатывать необязательный параметр.

то есть: если у вас есть:
SELECT blah FROM yourTable WHERE art_sifra = @art_sifra

измените его на:
SELECT blah FROM yourTable WHERE (art_sifra = @art_sifra OR @art_sifra = '')

а затем просто измените ConvertEmptyStringToNull="false" и установите для параметра выбора значение "": SqlDataSource1.SelectParameters["art_sifra"].DefaultValue = "";

Также необходимо установить CancelSelectOnNullParameter="false" в вашем источнике данных.

person JumpingJezza    schedule 08.09.2011

DBNull.Value; //Cannot implicitly convert type 

Вы пробовали его лить? Например.

DBNull.Value.Tostring()
person openshac    schedule 24.03.2011
comment
SqlDataSource1.SelectParameters[art_sifra].DefaultValue = DBNull.Value.ToString(); Никогда не вызывайте хранимую процедуру. Я не получаю никакой ошибки, но я также не получаю никаких данных - person adopilot; 24.03.2011
comment
@adopilot: Вы хотите опубликовать свою хранимую процедуру, чтобы мы могли проверить, правильно ли обрабатываются параметры NULL? - person openshac; 24.03.2011