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

时间:2018-08-16 13:09:34

标签: c# asp.net postgresql npgsql

我正在使用PostgreSQL作为数据库。我有一个用

编写的应用程序
  • ASP.NET
  • C#
  • WebForms
  • 在PostgreSQL中使用Npgsql

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

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

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div" style="width: 500px; height: 250px;"></div>

结果是:

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

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

当我按下提交按钮时,出现以下错误:

  

System.InvalidCastException
无法使用以下命令编写CLR类型的System.String   处理程序类型TimeHandler

以下是提交内容的摘要:

INSERT 0 1 Query returned successfully in 105 msec.

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

请注意: 该表中我还有其他列,它们不是时间或日期,所以可以提交。我的问题似乎专门针对此特定列类型。
其他说明: 如果我在提交时运行此值,则将值添加到数据库中:

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

告诉我我不明白的问题与参数有关。

1 个答案:

答案 0 :(得分:1)

评论中的人是正确的,因为 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