首页 > 解决方案 > 应该使用什么 NpgsqlDbType 来清除“Can't write CLR type”错误

问题描述

我使用 PostgreSQL 作为我的数据库。我有一个应用程序是用

我的数据库中有一个名为tblAppt的表,在该表中我有一个名为appttime的列,该列的数据类型是没有时区的时间

如果我运行以下查询,则在 pgAdmin4 的查询工具中:

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

结果是:

INSERT 0 1 Query returned successfully in 105 msec.

这意味着记录已添加到我的表中,在图像中您可以看到我有一行: 现在在我的 Web 应用程序中,我有一个名为txtCustTime的文本框,在该文本框中我输入了这个值00:30:00
在此处输入图像描述

当我按下提交按钮时,我收到以下错误:

System.InvalidCastException
无法使用处理程序类型 TimeHandler 编写 CLR 类型 System.String

以下是提交时发生的情况的片段:

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 ();

这告诉我我不理解的问题与参数有关。

标签: c#asp.netpostgresqlnpgsql

解决方案


评论中的人是正确的,因为TimeSpan是要走的路。但是文档对如何使用它不是很清楚。

对上述问题使用TimeSpan的正确方法是:

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


推荐阅读