mysql
  • sql
  • vb.net
  • 2017-07-19 15 views 0 likes 
    0

    Insertステートメントにイメージを追加しようとしたときに問題が発生しました。メッセージCommand Textプロパティが適切に初期化されていません

    コマンドテキストプロパティが正しく

    が登場初期化されていません。私は解決策を探してみましたが、それを解決する手がかりはまだありません。ここで

    は、コードは次のとおりです。

    Public Sub Insertplayer() 
        dbconn.ConnectionString = "server='" & My.Settings.ip & "';port=3306; user id='" & My.Settings.uid & "';password='" & My.Settings.pwd & "'; database= '" & My.Settings.db & "';" 
        dbcomm.Connection = dbconn 
        fname = imageurltxt.Text 
        Dim Content As Byte() = ImageToStream(fname) 
        Try 
         dbconn.Open() 
         Dim query As String 
         query = "INSERT INTO `player`(`ID`, `First_Name`, `Last_Name`, `Gender`, `Date_of_Birth`, `Civil_Status`, `Nationality`, `Address`, `Status', `Picture`) VALUES('" + TextBox7.Text + "','" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox9.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox8.Text + "', @Pic)" 
         dbcomm.Parameters.AddWithValue("@Pic", Content) 
         dbcomm.ExecuteNonQuery() 
         dbcomm = New MySqlCommand(query, dbconn) 
         dbread = dbcomm.ExecuteReader 
         dbread.Close() 
    
        Catch ex As Exception 
         MsgBox(ex.Message) 
        Finally 
         dbconn.Close() 
        End Try 
    End Sub 
    Private Function ImageToStream(ByVal fileName As String) As Byte() 
        Dim stream As New MemoryStream() 
    tryagain: 
        Try 
         Dim image As New Bitmap(fileName) 
         image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg) 
    
        Catch ex As Exception 
         GoTo tryagain 
        End Try 
        Return stream.ToArray() 
    End Function 
    
    +0

    SQLを作成するために文字列を連結することは決して避けてください - *すべて* shuldはSQLパラメータを使用し、グローバルDBオブジェクトは使用しません。 「GoTo」はとても悪い考えです。 – Plutonix

    +0

    dbcomm.ExecuteNonQuery()を呼び出す前にこの 'dbcomm.CommandType = query'のように初期化してください。 –

    +0

    @AlexanderHiggins - ' dbcomm.CommandText = query'でなければなりません。 –

    答えて

    0

    あなたはどのような方法でクエリを設定する前に

    dbcomm.ExecuteNonQuery() 
    

    を呼んでいます。 insertステートメントは、その時点でqueryという名前の文字列変数の内容としてのみ使用できます。

    変数dbcommは、あなたのコードサンプルではどこから来るのかは明らかではありません。

    +0

    dbcommはMySqlCommandです – Zetsu

    +0

    はい、私はそれを見ましたが、あなたはそれを使用した後に 'dbcomm = new MySqlCommand(query、dbconn)'で初期化します... –

    0

    あなたはdbcomm = New MySqlCommand(query, dbconn)

    INSERTクエリはのExecuteReader()されてはならないと言う行に起こるコマンドテキスト(設定する前に、dbcomm.ExecuteNonQuery()呼ばれてきました - あなたはいくつかの方法をしようとしてきたように見えますがここで働いて、試行錯誤を取得、現在はそこに残っ古いジャンクコードを持っている...

    コードが正しい順序である:FUTURE訪問者のための

    警告:このコードをコピーしたり、再使用しないでください。データベースへのアクセスは特に恐ろしい方法です。この記事の後半で、私はOPをダンプして、適切なデータベースアクセスライブラリを使用してやり直すことを頼みます。

    dbconn.Open() 
        Dim query As String 
        query = "INSERT INTO `player`(`ID`, `First_Name`, `Last_Name`, `Gender`, `Date_of_Birth`, `Civil_Status`, `Nationality`, `Address`, `Status', `Picture`) VALUES('" + TextBox7.Text + "','" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox9.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox8.Text + "', @Pic)" 
        dbcomm = New MySqlCommand(query, dbconn) 
        dbcomm.Parameters.AddWithValue("@Pic", Content) 
        dbcomm.ExecuteNonQuery() 
        dbconn.Close() 
    

    最後にdbConn.Close()を置くことは良いアイデアですが、このすべては、トライキャッチにする必要があります。あなたはそれを閉じる前に接続状態をチェックしたいかもしれません(例外がスローされないようにするために) - あなたはコールを失敗させたくありません。

    脇に、このコードをすべて投げてください離れたと誰もが/は、完全な文字列を持っていることによってconenctionsおよび挿入データを開閉する低レベルのデータベースのコードを書くべきではない(つまり、最後の10年間)は、この日および年齢では、データセットなどNHibernateは、Entity Frameworkのようなオブジェクト・リレーショナル・マッパーを使用してあなたのビジネスロジックコードのSQLのすべて。これは、今あなたのアプリケーション内のオブジェクトを知っているフレームワークによって処理され、データベースのデータを管理します。誰もアセンブリ言語や他の低レベルのguffを書き込んでいないのと同様の理由で、独自のデータベースコードを記述するのはクールではありません。巨大なセキュリティ上の問題を引き起こし、保守・開発が難しいコードの品質が低下します。

    補足:バグは以下のように指摘しています。データへのアクセス)このSQLの書かれた方法は本当に恐ろしいものであり、大きなセキュリティリスクです。テキストボックスの1つに注意深く配置されたアポストロフィと、それに続く特別に細工されたSQLと攻撃者は、データベース全体を消去したり、内容をダンプしたりすることができます。

    +0

    私はExecute Readerを削除します。パラメータ名:length'その後、 'dbcomm.ExecuteNonQuery()'を削除すると、エラーはなくなりますが、入力したデータはデータベースに記録されていません。また、 'dbcomm.Close() ) '' dbconn.Close() 'を意味しましたか? – Zetsu

    +0

    あなたが見ている新しいエラーは、 'string.Substring()'の一部の呼び出しの結果です。おそらく、dbコードとは関係ありません。 ExecuteNonQueryの呼び出しを削除すると、実際には何もDBに挿入されませんが、プレイヤーにDVDを置くのと同じ理由で再生ボタンを押さなくても、DVDは再生されません。executeNonQueryは挿入を実行するものですクエリ。 Entity Frameworkの使用に関する私の注意を参照してください。これらの低レベルでのデータベースアクセスはこれ以上行いません。あなたは90年代のチュートリアルを続けています –

    +0

    私はあなたが**改善する**コードを見ていくのを助けようとしていることを感謝します。それが立証しているように、これはSQLインジェクションに開放されており、コード内のあなたのポストで扱われるべきです。ユーザーが来て、テキストを読んでいないことを考えれば、コードをコピーして、うまくいきたいと思う価値がある。 – Bugs

    関連する問題