【问题标题】:ERROR [22P02] ERROR: invalid input syntax for integer: "";错误 [22P02] 错误:整数的输入语法无效:“”;
【发布时间】:2012-12-21 12:42:00
【问题描述】:

从未见过这样的错误:

错误 [22P02] 错误:整数输入语法无效:“”;执行查询时出错

创建表:

    Public Function PrimkCreate(ByVal myPrimkTable As String, ByVal nCon As OdbcConnection) As Integer
    Dim ans As Integer
    Dim cCommand As OdbcCommand = New OdbcCommand("CREATE TABLE IF NOT EXISTS " + myPrimkTable + "(" & _
            "prm_id int NOT NULL, " & _
            "pkni text, " & _
            "pdatum text, " & _
            "pdatumnaplate text, " & _
            "pdanaodgode int, " & _
            "puldok text, " & _
            "puldokbroj text, " & _
            "pdatumk text, " & _
            "pvrijemek text, " & _
            "pdobid int, " & _
            "pdoboib text, " & _
            "pnabc double precision, " & _
            "purab double precision, " & _
            "ppdv double precision, " & _
            "ppnak double precision, " & _
            "pprodc double precision, " & _
            "pvrstaprimke int, " & _
            "pzapisniktekst text, " & _
            "prez text, " & _
            "CONSTRAINT " & myPrimkTable & "_pkey PRIMARY KEY(prm_id))", nCon)

    ans = cCommand.ExecuteNonQuery()
    cCommand.Dispose()
    Return ans
End Function

更新代码:

    Public Function update_LPrimk(ByRef primk As Integer, ByVal mCon As OdbcConnection) As Integer

    Dim retval As Integer
    Dim uCmd As OdbcCommand = New OdbcCommand("UPDATE " & myPrimkTable & " SET " & _
                "prm_id=" & primk & ", " & _
                "pkni='" & prm.pKni & "', " & _
                "pdatum='" & prm.pDatum & "', " & _
                "pdatumnaplate='" & prm.pDatumNaplate & "', " & _
                "pdanaodgode=" & prm.pDanaodgode & ", " & _
                "puldok='" & prm.pUlDok & "', " & _
                "puldokbroj='" & prm.pUlDokBroj & "', " & _
                "pdatumk='" & prm.pDatumk & "', " & _
                "pvrijemek='" & prm.pVrijemek & "', " & _
                "pdobid='" & prm.pDobID & "', " & _
                "pdoboib='" & prm.pDobOib & "', " & _
                "pnabc='" & Replace(prm.pNabc.ToString, ",", ".") & "', " & _
                "purab='" & Replace(prm.pURab.ToString, ",", ".") & "', " & _
                "ppdv='" & Replace(prm.pPdv.ToString, ",", ".") & "', " & _
                "ppnak='" & Replace(prm.pPnak.ToString, ",", ".") & "', " & _
                "pprodc='" & Replace(prm.pProdc.ToString, ",", ".") & "', " & _
                "pvrstaprimke=" & prm.pVrstaPrimke & ", " & _
                "pzapisniktekst='" & prm.pZapisnikTekst & "', " & _
                "prez='" & prm.pRez & "' " & _
                "WHERE prm_id=" + primk.ToString, mCon)

    retval = uCmd.ExecuteNonQuery()
    uCmd.Dispose()
    Return retval
End Function

查询看起来完全像这样:

UPDATE primke SET prm_id=1, pkni='U', pdatum='07.01.2013', pdatumnaplate='10.01.2013',
pdanaodgode=3, puldok='ghkzug gugug', puldokbroj='jkhk', pdatumk='', pvrijemek='', 
pdobid='', pdoboib='', pnabc='0', purab='0', ppdv='0', ppnak='0', pprodc='0', 
pvrstaprimke=0, pzapisniktekst='', prez='' WHERE prm_id=1

我有很多表运行类似的命令,但从未见过这样的错误。
可能是什么问题?

【问题讨论】:

  • '0' 不是有效数字,它是字符文字。 0 是一个数字。您还应该将日期存储在 text 列中。
  • 日期和“0”在这里是因为国际化问题和 VB.NET 问题。那些“0”用于以这种方式存储的双精度数字。好的,不合适,但我在很多表中都使用它。这是具体的。
  • '0' 是您问题的根源。它不是一个数字。您必须使用 0 作为数值。
  • '' 也不是双精度数。如果您的意思是 NULL,请使用 NULL。
  • 顺便说一句,VB.net 中没有使用占位符和绑定值的东西吗?必须有比所有这些字符串连接更好的方法。您应该在应用程序的边缘处理 L10N 和 I18N 问题:输入标准化,输出本地化。

标签: sql postgresql types sql-update


【解决方案1】:

我建议阅读 Constants in the manual 章节。这是一个简短而内容丰富的阅读。
错误消息的原因是'' 是一个空字符串,它没有像integer 这样的数字类型的表示。

@a_horse_with_no_name:准确地说,'0' 是 PostgreSQL 的一个 string 常量,可以转换为 integer,也可以转换为 text,只有 @987654329 @ 是字符串常量的默认值。考虑这个演示:

CREATE TEMP TABLE t (i int);
INSERT INTO t VALUES (1);
INSERT INTO t VALUES ('2');        -- single row inserts to make sure ..
INSERT INTO t VALUES ('3'::int);   -- .. type is not coerced to type
INSERT INTO t VALUES (4::bigint);  -- .. of first row by VALUES expression.
INSERT INTO t VALUES (5::numeric);
INSERT INTO t VALUES (6);

UPDATE t SET i = '0' WHERE i = '6';
SELECT * FROM t;

SQL Fiddle.

【讨论】:

  • SQL 标准调用'foobar' 字符串文字 :) 我倾向于避免将名称“字符串”与 SQL 结合使用,因为它不是常规数据类型。我强烈建议不要使用隐式数据类型转换。那简直是自找麻烦。最好始终使用正确的文字(常量)语法。
  • 我真的很惊讶i = '0' 有效。我认为那些隐式转换已经被 8.3 删除了
  • @a_horse_with_no_name:我认为 8.3 中删除的是将 数字常量 自动强制转换为字符类型。 (0 -> '0'::text)。但是可以将通用字符串常量 ('0') 强制转换为 any 类型。
  • @a_horse_with_no_name:我认为“字符串”是 字符串常量 的正确术语,例如'0'因为“字符串”不是常规数据类型 - 因为尚未将文字转换为任何数据类型。
  • @user973238:您可以使用函数to_number() 将字符串转换为numeric 类型,与语言环境无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2014-07-17
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多