c# - 应该使用什么 NpgsqlDbType 来清除“Can't write CLR type”错误
问题描述
我使用 PostgreSQL 作为我的数据库。我有一个应用程序是用
- ASP.NET
- C#
- 网络表单
- 将 Npgsql 与 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 ();
这告诉我我不理解的问题与参数有关。
解决方案
评论中的人是正确的,因为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 ();
推荐阅读
- c++ - 使用cmake,我如何将第三方库链接到我自己的程序(找到项目,从源代码构建,并安装,链接)
- javascript - 从节点js中的数据库中检索图像
- node.js - 如何在nodejs中获取与来自mongodb的问题相对应的特定字段
- angularjs - 未知提供者:$intervalProvider <- $interval <-infiniteScrollDirective
- javascript - 使用 CTRL + END 的量角器
- c# - ASP.Net 通过 WebClient 向我的应用程序返回损坏的字节数组
- amazon-web-services - 通过 docker 为 AWS 中的 firefox 节点创建 Selenium 网络
- c# - 确定要更新的文本框
- android - WebView 在新窗口中打开外部链接和目标=空白链接,如 GMail 应用程序
- java - 如何确定我使用哪种 GC?