从字符串到“Double”类型的转换无效

时间:2012-08-29 08:14:06

标签: sql vb.net

我正在尝试使用一段代码,我收到了以下错误:

ex = {"Conversion from string "INSERT INTO d009040 (LBRCODE,ENT" to type 'Double' is not valid."}

请帮忙。到目前为止,我可以使用更长的SQL查询。 :(

Dim cmd3 As New OracleCommand
                cmd3.Connection = conn
                Dim timepara As String = Now.Hour & Now.Minute & Now.Second & Now.Millisecond
                cmd3.CommandText = "INSERT INTO d009040 (LBRCODE,ENTRYDATE,BATCHCD,SETNO,SCROLLNO,MAINSCROLLNO,POSTDATE,FEFFDATE,ACTIVITYTYPE,CASHFLOWTYPE,VALUEDATE,BOOKTYPE,DRCR,VCRACCTID,MAINACCTID,MAINMODTYPE,VCRMODTYPE,TRNCURCD,FCYTRNAMT,LCYCONVRATE,LCYTRNAMT,INSTRBANKCD,INSTRBRANCHCD,INSTRTYPE,INSTRNO,INSTRDATE,TOKENNO,PARTICULARS,SYSGENVCR,SHTOTFLAG,SHCLRFLAG,ACTOTFLAG,ACCLRFLAG,MAKER,MAKERDATE,MAKERTIME,CHECKER1,CHECKER2,CHECKER3,CHECKER4,CHECKERDATE,CHECKERTIME,NOAUTHPENDING,NOAUTHOVER,POSTFLAG,AUTHFLAG,FEFFFLAG,CANCELEDFLAG,POSTAUTHFEFFCNCL,UPDTCHKID,PARTCLEARAMT,POSTTIME) VALUES ('" + lbr + "','" + datepara + "','TR-MOBDS','" + k + "','" + k + "','" + k + "','" + datepara + "','" + datepara + "','CR','CR','" + datepara + "','ZZ','C','" + internalaccount + "','" + internalaccount + "','47','47','INR','" + amount + "','1','" + amount + "','0','0','99','000000000000','" + datepara + "','0','DDS CR. From Agent','1','Y','Y','Y','Y','0','" + datepara + "','" + timepara + "','0','0','0','0','" + datepara + "','" + timepara + "','0','1','P','A','F','0','0','0','0','" + timepara + "')"
                cmd3.CommandType = CommandType.Text
                cmd3.ExecuteNonQuery()

4 个答案:

答案 0 :(得分:2)

这意味着您在SQL中提供的值之一不能转换为相应字段所需的double类型。

不知道a)您的输入,以及b)您的数据结构,我们无法告诉您哪一个。

您还应该使用参数化查询进行研究。

答案 1 :(得分:1)

您传递的所有值都包含在单引号中 - 因此sql server将它们视为字符串。例如:' string',' 23' =两者都是字符串。

如果表格期望一个字符串而23表示为双倍,则VALUES将为 VALUES('串',23)

因此,您需要正确匹配许多列类型要求。

正如其他海报所说 - 使用参数化查询重写它可能更容易,也更容易维护。

编辑:哦 - 你正在使用oracle。我的错。 value-as-strings的问题可能是相同的,所以我将留下这篇文章。

答案 2 :(得分:1)

您应该使用Parameters来避免SQL注入和此类错误。

例如:

Using con = New OracleConnection(connectionString)
    Dim sql = "INSERT INTO d009040 (LBRCODE,ENTRYDATE,BATCHCD,SETNO,SCROLLNO,MAINSCROLLNO,POSTDATE,FEFFDATE,ACTIVITYTYPE,CASHFLOWTYPE,VALUEDATE,BOOKTYPE,DRCR,VCRACCTID,MAINACCTID,MAINMODTYPE,VCRMODTYPE,TRNCURCD,FCYTRNAMT,LCYCONVRATE,LCYTRNAMT,INSTRBANKCD,INSTRBRANCHCD,INSTRTYPE,INSTRNO,INSTRDATE,TOKENNO,PARTICULARS,SYSGENVCR,SHTOTFLAG,SHCLRFLAG,ACTOTFLAG,ACCLRFLAG,MAKER,MAKERDATE,MAKERTIME,CHECKER1,CHECKER2,CHECKER3,CHECKER4,CHECKERDATE,CHECKERTIME,NOAUTHPENDING,NOAUTHOVER,POSTFLAG,AUTHFLAG,FEFFFLAG,CANCELEDFLAG,POSTAUTHFEFFCNCL,UPDTCHKID,PARTCLEARAMT,POSTTIME) VALUES (:LBRCODE,:ENTRYDATE,:BATCHCD,:SETNO,:SCROLLNO,:MAINSCROLLNO,:POSTDATE,:FEFFDATE,:ACTIVITYTYPE,:CASHFLOWTYPE,:VALUEDATE,:BOOKTYPE,DRCR,:VCRACCTID,:MAINACCTID,:MAINMODTYPE,:VCRMODTYPE,:TRNCURCD,:FCYTRNAMT,:LCYCONVRATE,:LCYTRNAMT,:INSTRBANKCD,:INSTRBRANCHCD,:INSTRTYPE,:INSTRNO,:INSTRDATE,:TOKENNO,:PARTICULARS,:SYSGENVCR,:SHTOTFLAG,:SHCLRFLAG,:ACTOTFLAG,:ACCLRFLAG,:MAKER,:MAKERDATE,:MAKERTIME,:CHECKER1,:CHECKER2,:CHECKER3,:CHECKER4,:CHECKERDATE,:CHECKERTIME,:NOAUTHPENDING,:NOAUTHOVER,:POSTFLAG,:AUTHFLAG,:FEFFFLAG,:CANCELEDFLAG,:POSTAUTHFEFFCNCL,:UPDTCHKID,:PARTCLEARAMT,:POSTTIME)"
    Using cmd = New OracleCommand(sql, con)
        con.Open()
        cmd.Parameters.AddWithValue(":LBRCODE", LBRCODE)
        ' add the other parameters as well ... '
        dim result = cmd.ExecuteNonQuery()
    End Using
End Using

请注意,我没有使用oracle多年,所以可能有问题,但我希望你能理解它。

答案 3 :(得分:0)

因为您使用的是VBNET,所以您可以使用课程CONVERT

离。

Dim x AS Double = Convert.ToDouble(45)

OR

Dim x AS Double = CDBL(45)