-1

次のコードを試していますが、次のエラーが発生します。

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

4 に答える 4

2

これは、SQL に指定している値の 1 つが、対応するフィールドが必要とする double 型に変換できないことを意味します。

a) 入力、および b) データ構造を知らなければ、どれがどれであるかはわかりません。

また、パラメーター化されたクエリを使用して調査する必要があります。

于 2012-08-29T08:17:16.957 に答える
1

ParametersSQL インジェクションやそのようなエラーを避けるために、実際に使用する必要があります。

例えば:

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

私はオラクルを何年も使用していないので、何か問題があるかもしれませんが、とにかく理解していただければ幸いです。

于 2012-08-29T08:26:14.067 に答える
1

渡す値はすべて一重引用符で囲まれているため、SQL サーバーはそれらを文字列と見なします。例: 'string','23' = どちらも文字列です。

テーブルが文字列と 23 を double として期待している場合、VALUES は VALUES('string',23) になります。

したがって、多数の列タイプの要件を正しく一致させる必要があります。

他の投稿者が言っているように、パラメーター化されたクエリを使用して書き直す方がおそらく簡単で、確実に保守性が高くなります。

編集:ああ - あなたはオラクルを使用しています。私の悪い。文字列としての値の問題は同じかもしれないので、この投稿はそのままにしておきます。

于 2012-08-29T08:24:51.393 に答える
0

VBNET使用しているため、クラスを使用できますCONVERT

元。

Dim x AS Double = Convert.ToDouble(45)

また

Dim x AS Double = CDBL(45)
于 2012-08-29T08:16:22.770 に答える