所以,我使用的是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参数之前不起作用吗?