'System.InvalidCastException: 无法使用 NumericHandler 编写 CLR 类型 System.String' 在使用 C# 的 postgresql 中非常



我正在将一些旧的VB代码重新写入C#,并将所有内容从informix和sql server转换为postgresql。由于postgresql对数据类型的要求更严格,我一直认为这是一个数据类型问题。在我尝试铸造AS NUMERIC之前。我还尝试在pstrngsql字符串中不使用类型转换。

我尝试将NpgsqlTypes.NpgsqlDbType的更改为每种不同的数据类型,这是有意义的。我觉得我什么都试过了。另外,为了透明起见,我对postgresql不太熟悉,所以它可能是一些显而易见的简单语法。

以下是变量声明:

string aString;
int id = 0;
string cmpyid = "";
string tgnn = "";
string inm = "";
string Whs = "";
string ft = "0";
string gh_lt = "0";
string gll = "0";
string ghsd = "1998/01/01";
string gag = "0";
string gsd = "0";
var dList = new List<string>();
string Gge = "";
double Gcv = 0.0d;
double Pgcv = 0.0d;
string ft = "";
int fconv = 0;
double pnum = 0.0d;
decimal anm = 0.0m;
decimal dv = 0.0m;
decimal sdn = 0.0m;
decimal tdvv = 0.0m;
decimal eage = 0.0m;
decimal ie = 0.0m;
decimal tm = 0.0m;

以下是出现问题的代码:

string pstrng= "";
pstrng= @"UPDATE gamma_header 
SET 
CAST('ft=@ftt' AS DECIMAL), CAST(gh_lt=@ghl AS DECIMAL),
CAST(gag = @gav AS DECIMAL), CAST(gsd = @gst AS DECIMAL)
WHERE gmpid = 'IOP' and tg = @gmtg and inm = @ginm";
var cmd = new NpgsqlCommand();
cmd.CommandType = (System.Data.CommandType)Convert.ToInt16(CommandType.Text);
cmd.CommandText = pstrng;
cmd.Parameters.Add("@gma_tg", NpgsqlTypes.NpgsqlDbType.Varchar).Value = tgnn;
cmd.Parameters.Add("@ginm ", NpgsqlTypes.NpgsqlDbType.Varchar).Value = inm;
cmd.Parameters.Add("@ftt", NpgsqlTypes.NpgsqlDbType.Numeric).Value = ft;
cmd.Parameters.Add("@ghl", NpgsqlTypes.NpgsqlDbType.Numeric).Value = gh_lt;
cmd.Parameters.Add("@glll", NpgsqlTypes.NpgsqlDbType.Numeric).Value = gll;
cmd.Parameters.Add("@gsd", NpgsqlTypes.NpgsqlDbType.Date).Value = ghsd;
cmd.Parameters.Add("@gav", NpgsqlTypes.NpgsqlDbType.Numeric).Value = gag;
cmd.Parameters.Add("@gst", NpgsqlTypes.NpgsqlDbType.Numeric).Value = gsd;
using (var con = new NpgsqlConnection(GlobalVariables.consql)) // (strConnString)
{
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}

我得到的错误是System.InvalidCastException: Can't write CLR type System.String with handler type NumericHandler我尝试了类型转换,更改了声明变量的初始数据类型,并更改了Npgsql数据类型。这些都不起作用。请帮忙。

这个不应该吗

CAST('ft=@ftt' AS DECIMAL)

有点像

ft = CAST(@ftt AS DECIMAL)

我不是Npgsql专家,但您的错误看起来像是.NET位无法使用数字转换器转换字符串。

查看您的Parameters,它看起来像是在告诉引擎@ftt应该是NpgsqlDbType.Numeric,然后传入一个字符串(ft(。gh_ltgll等也是如此。类似地,日期gsd应该是本机.NET DateTime,而不是字符串。

除此之外,您的SET语法似乎不正确…

那么,让适配器处理数据类型(为了热爱一切神圣的事物,请在有机会时将这些变量重命名为有意义的变量…:-(

string tgnn = "";
string inm = "";
var ft = 0;
var gh_lt = 0;
var gll = 0;
var ghsd = DateTime.Parse("1998/01/01");
var gag = 0;
var gsd = 0;
var cmd = new NpgsqlCommand(@"UPDATE gamma_header
SET
ft = @ftt,
gh_lt = @ghl,
gag = @gav,
gsd = @gst
WHERE
gmpid = 'IOP'
and tg = @gmtg
and inm = @ginm");
cmd.Parameters.AddWithValue("gma_tg", tgnn);
cmd.Parameters.AddWithValue("ginm", inm);
cmd.Parameters.AddWithValue("ftt", ft);
cmd.Parameters.AddWithValue("ghl", gh_lt);
cmd.Parameters.AddWithValue("glll", gll);
cmd.Parameters.AddWithValue("gav", gag);
cmd.Parameters.AddWithValue("gst", gsd);
cmd.Parameters.AddWithValue("gsd", ghsd);

相关内容

最新更新