private void SaveData()
{
try
{
System.Collections.Hashtable Para = new System.Collections.Hashtable();
DataTable tb1 = dgvGrid1.GetCommitTable().Copy();
// 添加 is_delete 列用于标识删除行(如果尚未存在)
if (!tb1.Columns.Contains("is_delete"))
{
tb1.Columns.Add("is_delete", typeof(bool), "false");
}
dgvGrid1.DataSource = tb1;
DataTable changes = tb1.GetChanges();
if (changes != null && changes.Rows.Count > 0)
{
// 提取删除行
DataRow[] deleteRows = changes.Select("is_delete = true");
DataTable tbDelete = deleteRows.Length > 0 ? deleteRows.CopyToDataTable() : new DataTable();
MessageBox.Show("tbDelete 中将删除记录数:" + tbDelete.Rows.Count);
// 提取非删除行
DataRow[] updateRows = changes.Select("is_delete = false OR is_delete IS NULL");
DataTable tbUpdate = updateRows.Length > 0 ? updateRows.CopyToDataTable() : new DataTable();
// 传入参数时确保不是 null
Para.Add("@user_name1", PettyCashBasic.Classes.PettyCashLogin.UserName);
Para.Add("@tb1", PettyCashBasic.Classes.PettyCashConnection.GetTable101(tbUpdate));
Para.Add("@tbDelete", PettyCashBasic.Classes.PettyCashConnection.GetTable101(tbDelete));
if (PettyCashBasic.Classes.PettyCashConnection.DataUpdate("p_user_mapping_sav", Para))
{
tb1.AcceptChanges();
GetGridData();
MessageBox.Show("保存结束。");
}
}
else
{
MessageBox.Show("没有需要保存的变更。");
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void DeleteSelectedRows()
{
if (dgvGrid1.DataSource is DataTable tb1)
{
foreach (DataGridViewRow row in dgvGrid1.SelectedRows)
{
if (!row.IsNewRow)
{
// 设置 is_delete 为 true
tb1.Rows[row.Index]["is_delete"] = true;
}
}
}
}
USE [pettycash]
GO
/****** Object: StoredProcedure [dbo].[p_user_mapping_sav] Script Date: 2025/8/20 8:05:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[p_user_mapping_sav]
(
@user_name1 nvarchar(50) = '' ,
@tb1 diytbl readonly ,
@tbDelete diytbl readonly -- 新增参数
)
AS
BEGIN
-- 临时表 --
select
ISNULL(f0, '') guid_id , -- sys_guid --
ISNULL(f1, '') soft_name , -- 软件名称 --
ISNULL(f2, '') host_user , -- 主机名 --
ISNULL(f3, '') card_name , -- 用户名 --
ISNULL(f4, '') user_name , -- 用户姓名 --
ISNULL(f5, '') version_id , -- 版本号 --
case
--when ISNULL(f6, '') = ''then convert(nvarchar(50), getdate(), 120) -- 格式:2025-08-19 08:43:56
when ISNULL(f6, '') = ''then convert(nvarchar(50), getdate(), 112) -- 启用日期 格式:20250819 --
else ISNULL(f6, '')
end as begin_date ,
case
when ISNULL(f7, '') = ''then '20991231' -- 停用日期 --
else ISNULL(f7, '')
end as end_date ,
ISNULL(f8, '') rem_01 , -- 备注01 --
ISNULL(f9, '') rem_02 , -- 备注02 --
ISNULL(f10, '') rem_03 , -- 备注03 --
GETDATE() ins_time , -- 录入时间 --
@user_name1 ins_user , -- 录入人 --
GETDATE() upd_time , -- 更新时间 --
@user_name1 upd_user , -- 更新人 --
ISNULL(f11, '') is_delete -- 删除标识 --
into #TT
from @tb1
-- 处理删除逻辑 --
if exists (select 1 from @tbDelete)
begin
delete u
from user_mapping u
inner join @tbDelete d on u.guid_id = d.f0
where d.f0 is not null and d.f0 <> ''
end
-- 数据验证 --
if exists(
select 1 from #TT
where soft_name <> ''
and host_user <> ''
and card_name <> ''
and user_name <> ''
)
begin
-- 插入新纪录 --
insert into user_mapping
(
soft_name ,
host_user ,
card_name ,
user_name ,
version_id ,
begin_date ,
end_date ,
rem_01 ,
rem_02 ,
rem_03 ,
ins_time ,
ins_user ,
upd_time ,
upd_user
)
select
T.soft_name ,
T.host_user ,
T.card_name ,
T.user_name ,
T.version_id ,
T.begin_date ,
T.end_date ,
T.rem_01 ,
T.rem_02 ,
T.rem_03 ,
T.ins_time ,
T.ins_user ,
T.upd_time ,
T.upd_user
from #TT T
left join user_mapping u on u.guid_id = T.guid_id
where u.guid_id is null or T.guid_id = ''
-- 更新记录 --
update u
set
soft_name = T.soft_name ,
host_user = T.host_user ,
card_name = T.card_name ,
user_name = T.user_name ,
version_id = T.version_id ,
begin_date = T.begin_date ,
end_date = T.end_date ,
rem_01 = T.rem_01 ,
rem_02 = T.rem_02 ,
rem_03 = T.rem_03 ,
upd_time = T.upd_time ,
upd_user = T.upd_user
from #TT T
inner join user_mapping u on u.guid_id = T.guid_id
end
drop table #TT
END
删除后保存时提示“tbDelete 中将删除记录数:0”,user_mapping表中is_delete列bit类型默认值为0,不要添加删除点击事件