所以,我使用的是C#/.NET,使用的是Npgsql.基本上,我一直遇到错误System.InvalidCastException: 'Can't write CLR type System.String with handler type NumericHandler',但我似乎无法解决它.

这个错误似乎不言而喻.基本上,我try 使用一个字符串,但PostgreSQL想要一个数值数据类型.(这是DECIMAL还是DOUBLE数据类型?)

在某些情况下,我将旧的VB代码重写为C#,而在VB版本中,数值变量的初始声明是字符串.并且在代码中使用了一些字符串操作方法.

我的 idea 是,让字符串操作发生,然后在稍后将其转换为小数或双精度,会更容易、更快.(我认为,小数和双精度是数字PostgreSQL的类似功能?)

下面是初始声明的一个示例:

string tno = "";
string iw = "";
string ws = "";
string ftg = "0";
string hl = "0";
string ll = "0";
string date = "2012/02/04";
string va = "0";
string dev = "0";

在后面的代码中,使用了一些字符串操作方法.正如我前面所说的,我认为在将字符串提供给PostgreSQL之前,只使用一些转换方法将其转换为适当的数据类型会更快.

例如:

Convert.ToDecimal(tno);

以下是SQL字符串的一个示例:

string sqlString = @"UPDATE header
SET ft = @gftg, high_limit=@ghl, low_limit=@gll, start_date = @gsdd, avg_ga = @gvgga, std_dev = @gstd
WHERE cmpy_id = 'ABC' and tag_no = @gto and ip_num = @gim";

以下是Npgsql参数代码:

cmd.Parameters.Add("@gim", NpgsqlTypes.NpgsqlDbType.Varchar).Value = iw;                              
cmd.Parameters.Add("@gftg", NpgsqlTypes.NpgsqlDbType.Numeric).Value = ftg;                            
cmd.Parameters.Add("@ghl", NpgsqlTypes.NpgsqlDbType.Numeric).Value = hl;                              
cmd.Parameters.Add("@gll", NpgsqlTypes.NpgsqlDbType.Numeric).Value = ll;                              
cmd.Parameters.Add("@gsdd", NpgsqlTypes.NpgsqlDbType.Date).Value = date;                             
cmd.Parameters.Add("@gvgga", NpgsqlTypes.NpgsqlDbType.Numeric).Value = va;                              
cmd.Parameters.Add("@gstd", NpgsqlTypes.NpgsqlDbType.Numeric).Value = dev;

然而,这并不是真的有效,这可能是因为一个显而易见的原因,我希望你们能帮助我.????

没有简单的方法可以做到这一点吗?我只需要立即将初始变量声明更改为正确的数据类型吗?那么,例如,也许它应该更像这样?然后,我将不得不修改下面的代码,并执行一些字符串操作等效项或类似的操作.

decimal tno = "";
string iw = "";
string ws = "";
decimal ftg = "0";
decimal hl = "0";
decimal ll = "0";
string date = "2012/02/04";
decimal va = "0";
decimal dev = "0";

您知道为什么在将Convert.ToDecimal(tno)输入到postgres npgsql参数之前不起作用吗?

推荐答案

感谢@Jeroen Mostert,我终于解决了这个问题.原因很简单,Convert.ToDecimal()个都不管用.所以我只是用Decimal.TryParse()代替了一个新的变量,现在它起作用了.(现在转到我的Other Errors????)

下面是一个例子:

decimal ftgAsDecimal;
Decimal.TryParse(ftg, out ftgAsDecimal);

我将其输入到我的Npgsql参数中,如下所示:

cmd.Parameters.Add("@gftg", NpgsqlTypes.NpgsqlDbType.Numeric).Value = ftgAsDecimal;

For DateTime variables I had to use DateTime.ParseExact() like Jeroen recommended above. 下面是一个例子:

DateTime dateAsDateTime = DateTime.ParseExact(date, "MM-dd-yyyy", null);

(请记住,上面的date是一个DateTime数据类型变量)

仅出于绝对清晰的目的,这是提供给Npgsql参数的外观:

cmd.Parameters.Add("@gsdd", NpgsqlTypes.NpgsqlDbType.Date).Value = dateAsDateTime;

Csharp相关问答推荐

更改对象的旋转方向

在C#中使用in修饰符

如何使用C#和Graph API从Azure Directory获取用户详细信息

MongoDB将JS查询转换为C#的问题

如何创建ASP.NET Core主机并在同一进程中运行请求

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

一小时后,自定义缓存停止在App Insight中保存

碰撞检测与盒碰撞器,其isTrigger on问题

WPF DataGrid中的三维数据

有没有办法在WPF文本框中添加复制事件的处理程序?

在调整大小的控件上绘制

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

如何解决提交按钮后 Select 选项错误空参照异常

在静态模式下实例化配置

BlockingCollection T引发意外InvalidOperationException

交替的奇数

我应该为C#12中的主构造函数参数创建私有属性吗?

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

无法向Unity注册Microsoft Logger

根据运行时值获取泛型类型的字典