SqlDataSource и проблема вызова хранимой процедуры - PullRequest
4 голосов
/ 02 декабря 2011

Я наткнулся на проблему и не могу понять ее самостоятельно. Надеюсь, что кто-то может помочь мне решить эту проблему.

Итак, у меня есть простая хранимая процедура в базе данных SQL Server 2005

CREATE PROCEDURE spTest
  @pin varchar(128)
AS
BEGIN
  SELECT @Pin as Param
END

и страница asp.net с элементами управления SqlDataSource и GridView в приложении (VS2008)

<asp:SqlDataSource 
  ID="sds2" 
  runat="server" 
  ConnectionString="..."
  SelectCommand="spTest"      
  SelectCommandType="StoredProcedure"
  >
  <SelectParameters>
    <asp:QueryStringParameter Name="pin" QueryStringField="pin" DbType="String"/>
  </SelectParameters>
</asp:SqlDataSource>
<asp:GridView ID="gv" runat="server" DataSourceID="sds2"></asp:GridView>

Как видите, код прост. Тем не менее, если я не удосужился указать пин-код в URL (.../Default.aspx вместо .../Default.aspx?pin=somevalue) или указать пустую строку (.../Default.aspx?pin=), никакой хранимой процедуры не будет (я проверяю ее с помощью SQL Server Profiler).

Более того, если я заменю QueryStringParameter на простой

<asp:Parameter Name="pin" DbType="String" />

и не указывать Значение по умолчанию , ситуация повторяется и вызовы хранимой процедуры не выполняются. В чем причина такого поведения?

Я довольно новичок в asp.net и, возможно, что-то пропустил, но я даже попытался сделать то же самое в файле с выделенным кодом программно, а не декларативно, и результат тот же. Единственное, что я смог выяснить, это то, что в этом случае Selecting событие SqlDataSource запускается, а Selected - нет. Может быть, какая-то ошибка происходит?

В любом случае, любая помощь будет принята с благодарностью.

Ответы [ 2 ]

10 голосов
/ 02 декабря 2011

Объект SqlDataSource имеет свойство с именем <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.cancelselectonnullparameter.aspx" rel="noreferrer">CancelSelectOnNullParameter</a>. Его значение по умолчанию true, поэтому я думаю, что поведение, которое вы видите, ожидаемое, хотя и не очевидное. Попробуйте установить для этого свойства значение false.

<asp:SqlDataSource 
  ID="sds2" 
  runat="server" 
  ConnectionString="..."
  SelectCommand="spTest"      
  SelectCommandType="StoredProcedure"
  CancelSelectOnNullParameter="false"
  >

Кроме того, вы можете найти свойство <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.parameter.convertemptystringtonull.aspx" rel="noreferrer">ConvertEmptyStringToNull</a> класса Parameter (расширение QueryStringParameter) полезным для использования, в зависимости от того, обрабатывает ли ваш хранимый процесс значения null. Его значение по умолчанию равно true.

0 голосов
/ 02 декабря 2011

Попробуйте это.

  1. Создайте метод, который будет возвращать значение db null, если параметр не передан в хранимой процедуре

    public static object GetDataValue(object o)
        {
            if (o == null || String.Empty.Equals(o))
                return DBNull.Value;
            else
                return o;
        }
    
  2. Создайте метод, который будет вызывать хранимую процедуру, и заполните набор данных.

    public DataSet GetspTest (string pin) {

        try
        {
            DataSet oDS = new DataSet();
            SqlParameter[] oParam = new SqlParameter[1];
    
    
            oParam[0] = new SqlParameter("@Pin", GetDataValue(pin));
    
            oDS = SqlHelper.ExecuteDataset(DataConnectionString, CommandType.StoredProcedure, "spTest", oParam);
            return oDS;
        }
        catch (Exception e)
        {
            ErrorMessage = e.Message;
            return null;
        }
    }
    
  3. Теперь привяжите набор данных к gridview

    private void GvTest()
    {
        DataSet oDsGvspTest = new DataSet();
                string pin = Request.QueryString["Pin"];
            oDsGvspTest = GetspTest(pin);
                if (oDsGvspTest.Tables[0].Rows.Count > 0)
                {
                    Gv.DataSource = oDsGvspTest;
                    Gv.DataBind();
    
                }
    
    }
    
  4. Теперь вызывается этот метод в событии page_load

    if(!IsPostBack)
    {   
    GvTest();
    }
    

Если он окажется полезным, отметьте его как свой ответ, иначе пустья знаю ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...