应该使用什么 NpgsqlDbType 来清除 "Can't write CLR type" 错误
What NpgsqlDbType should be used to clear "Can't write CLR type" error
我正在使用 PostgreSQL 作为我的数据库。我有一个用
编写的应用程序
- ASP.NET
- C#
- 网络表单
- 将 Npgsql 与 PostgreSQL 结合使用
我的数据库中有 table 名为 tblAppt,因为 table 我有一个名为 appttime[=59= 的列] 该列的数据类型是 time without time zone
在 pgAdmin4 的 查询工具中 如果我 运行 以下查询:
INSERT INTO tblAppt (appttime) VALUES ('00:30:00');
结果是:
INSERT 0 1 Query returned successfully in 105 msec.
这意味着记录被添加到我的table,在图像中你可以看到我有一行:
现在在我的网络应用程序中,我有一个名为 txtCustTime 的文本框,在该文本框中我输入了这个值 00:30:00
当我按下提交按钮时,出现以下错误:
System.InvalidCastException
Can't write CLR type System.String with
handler type 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 ();
我的问题是我是否需要转换它,因为文本框中的值或使用不同的数据类型,或其他原因。
请注意: 我在那个 table 中还有其他列,这些列不是时间或日期,他们可以提交。我的问题似乎专门针对这种特定的列类型。
补充说明:
如果我 运行 在提交时将值添加到数据库中:
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 ();
我用这个link作为参考:
https://docs.microsoft.com/en-us/dotnet/api/system.timespan?redirectedfrom=MSDN&view=netframework-4.7.2
我正在使用 PostgreSQL 作为我的数据库。我有一个用
编写的应用程序- ASP.NET
- C#
- 网络表单
- 将 Npgsql 与 PostgreSQL 结合使用
我的数据库中有 table 名为 tblAppt,因为 table 我有一个名为 appttime[=59= 的列] 该列的数据类型是 time without time zone
在 pgAdmin4 的 查询工具中 如果我 运行 以下查询:
INSERT INTO tblAppt (appttime) VALUES ('00:30:00');
结果是:
INSERT 0 1 Query returned successfully in 105 msec.
这意味着记录被添加到我的table,在图像中你可以看到我有一行:
现在在我的网络应用程序中,我有一个名为 txtCustTime 的文本框,在该文本框中我输入了这个值 00:30:00
当我按下提交按钮时,出现以下错误:
System.InvalidCastException
Can't write CLR type System.String with handler type 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 ();
我的问题是我是否需要转换它,因为文本框中的值或使用不同的数据类型,或其他原因。
请注意: 我在那个 table 中还有其他列,这些列不是时间或日期,他们可以提交。我的问题似乎专门针对这种特定的列类型。
补充说明:
如果我 运行 在提交时将值添加到数据库中:
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 ();
我用这个link作为参考: https://docs.microsoft.com/en-us/dotnet/api/system.timespan?redirectedfrom=MSDN&view=netframework-4.7.2