代码之家  ›  专栏  ›  技术社区  ›  DebPepDevuan

应该使用什么NpgsqlDbType来清除“无法写入CLR类型”错误

  •  1
  • DebPepDevuan  · 技术社区  · 6 年前

    我正在使用PostgreSQL作为我的数据库。我有一份申请书

    • ASP.NET
    • 网络表单
    • 将Npgsql与PostgreSQL结合使用

    我有一张名为 特布拉普特 在我的数据库中,在那个表中有一个名为 该列的数据类型是 无时区时间

    查询工具

    INSERT INTO tblAppt (appttime) VALUES ('00:30:00');
    

    结果是:

    INSERT 0 1 Query returned successfully in 105 msec.
    

    这意味着该记录已添加到我的表中,在图像中您可以看到我有一行:
    enter image description here
    现在在我的web应用程序中,有一个名为 txtCustTime公司 00:30:00

    当我按下submit按钮时,会出现以下错误:

    System.InvalidCastException系统
    无法写入CLR类型系统。字符串 处理程序类型TimeHandler

    string insertstmt = "INSERT INTO tblAppt(appttime) VALUES (@ApptTime)";
    NpgsqlCommand cmd = new NpgsqlCommand (insertstmt, con);
    cmd.Parameters.Add("@ApptTime", NpgsqlDbType.Time );
    cmd.Parameters ["@ApptTime"].Value = txtCustTime.Text;
    con.Open ();
    cmd.ExecuteNonQuery (); 
    con.Close ();
    

    我的问题是,我是否需要强制转换它,因为文本框中的值或使用不同的数据类型或其他类型。

    我在那个表中有其他列不是时间或日期,他们提交罚款。我的问题似乎特别针对这种特殊的列类型。
    附加说明: 如果在提交时运行此命令,则会将值添加到数据库中:

    string insertstmt = "INSERT INTO tblAppt(appttime) VALUES ('00:30:00')";
    NpgsqlCommand cmd = new NpgsqlCommand (insertstmt, con);
    con.Open ();
    cmd.ExecuteNonQuery (); 
    con.Close ();
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tommy    4 年前

    评论里的人是对的 时间跨度 是一条路。然而,文档并不是很清楚如何使用它。

    时间跨度 因为上面的问题是:

    string insertstmt = "INSERT INTO tblAppt(appttime) VALUES (@ApptTime)"; 
    NpgsqlCommand cmd = new NpgsqlCommand (insertstmt, con);
    TimeSpan thetime = TimeSpan.Parse(txtCustTime.Text);
    
    cmd.Parameters.Add("@ApptTime", NpgsqlDbType.Time ); 
    cmd.Parameters["@ApptTime"].Value = thetime; 
    con.Open (); 
    cmd.ExecuteNonQuery (); 
    con.Close ();
    

    https://docs.microsoft.com/en-us/dotnet/api/system.timespan?redirectedfrom=MSDN&view=netframework-4.7.2