从 C# 将数据表发送到存储过程

本文关键字:存储过程 数据表 | 更新日期: 2023-09-27 18:35:34

需要有关DatagridView和DataTable的帮助。

  • 基本上我有一个DatagridViewOnLoad填充SQL Server中表中的数据
  • 当我单击UI上的按钮时,此DataGridView会在网格"更新"的前面添加一个新列,这是一个复选框列
  • 现在,当用户勾选所有需要更新的行并单击"更新"时...
  • 我想更新所有被勾选的行(例如:我希望将这些行的所有者从人员 A 设置为人员 B)
  • 我看过DataTable但我很困惑

我的逻辑是将所有选定的列添加到DataTable并将其发送到 SQL Server 中的存储过程,该过程将更新值。

如果我没记错的话,我将向存储过程发送一个DataTable,后面只有一个ID列,后跟From&To(所有者)。

如果我错了,请指导我,任何帮助将不胜感激。

从 C# 将数据表发送到存储过程

private DataTable getDataGridID()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ID");
    foreach (DataGridViewRow row in dgTeamDashboard.Rows)
    {
        if (Convert.ToBoolean(row.Cells["Update"].Value) == true)
        dt.Rows.Add(row.Cells["ID"].Value);
    }
    return dt;
}

现在已经进展到这一点,我有一个数据表,其中包含所有那些更新列被勾选的 ID。

我满怀希望,我正朝着正确的方向前进。如果我不是,请发表评论

进一步更新:

我现在创建了一个存储过程,它接受 UserDefinedTableType 和 destinationOwnerID 作为参数,并使用提供的 OwnerID 更新实际表,用于 ID 与 DataTable 中的记录匹配的所有潜在客户。

Create Procedure [activity].[udpUpdateActivityLead]
@ActivityLeadTable  ActivityLeadType READONLY,
@OwnerTo            int
AS
BEGIN
  UPDATE [activity].[tblActivity] 
  set [activity].[tblActivity].[IDOwner]= @OwnerTo
  from @ActivityLeadTable
  where [activity].[tblActivity].[ID]=[@ActivityLeadTable].[ID];
  END

最后,我在UI中获得了这个功能,它的工作方式类似于GEM。大团圆。。。我现在可以睡觉了...

public void updateActivityLead()
        {
            SqlConnection con = new SqlConnection(OpSupLib.MyConnectionString);
            SqlCommand cmd = new SqlCommand();
            if (con.State == System.Data.ConnectionState.Closed)
                con.Open();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "[activity].[udpUpdateActivityLead]";
            SqlParameter p1 = new SqlParameter();
            p1.ParameterName = "@ActivityLeadTable";
            p1.Value = getDataGridID();
            cmd.Parameters.Add(p1);
            SqlParameter p2 = new SqlParameter();
            p2.ParameterName = "@OwnerTo";
            p2.Value = ((ComboBoxItem)cmbUpdateTo.SelectedItem).HiddenValue;
            cmd.Parameters.Add(p2);
            cmd.Connection = con;
            cmd.ExecuteNonQuery();
            if (con.State == System.Data.ConnectionState.Open)
                con.Close();
        }

您的逻辑是正确的,您可以使用数据表将所选行的 ID 和新所有者发送到存储过程。以下是分步指南:

将复选框列添加到数据网格视图。这将允许用户选择要更新的行。可以在填充 DataGridView 时添加此列,也可以稍后在按钮单击事件中添加此列。下面是如何执行此操作的示例:

DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.HeaderText = "Update";
checkBoxColumn.Name = "checkBoxColumn";
dataGridView1.Columns.Insert(0, checkBoxColumn);

创建一个数据表,并将选定的行添加到其中。当用户单击"更新"按钮时,您可以循环访问 DataGridView 的行,检查是否选中了复选框,如果是,则将 ID 和新所有者添加到数据表。下面是一个示例:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Owner", typeof(string));
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (Convert.ToBoolean(row.Cells["checkBoxColumn"].Value))
    {
        dt.Rows.Add(row.Cells["ID"].Value, "New Owner");
    }
}

将"ID"替换为 ID 列的实际名称,并将"新所有者"替换为要为所选行设置的新所有者。

将数据表传递给存储过程。可以使用表值参数将数据表传递给 SQL Server 中的存储过程,如上一个答案中所述。下面是一个示例:

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("UpdateOwner", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter param = cmd.Parameters.AddWithValue("@data", dt);
        param.SqlDbType = SqlDbType.Structured;
        param.TypeName = "dbo.MyTableType";
        cmd.ExecuteNonQuery();
    }
}

在此示例中,"UpdateOwner"是存储过程的名称,"dbo.MyTableType"是您在 SQL Server 中定义的表类型,其列与数据表的结构匹配。

更新 SQL Server 中的行。存储过程可以使用表值参数来更新表中的行。下面是如何执行此操作的示例:

CREATE PROCEDURE UpdateOwner
    @data dbo.MyTableType READONLY
AS
BEGIN
    UPDATE MyTable
    SET Owner = newData.Owner
    FROM MyTable
    JOIN @data newData ON MyTable.ID = newData.ID;
END
In this example, "MyTable" is the name of your table, and "dbo.MyTableType" is the table type that matches the structure of your DataTable. Replace these with your actual table and type names.

请记住将上述示例中的占位符替换为项目中的实际名称。