You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# CRUD应用数据未入库及类型转换错误问题咨询

问题1:VaccinationDate赋值时报类型转换错误

你的Patient类中VaccinationDate属性为DateTime类型,但数据库中该字段是varchar类型,从SqlDataReader中读出的是字符串,需要手动转换为DateTime类型。稳妥写法如下:

// 替换你注释的那行代码
string dateStr = dr["VaccinationDate"].ToString();
if (DateTime.TryParse(dateStr, out DateTime vaccinationDate))
{
    p.VaccinationDate = vaccinationDate;
}
else
{
    // 可根据业务需求设置默认值,比如 DateTime.MinValue
    p.VaccinationDate = DateTime.MinValue;
}

如果确定数据库中存储的日期格式统一,也可以直接用Convert.ToDateTime(dateStr)或者DateTime.Parse(dateStr),但TryParse可以避免格式错误导致程序崩溃。

问题2:AddPatient执行后数据未入库

有多处错误导致该问题:

  1. 数据库连接未配置连接字符串:AddPatient方法中你初始化SqlConnection时没有传入提前定义的连接字符串cs,导致根本没有连上数据库,修改为:
SqlConnection con = new SqlConnection(cs);
  1. 存储过程存在变量引用错误:存储过程第二个INSERT语句中使用的@Cnic和入参定义的@CNIC虽然SQL Server默认不区分大小写,但为了避免潜在问题建议统一。另外存储过程开头建议加上SET NOCOUNT ON;,避免INSERT返回的计数干扰ExecuteNonQuery的返回结果,修改后的存储过程如下:
ALTER PROCEDURE [dbo].[spAddPatient]
    (@CNIC varchar(50),
     @Name varchar(50),
     @VaccinationName varchar(50),
     @VaccinationDate varchar(50),
     @CenterAddress varchar(50))
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO Patient (CNIC, Name)
    VALUES (@CNIC, @Name)

    INSERT INTO PatientVaccines (Cnic, VaccinationName, VaccinationDate, CenterAddress)
    VALUES (@CNIC, @VaccinationName, @VaccinationDate, @CenterAddress)
END
  1. 异常被静默吞掉:你Create接口的catch块没有任何日志输出,即使数据库操作抛错你也看不到,调试阶段建议在catch中打印错误信息,方便定位问题。

问题3:Edit方法中查询语句报类型转换错误

你在Lambda表达式中误用了赋值运算符=,C#中判断两个值相等需要用双等号==,修改为:

var row = context.getPatients().Find(model => model.CNIC == Cnin);

另外注意你方法的参数名是Cnin,大概率是拼写错误,应该是Cnic,如果前端或者路由传的参数名是CNIC,会导致参数接收为空,查不到数据,建议修正参数名。


其他附带修复建议

  1. UpdatePatient方法也存在SqlConnection未传连接字符串的问题,同样修改为SqlConnection con = new SqlConnection(cs);
  2. UpdatePatient的SQL语句中参数名拼写错误:@VacinationDate少了一个字母c,应该改为@VaccinationDate;另外WHERE条件中的参数是@Cnic,你加参数时写的是@CNIC,需要统一为cmd.Parameters.AddWithValue("@Cnic", pat.CNIC);
  3. 所有的SqlConnection、SqlCommand、SqlDataReader都建议用using语句包裹,会自动释放资源,不需要手动调用Close()方法,示例如下:
using(SqlConnection con = new SqlConnection(cs))
{
    using(SqlCommand cmd = new SqlCommand(query, con))
    {
        con.Open();
        // 执行数据库操作
    }
}

内容的提问来源于stack exchange,提问作者Zong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:36:04