我使用 PostgreSQL 作为我的数据库。我有一个用
编写的应用程序我的数据库中有一个名为 tblAppt 的表,在那个表中我有一个名为 appttime 的列,该列的数据类型是 time without time zone
在 pgAdmin4 的 Query Tool 如果我运行以下查询:
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
这是提交时发生的事情的片段:
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 ();
我用这个链接作为参考: https://learn.microsoft.com/en-us/dotnet/api/system.timespan?redirectedfrom=MSDN&view=netframework-4.7.2
这与您的具体问题无关,但由于这篇文章是我寻找答案时的第一个结果,所以我想提供这个额外的见解。
我在使用 Npgsql 的批量复制时发现了同样的错误。具体错误是:
“无法将 CLR 类型 System.Nullable`1[System.DateTime] 写入数据库类型日期”
这是代码:
using (var writer = conn.BeginBinaryImport("copy table1 from STDIN (FORMAT BINARY)"))
{
foreach (OcieHeader record in Records)
{
writer.StartRow();
if (record.OrderDate == null)
writer.WriteNull();
else
writer.Write(record.OrderDate, NpgsqlDbType.Date);
}
}
原来类型不匹配的发生是因为我使用了一个可空值——它在
System.DateTime?
(又名Nullable<DateTime>
)和NpgsqlDbType.Date
之间造成了类型不匹配。
消除可为 null 的 .NET 类型解决了这个问题,因此更正后的代码是:
writer.Write(record.OrderDate.Value, NpgsqlDbType.Date);
(添加
.Value
)。