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

问题描述 投票:0回答:2

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

编写的应用程序
  • ASP.NET
  • C#
  • 网络表格
  • 在 PostgreSQL 中使用 Npgsql

我的数据库中有一个名为 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 ();

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

c# asp.net postgresql npgsql
2个回答
2
投票

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


0
投票

这与您的具体问题无关,但由于这篇文章是我寻找答案时的第一个结果,所以我想提供这个额外的见解。

我在使用 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
)。

© www.soinside.com 2019 - 2024. All rights reserved.