2016-07-02 45 views
1

私は次のコードに指定されたエラーを持っている:vb.net odp.net/ insertでExecuteNonQuery()を使用するには?

Public Function Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim oradb As String = "Data Source=fbdata;User Id=fbtrain;Password=password;" 
    Using conn As New OracleConnection(oradb) 

     Using cmd As New OracleCommand 

      conn.CreateCommand() 

      cmd.CommandText = "INSERT INTO BID " _ 
      + "(BID_ID, BID_NAME, BID_NAMEID, BID_STATUS, BID_FROM, BID_TO, BID_OWNER, NEW_USER, NEW_ZEIT, CHG_USER, CHG_ZEIT, AKTIV) VALUES " _ 
      + "(:1, :2, :2, '00', TO_DATE('01-JUL-16', 'DD-MON-RR'), TO_DATE('30-JUN-2099', 'DD-MON-RR'), '1', '1', SYSDATE, '1', SYSDATE, ' ')" 

      Dim pcountbid As New OracleParameter 
      pcountbid.OracleDbType = OracleDbType.Decimal 

      Dim pprname As New OracleParameter 
      pprname.OracleDbType = OracleDbType.Varchar2 

      pprname.Value = prname 
      pcountbid.Value = countbid 

      cmd.Parameters.Add(pcountbid) 
      cmd.Parameters.Add(pprname) 

      conn.Open() 
      Return cmd.ExecuteNonQuery() 
     End Using 
    End Using 

End Function 

エラーは次のとおりです。

と、InvalidOperationExceptionは、私がやりたいことのすべては、これらの値を結合して、このクエリをexcecuteさ

未処理でした私のデータベースにデータを挿入します。

答えて

1

デフォルトであり、ここで行ったように位置モードでバインドを使用する場合、パラメータをOracleParameterCollectionコレクションに、SQL文に表示されるのと同じ順序で追加する必要があります。それはあなたの2つが同じであっても、実際には3つのパラメータを持つことを意味します(私はそれが本当にさらに真実であるかどうか質問します)。だからあなたのコードは、この

cmd.CommandText = "INSERT INTO BID " _ 
    + "(BID_ID, BID_NAME, BID_NAMEID, BID_STATUS, BID_FROM, BID_TO, BID_OWNER, NEW_USER, NEW_ZEIT, CHG_USER, CHG_ZEIT, AKTIV) VALUES " _ 
    + "(:1, :2, :3, '00', TO_DATE('01-JUL-16', 'DD-MON-RR'), TO_DATE('30-JUN-2099', 'DD-MON-RR'), '1', '1', SYSDATE, '1', SYSDATE, ' ')" 

    Dim pcountbid As New OracleParameter 
    pcountbid.OracleDbType = OracleDbType.Decimal '<- ID decimal or really Int32??? 

    Dim pprname As New OracleParameter 
    pprname.OracleDbType = OracleDbType.Varchar2 

    Dim pprnameID As New OracleParameter 
    pprname.OracleDbType = OracleDbType.Int32 'change to whatever type you really need 

    pprname.Value = prname 
    pprnameID.Value = CInt(prname) 'change as needed 
    pcountbid.Value = countbid 

    cmd.Parameters.Add(pcountbid) 
    cmd.Parameters.Add(pprname) 
    cmd.Parameters.Add(pprnameID) 

ようになるしかし、私は上記の私のコメントで述べたように、あなたはまた、いくつかの変数の型の問題を持っていると思います。小数はIDフィールドとしては意味がありません。また、BID_NAMEとBID_NAMEIDに同じ値を設定していました。つまり、varchar2でなく、数値(Oracleではtyp、Int32ではInt32)であり、実際に同じ値であるはずです。とにかく、テーブルの列の型を変数に格納したものと比較したら、必要に応じて変換することができます。最後に、ご注文をまっすぐにするために、パラメータコードをこのようにグループ分けして書き直したいと思います。

Dim pcountbid As New OracleParameter 
    pcountbid.OracleDbType = OracleDbType.Decimal '<- ID decimal or really Int32??? 
    pcountbid.Value = countbid 
    cmd.Parameters.Add(pcountbid) 

    Dim pprname As New OracleParameter 
    pprname.OracleDbType = OracleDbType.Varchar2 
    pprname.Value = prname 
    cmd.Parameters.Add(pprname) 

    Dim pprnameID As New OracleParameter 
    pprname.OracleDbType = OracleDbType.Int32 'change to whatever type you really need 
    pprnameID.Value = CInt(prname) 'change as needed 
    cmd.Parameters.Add(pprnameID) 
+0

私はBID_NAMEとBID_NAMEIDの両方にprnameの文字列値を設定します。 ただし、10進数をint32に変更して3組の値をバインディングに使用しても、同じエラーが発生します。 他のアイデアはありますか? –

+0

@SamaanShameem BIDテーブルに使用した作成ステートメントを表示できますか? – topshot

関連する問題