将两表JOIN关联数据存入临时表执行CRUD及DateTime转换问题咨询
问题解决
1. DateTime字段转换报错修复
你遇到的报错大概率是两个原因:一是VaccinationDate字段存在NULL值,直接调用ToString会抛出空引用异常;二是你的查询语句中同时查询了p.CNIC和pv.cnic两个同名字段,取数时可能列索引错位导致类型匹配失败。
修复代码如下:
// 先给查询字段加别名避免重名冲突,修改你的query为: string query = "select p.CNIC, p.Name, pv.VaccinationName, pv.VaccinationDate, pv.CenterAddress from Patient as p join PatientVaccines as pv on p.CNIC = pv.cnic"; // 赋值时增加空值判断 if (!dr.IsNull("VaccinationDate")) { dmod.VaccinationDate = Convert.ToDateTime(dr["VaccinationDate"]).ToString("yyyy-MM-dd HH:mm:ss"); } else { dmod.VaccinationDate = string.Empty; // 也可替换为你需要的默认值 }
2. 支持源表同步CRUD的临时表实现方案
SQL Server的临时表本身不具备自动同步源表的能力,你需要配合触发器或者C#端的自定义CRUD逻辑实现双向同步,两种可行方案如下:
方案1:SQL侧创建带触发器的临时表
- 第一步:创建会话/全局临时表并导入关联数据
-- #开头为会话临时表,仅当前数据库连接可见;##开头为全局临时表,所有连接可见 CREATE TABLE #PatientVaccineTemp ( CNIC VARCHAR(20) PRIMARY KEY, Name NVARCHAR(50) NOT NULL, VaccinationName NVARCHAR(100) NOT NULL, VaccinationDate DATETIME NULL, CenterAddress NVARCHAR(200) NULL ) -- 写入两张源表的关联数据 INSERT INTO #PatientVaccineTemp SELECT p.CNIC, p.Name, pv.VaccinationName, pv.VaccinationDate, pv.CenterAddress FROM Patient as p JOIN PatientVaccines as pv ON p.CNIC = pv.cnic
- 第二步:给临时表创建触发器,操作临时表时自动同步源表,以更新触发器为例:
CREATE TRIGGER trg_TempUpdateSync ON #PatientVaccineTemp AFTER UPDATE AS BEGIN -- 同步更新Patient表 UPDATE Patient SET Name = i.Name FROM Patient p JOIN inserted i ON p.CNIC = i.CNIC -- 同步更新PatientVaccines表 UPDATE PatientVaccines SET VaccinationName = i.VaccinationName, VaccinationDate = i.VaccinationDate, CenterAddress = i.CenterAddress FROM PatientVaccines pv JOIN inserted i ON pv.cnic = i.CNIC END
按照相同逻辑编写INSERT、DELETE触发器即可实现全操作同步。
方案2:C#侧用DataTable模拟临时表
该方案更适合ASP.NET场景,无需维护临时表的会话生命周期,直接给SqlDataAdapter配置自定义的InsertCommand、UpdateCommand、DeleteCommand,命令中写入同时更新两张源表的SQL逻辑,调用sda.Update(dt)时即可自动完成源表同步。
内容的提问来源于stack exchange,提问作者Heart Break Kid
相关产品推荐
相关产品推荐

