【问题标题】:Declaring a Scalar Variable when using SQLDataSouce使用 SQLDataSource 时声明标量变量
【发布时间】:2014-07-18 02:55:43
【问题描述】:

我的应用程序包含一个 GridView,它允许用户通过 SqlDataSource 控件编辑、更新和插入与汽车零件相关的数据。当用户输入零件时,该零件可供所有用户查看,我只希望用户看到他或她输入的汽车零件。

该应用程序可通过登录页面访问,该页面捕获每个用户的 company_guid 并将其存储在会话中,用户的 company_guid 也与提交的零件信息一起被捕获/插入到数据库表中:

…背后的代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  'initialized companyGuid to the session variable, which is captured/stored via the log-in pg
        If Not Page.IsPostBack Then
            companyGuid = Session("numrecord").ToString
        Else
            companyGuid = Session("numrecord").ToString
        End If
    End Sub

...我的 SqlDataSource 是这样设置的:

   <asp:SqlDataSource OnInserting="On_Inserting" 
    ID="SqlDataSource1" 
    ConnectionString="<%$ ConnectionStrings:ShipperNotificationConnectionString %>" 
    SelectCommand="SELECT * FROM [Part] WHERE Company_guid=@companyguid "
    UpdateCommand="UPDATE Part SET Part_Name=@Part_Name,
    Part_Desc=@Part_Desc, Active=@Active, UpdateDate=@UpdateDate, UpdateBy=@UpdateBy  
    WHERE Part_ID=@Part_ID" 
    InsertCommand="INSERT Part (Company_guid,Part_Name,Part_Desc,Active,UpdateDate,UpdateBy)
            VALUES (@companyguid,@Part_Name,@Part_Desc,@Active,@UpdateDate,@UpdateBy)"          
   runat="server">

   <SelectParameters>
        <asp:SessionParameter Name="companyguid" SessionField="companyguid" Type="String" />
   </SelectParameters>

   <InsertParameters>
   <asp:SessionParameter Name="companyguid" SessionField="companyguid" Type="String" />
</InsertParameters>
   </asp:SqlDataSource>

...后面的代码 - 事件处理程序:

Protected Sub On_selectedIndex(ByVal sender As [Object], ByVal e As SqlDataSourceCommandEventArgs)
        e.Command.Parameters("@companyguid").Value = Session("numrecord").ToString
    End Sub

...这是 SQL 测试查询:

SELECT * 
FROM Part
WHERE company_guid = '19595A5C-98B9-4F5E-84F9-0000000'

...如何在我的 SqlDataSource 中设置 select 语句,以便用户只能看到他或她输入的部分?在 SqlDataSource - SelectCommand 中,我尝试了以下操作:

SelectCommand="SELECT * FROM [Part] WHERE company_guid = @company_guid"

...并收到错误 - 必须声明标量变量“@company_guid”。 我能得到一些指导吗?

【问题讨论】:

  • SqlDatasource 糟透了。不是为更复杂的事情而设计的。您需要在 Select 命令中添加参数。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: asp.net sql-server vb.net


【解决方案1】:

您已将SelectParamters 设置为如下所示,它采用名为companyguid 的会话字段,我在您的代码中没有找到它,而是将其声明为@companyguid

<SelectParameters>
    <asp:SessionParameter Name="companyguid" SessionField="companyguid" Type="String" />
</SelectParameters>

请更改您的PageLoad,如下所示

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Session("companyguid") = Session("numrecord").ToString
End Sub

或者改变你选择的参数直接使用SessionField="numrecord"。

最好为&lt;asp:SessionParameter 设置DefaultValue="your default company gui id",这样如果由于某种原因未设置会话值,它就会使用默认数据填充gridview。你的 SessionParameter 变成了

<asp:SessionParameter Name="companyguid" SessionField="companyguid" DefaultValue="19595A5C-98B9-4F5E-84F9-0000000"/>

【讨论】:

    【解决方案2】:

    如果您在 SELECT 查询中指定占位符 @company_guid,则需要创建相关的 SelectParameter,如 here 所述。 根据您可以从哪里获取值,您必须使用正确类型的参数。

    由于您正在使用会话,您可以尝试SessionParameter。

    Here is the complete list of Parameter可以申请的类型。

    【讨论】:

    • Attn Alpi Alessandro ...感谢来源,我向 SqlDataSource 控件添加了一个 SelectParameters 以及一个事件处理程序以将 @companyguid 初始化为会话变量(请参阅上面的编辑),我得到了虽然是一个空白网格。关于我做错了什么有任何进一步的建议吗?再次感谢
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2018-04-19
    相关资源
    最近更新 更多