SqlDataSource和存储过程调用问题

时间:2011-12-02 03:06:41

标签: asp.net sql stored-procedures

我偶然发现了一个问题,无法自己弄明白。希望有人能帮我解决它。

因此,我在SQL Server 2005数据库中有一个简单的存储过程

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

和一个在应用程序中具有SqlDataSourceGridView控件的asp.net页面(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" />

并且不指出 DefaultValue 值,重复这种情况并且不会调用存储过程。这种行为的原因是什么?

我是asp.net的新手并且可能忽略了一些东西,但我甚至尝试以编程方式而不是声明性地在代码隐藏文件中执行相同操作,结果是相同的。我唯一能发现的是,在这种情况下,Selecting的{​​{1}}事件被触发,但SqlDataSource却没有。也许发生了某种错误?

无论如何,我们将非常感谢任何形式的帮助。

2 个答案:

答案 0 :(得分:10)

SqlDataSource对象有一个名为CancelSelectOnNullParameter的属性。它的默认值是true,所以我认为你所看到的行为是预期的,尽管不是很明显。尝试将此属性设置为false

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

此外,您可能会发现ConvertEmptyStringToNullParameter类的QueryStringParameter属性(null扩展此属性)有一些用处,具体取决于您的存储过程处理器是否/如何处理{{1值。它的默认值也是true

答案 1 :(得分:0)

试试这个。

  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();
    }
    
  5. 如果发现它有用,请将其标记为您的答案,否则请告诉我......