麻烦传递参数到SQL查询OnSelecting事件

时间:2017-05-09 18:09:58

标签: c# asp.net datagridview devexpress

我对我继承的项目有疑问。它使用DevExpress,一些网格具有填充数据源的C#代码,而其他网格具有执行简单(ish)选择和更新查询的ASP代码。

其中一个网格显示的信息过多(选择的查询未正确编写),并且用户可用的选项太多。这将通过一个简单的where子句来修复,但我遗失了为什么我的实现不起作用。在页面上有三个使用相同技术的其他网格,但是当我尝试复制它时,它只是不起作用!

ASP:

<asp:SqlDataSource 
    ID="ds_Supplier" runat="server" 
    ConnectionString="<%$ ConnectionStrings:Portal_ConnectionString %>" 
    OldValuesParameterFormatString="original_{0}" 
    SelectCommand="SELECT [SupplierID], [SupplierName] FROM [tbl_Supplier] where BranchID = @BranchID" 
    OnSelecting="ds_Supplier_Selecting">
</asp:SqlDataSource>
<SelectParameters>
    <asp:Parameter DefaultValue="0" Name="BranchID" Type="Int32" />
</SelectParameters>

C#:

protected void ds_Supplier_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        e.Command.Parameters["@BranchID"].Value = GetBranchID();
    }

这会抛出下面的SQL错误:

An SqlParameter with ParameterName '@BranchID' is not contained by this SqlParameterCollection

令人困惑的是,直接在它上面以及它下面的网格遵循相同的逻辑并且没有麻烦地工作。我已经看到了其他类似的问题,但是那些倾向于通过C#代码填充数据源,而C#代码并不真正适用于这种情况。我错过了什么?

1 个答案:

答案 0 :(得分:0)

仍然没有反馈为什么上述方法在这个数据网格中对我不起作用而不是其他工作方式,我找到了解决方案:

protected void ds_Supplier_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    {
        System.Data.Common.DbParameter param = e.Command.CreateParameter();
        param.ParameterName = "@BranchID";
        param.Value = GetBranchID();
        e.Command.Parameters.Add(param);
    }

我使用了this question的答案但是我必须在System.Data.Common.对象引用之前添加DbParameter,因为我收到以下错误:

The type or namespace name could not be found (are you missing a using directive or an assembly reference?)

奇怪的是,Visual Studio识别了CreateParameter()函数,因此我尝试将System.Data.Common.添加到DbParameter并瞧!

The broken code