使用GridView更新Access数据库(.mdb),其中ID列不可见

时间:2017-11-16 19:47:29

标签: c# asp.net visual-studio ms-access gridview

我想读取并存储从GridView中选择的相应行的DataKeyNames值,以便我可以将该值作为条件传递给我的UPDATE查询。

我有一个GridView,我在其中显示以下内容:

        string bob;
        bob = malloc(SIZE);//how much memory you want , mention in SIZE variable.
        printf("enter the string\n");
        scanf("%s",bob);
        printf("%s\n", bob);

我的数据库有一个ID字段,我没有在GridView上显示。

当我点击按钮时,我应该能够在GridView中更新所选行; UPDATE SQL命令的WHERE子句必须是所选行的ID。此ID存储在数据库中,在GridView中不可见。因此,必须从数据库中读取相应的ID值。

我的按钮点击事件如下:

<asp:GridView ID="GridViewSavingsTracker" AutoGenerateColumns="false" 
runat="server" DataKeyNames="ID" 
OnRowCommand="GridViewSavingsTracker_RowCommand">
    <Columns>
        <asp:CommandField ShowSelectButton="true" />
        <asp:BoundField DataField="creditorName" HeaderText="Creditor Name" />
        <asp:BoundField DataField="amount" HeaderText="Principal Amount" />
        <asp:BoundField DataField="interestRate" HeaderText="Interest Rate" />
        <asp:BoundField DataField="interestType" HeaderText="Interest Type" />
        <asp:BoundField DataField="interestCalculationMethod" HeaderText="Interest Calculation Method" />
    </Columns>
</asp:GridView>

我使用RowCommand填充TextBoxes,我按以下方式读取rowID:

protected void ButtonUpdate_Click(object sender, EventArgs e)
    {
        con.Open();
        string updateCommand = "UPDATE table_name SET employeeName = '" +TextBoxEmployeeName.Text+"' WHERE ID=...<The ID value that will be read from the Database has to come here>...";
        OleDBCommand updateCommand = new OleDBCommand(updateQuery,con);
        updateCommand.ExecuteNonQuery();
        con.Close();
        ShowGrid();    // Method to populate and display the GridView on the screen. 
    }

简而言之,当在GridView中选择特定行时,我需要从MS Access数据库中读取ID值(其中ID是我的数据库中的列,每个元组具有唯一的ID值)。当我点击&#34;更新&#34;网页上的按钮。一旦我能够做到这一点,那么我将能够将该值放在代码中的SQL命令中并进行更新。

我正在努力做大卫在答案中提到的:

https://stackoverflow.com/a/19824029/8930129

但&#34; row&#34;得到一个空值,因为我得到一个System.NullReferenceException。

protected void GridViewSavingsTracker_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Select")
        {
            int rowID = Convert.ToInt32(e.CommandArgument);
        }
    }

2 个答案:

答案 0 :(得分:0)

我不确定你是否正确地采取了正确的方式。您想使用gridview行号来查找数据库ID,以便您可以使用该数据库ID更新数据库中的行吗?

您应该能够将ID存储为GridView的一部分,即使您没有显示它们。

查看GridView的DataKeyNames属性。它允许您指定对象的主键字段。

然后你可以访问回发事件的ID,看看这个例子:

答案 1 :(得分:0)

我能够通过以下方式使其发挥作用:

string updateQuery = "UPDATE " + table_name + " SET creditorName = ?, amount = ?, interestRate = ?, ... WHERE savingsID = ?";
                    using (OleDbConnection con = new OleDbConnection(connectionString))
{
    con.Open();
    using (OleDbCommand updateCommand = new OleDbCommand(updateQuery, con))
    {
        updateCommand.CommandType = CommandType.Text;
        updateCommand.Parameters.AddWithValue("creditorName", TextBoxCreditorName.Text);
        updateCommand.Parameters.AddWithValue("amount", TextBoxPrincipalAmount.Text);
        updateCommand.Parameters.AddWithValue("interestRate", TextBoxInterestRate.Text);
        updateCommand.Parameters.AddWithValue("savingsID", tupleID);

        updateCommand.ExecuteNonQuery();
        con.Close();
    }
}

我以下列方式获得tupleID的值:

int tupleID = Convert.ToInt32(GridView1.DataKeys[rowIndex].Values[0]);

来源:来自@ Matt-9000和https://www.mikesdotnetting.com/article/26/parameter-queries-in-asp-net-with-ms-access

的评论