1

底部的解决方案。

尝试更新记录时收到以下错误:

必须声明标量变量@PaymentTermID

问题是,@PaymentTermID应该已经在更新参数中定义了。onrowdatabound和的 2 个函数onrowupdate是此处为 DropDownList: GridViewRow.DataItem 属性找到的函数的调整版本。删除工作正常。

没有添加新行,只是更改了名称。任何帮助将不胜感激,我并不完全习惯于使用 asp 对象。

<asp:GridView ID="GridView1" onrowdatabound="GridView1_RowDataBound" onrowupdating="GridView1_RowUpdating" runat="server" AutoGenerateColumns="False"   DataKeyNames="PaymentTermID" DataSourceID="SqlDataSource1" CellPadding="1"  CellSpacing="2">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:TemplateField HeaderText="Key Contract Date" SortExpression="Key Contract Date">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" DataTextField="Key_Contract_Date" DataValueField="Key_Contract_Date" />
                <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:Production_DatabaseConnectionString %>" 
                            SelectCommand="SELECT DISTINCT [Key Contract Date] AS Key_Contract_Date FROM [tblPRJ_PaymentTerms]" />
            </EditItemTemplate>
            <ItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("[Key Contract Date]") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Due Date" HeaderText="Due Date" SortExpression="Due Date" />
        <asp:BoundField DataField="Percent Due" HeaderText="Percent Due" SortExpression="Percent Due" />
        <asp:BoundField DataField="Custom Description" HeaderText="Custom Description" SortExpression="Custom Description" />
    </Columns>
    <HeaderStyle Font-Bold="True" ForeColor="#666666" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Production_DatabaseConnectionString %>" 
        SelectCommand="SELECT * FROM [tblPRJ_PaymentTerms] WHERE ([Job Number] = @Job_Number)" 
        DeleteCommand="DELETE FROM [tblPRJ_PaymentTerms] WHERE [PaymentTermID] = @PaymentTermID" 
        InsertCommand="INSERT INTO [tblPRJ_PaymentTerms] ([Job Number], [Key Contract Date], [Due Date], [Percent Due], [Custom Description]) VALUES (@Job_Number, @Key_Contract_Date, @Due_Date, @Percent_Due, @Custom_Description)" 
        UpdateCommand="UPDATE [tblPRJ_PaymentTerms] SET [Job Number] = @Job_Number, [Key Contract Date] = @Key_Contract_Date, [Due Date] = @Due_Date, [Percent Due] = @Percent_Due, [Custom Description] = @Custom_Description WHERE [PaymentTermID] = @PaymentTermID"> 
    <DeleteParameters>
        <asp:Parameter Name="PaymentTermID" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="Job_Number" Type="String" />
        <asp:Parameter Name="Key_Contract_Date" Type="String" />
        <asp:Parameter Name="Due_Date" Type="DateTime" />
        <asp:Parameter Name="Percent_Due" Type="Decimal" />
        <asp:Parameter Name="Custom_Description" Type="String" />
    </InsertParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="txtCurrentJobNumber" Name="Job_Number" PropertyName="Text" Type="String" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="Job_Number" Type="String" />
        <asp:Parameter Name="Key_Contract_Date" Type="String" />
        <asp:Parameter Name="Due_Date" Type="DateTime" />
        <asp:Parameter Name="Percent_Due" Type="Decimal" />
        <asp:Parameter Name="Custom_Description" Type="String" />
        <asp:Parameter Name="PaymentTermID" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>

解决方案:这里发生了多个问题。首先,GuthMD 对需要参考的参数的评估是正确的,无论是绑定域、模板域还是其他源(例如控制参数中的控件)。只需为 PaymentTermID 创建一个asp:boundfield并将Visible属性设置为 false 即可解决我发布的问题。

另一个问题是数据库设置不当,列名中有空格。OLEDB 驱动程序不喜欢这样,当您尝试写回数据库并且列名中有空格时会导致错误(即使它包含在括号 [] 中)。在 SQL 中修复名称之后,重新访问我们的代码并为其重写大部分 SQL 代码,事情开始按预期运行。

再次感谢您的帮助。

4

2 回答 2

1

我一直在查看有关 Using Parameters 的 MSDN 文档,似乎要在 theGridView和 your之间创建绑定SqlDataSource,您GridView将需要具有BoundField与元素相对应的Parameter元素。

将以下内容添加到<Columns>您的GridView:

<asp:BoundField DataField="Job_Number" Visible="false" />
<asp:BoundField DataField="Key_Contract_Date" Visible="false" />
<asp:BoundField DataField="Due_Date" Visible="false" />
<asp:BoundField DataField="Percent_Due" Visible="false" />
<asp:BoundField DataField="Custom_Description" Visible="false" />
<asp:BoundField DataField="PaymentTermID" Visible="false" />
于 2012-05-16T17:19:16.010 回答
0

1-当数据源是 OleDb 而不是 SQLclient 时会出现问题。将 DataSource1 更改为:

providerName="System.Data.SqlClient"

2-确保网格定义中的有效绑定字段 DataKeyNames="id_field"

于 2017-05-27T10:00:11.833 回答