SqlDataSource和存储过程调用问题

nbu*_*lba 4 sql asp.net stored-procedures

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

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

CREATE PROCEDURE spTest
  @pin varchar(128)
AS
BEGIN
  SELECT @Pin as Param
END
Run Code Online (Sandbox Code Playgroud)

和一个带有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>
Run Code Online (Sandbox Code Playgroud)

如您所见,代码很简单.不过,如果我不打扰在url上指定pin(.../Default.aspx而不是.../Default.aspx?pin=somevalue)或指定一个空行(.../Default.aspx?pin=),则不会对存储过程进行任何调用(我使用SQL Server Profiler进行检查).

而且,如果我用QueryStringParameter简单的替换

<asp:Parameter Name="pin" DbType="String" />
Run Code Online (Sandbox Code Playgroud)

并且不指出DefaultValue值,重复该情况并且不对存储过程进行任何调用.这种行为的原因是什么?

我是asp.net的新手,可能会忽略一些东西,但我甚至尝试以编程方式而不是声明性地在代码隐藏文件中执行相同操作,结果是相同的.我唯一能发现的是,在这种情况下,一个Selecting事件SqlDataSource被触发,但事实Selected并非如此.也许会出现某种错误?

无论如何,任何形式的帮助将不胜感激.

Jer*_*ins 10

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

<asp:SqlDataSource 
  ID="sds2" 
  runat="server" 
  ConnectionString="..."
  SelectCommand="spTest"      
  SelectCommandType="StoredProcedure"
  CancelSelectOnNullParameter="false"
  >
Run Code Online (Sandbox Code Playgroud)

此外,您可能会发现类的ConvertEmptyStringToNull属性Parameter(QueryStringParameter扩展此属性)具有一定的用途,具体取决于存储的proc是否处理null值.它的默认值也是true如此.