首页 新闻 会员 周边

SqlDataSource中Parameter.DefaultValue如何才能成为Null

0
悬赏园豆:30 [已关闭问题] 关闭于 2008-09-03 11:03

<asp:DropDownList ID="DropDownList1" runat="server"
    DataSourceID="SqlDataSource1" DataTextField="RoleName" DataValueField="RoleKey">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
    ConnectionString="<%$ ConnectionStrings:LOADBConnectionString %>"
    SelectCommandType="StoredProcedure"
    SelectCommand="PR_GetRoles">
    <SelectParameters>
        <asp:Parameter Name="IsPublicReg" Type="Boolean" />
    </SelectParameters>
</asp:SqlDataSource>

 

PR_GetRoles是这样的:

ALTER PROCEDURE [dbo].[PR_GetRoles]
   
    (
    @IsPublicReg bit
    )
   
AS
    SELECT * FROM [RoleInfo]
    WHERE IsPublicReg=@IsPublicReg OR @IsPublicReg IS NULL

 

我希望的结果是,当不指定DefaultValue时,SqlDataSource传给PR_GetRoles的参数@IsPublicReg是NULL,得到所有结果;当指定IsPublicReg时,按其值得到数据。但实际情况是不指定DefaultValue得不到任何数据,指定则按其值得到结果。

 

如果不使用Parameter,即去除<asp:Parameter Name="IsPublicReg" Type="Boolean" />则能得到所有数据。

 

如果使用sql management studio执行此存储过程时传入空值,则能得到所有数据。(即,在sql management studio中测试正常)

 

不知道我能否表述清楚,如果您不明白我的意思请留言,我的疑点就在:当不指定Parameter.DefaultValue时应该传给PR_GetRoles的值应该为null,(MSDN上这么说的)怎么不是呢?非得删除此查询参数才传null。

 

(注1:有些地方说bit不能为null,我的测试结果是可以,sql2005.)

 

 

 

问题补充: 我猜测是当不指定DefaultValue时,它根本就不访问数据库。 --------------------------------------------------- 另外,把is null 改成is not null或者not is null 也得不到数据。 也就是说不指定DefaultValue时无论如何都得不到任何数据。 -------------------------------------------------- 问题终于完美解决! 解决的办法是如此的简单,我确花了这么多精力。 在.netframework源代码中一层一层的搜索,搞明白数据绑定控件怎么与数据源控件合作的。数据绑定控件通过datasourceID FindControl到datasource,然后得到DataSourceView,执行ExecuteSelect 返回 IEnumerable ,接下来就不说了。 那问题出在哪儿呢?显然是“得到DataSourceView,执行ExecuteSelect”sqldatasource的源代码中有这么一段 if (CancelSelectOnNullParameter) { int paramCount = command.Parameters.Count; for (int i = 0; i < paramCount; i++) { DbParameter parameter = command.Parameters[i]; if ((parameter != null) && (parameter.Value == null) && ((parameter.Direction == ParameterDirection.Input) || (parameter.Direction == ParameterDirection.InputOutput))) { return null; } } 原来我的猜测是对的,默认情况下,DefaultValue为null时,sqlDatasource并不访问数据库。但是会从缓存(此缓存并非SqlDataSource.EnableCaching说指的缓存)中获取数据,(已测试)。 到了这份上,解决问题的办法就清晰了,给Parameter加个属性CancelSelectOnNullParameter="false"就完美解决问题了。 我看了好几遍MSDN上sqlDatasource的属性列表,竟没注意到这个属性!!
奇军的主页 奇军 | 菜鸟二级 | 园豆:265
提问于:2008-09-02 20:55
< >
分享
所有回答(2)
0
如果显式的指定参数值为null呢?
丁学 | 园豆:18730 (专家六级) | 2008-09-02 21:09
0
没有做过试验,只能随便说说。你尝试给<asp:Parameter Name="IsPublicReg" Type="Boolean" /> 指定 DefaultValue="DBNull.Value"。 其实,我觉得更好的方法是约定。不妨 DefaultValue="-1",存贮过程改为“类似”如下: ALTER PROCEDURE [dbo].[PR_GetRoles](@IsPublicReg int) AS BEGIN IF ◎IsPublicReg == -1 BEGIN SELECT * FROM [RoleInfo] END ELSE BEGIN SELECT * FROM [RoleInfo] WHERE IsPublicReg=@IsPublicReg END END 这理解上也简单些,呵呵:)。
陛下 | 园豆:3938 (老鸟四级) | 2008-09-02 21:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册