2016-12-10 76 views
1

誰かが自分のコードを見て、私のPostgresデータベースにデータを挿入できない理由を教えてもらえますか?私は自分のコレクションのためのコミックブックデータベースを作成しています。NpgsqlとVB.netを使用してPostgresqlにデータを挿入する際に問題が発生する

に起こるNpgsql.PostgresExceptionが

「Npgsql.dllに発生した 『』タイプの未処理の例外」:

毎回私はクリックデータが入力された提出するボタンを提出し、デバッガが例外をスローしますmyCommand.ExecuteNonQuery()関数の実行

私はこのことを理解しようと努力してきましたが、私はこれで完全なノブです。どんな指導もすばらしいでしょう!

Dim myConnection As NpgsqlConnection = New NpgsqlConnection() 
     Dim myCommand As NpgsqlCommand 
     Dim mySQLString As String 
     myConnection.ConnectionString = "Server=localhost;Port=5432;Database=ComicsDatabase;User Id=postgres;Password=xxxxxxxx;" 

     mySQLString = "INSERT INTO Comics (IssueName,IssueNumber,PublicationDate,Publisher,IsVariant) VALUES (" & comicName & "," & issueNumber & "," & publicationDate & "," & publisher & "," & isVariant & ");" 
     myCommand = New NpgsqlCommand(mySQLString, myConnection) 
     myConnection.Open() 
     myCommand.ExecuteNonQuery() 
     myConnection.Close() 

答えて

0

上記のように文字列を連結してsqlコマンドを作成すると、一般的なエラーになりやすいです。たとえば、コードでは、文字列の値を一重引用符で囲む必要があります。

ので、IssueNameは、文字列型のフィールドであると仮定すると、あなたはこの方法で

.... VALUES ('" & comicName & "'," & .... 

を値を表現しなければならない。しかし、これは病気よりも救済策悪いです。文字列の連結がSql注入(非常に危険なコードの脆弱性)につながる主な方法です。

唯一正しい方法で値を渡すことができます。データベースエンジン(...この世界の任意のデータベースエンジン)は、パラメータ化されたクエリを使用しています

の値の代わりにパラメータプレースホルダを置くクエリを記述します(文字列の連結はありません。&とシングルクォーテーション.... )

mySQLString = "INSERT INTO Comics 
    (IssueName,IssueNumber,PublicationDate,Publisher,IsVariant) 
    VALUES (:comicName,:issueNumber,:publicationDate,:publisher,:isVariant);" 

そして、その後、あなたはパラメータを使用して値を渡すコマンドパラメータコレクションプレースホルダで必要とされる他のすべてのパラメータを追加する必要があります。もちろん、

myCommand = New NpgsqlCommand(mySQLString, myConnection) 
    myCommand.Parameters.Add(":comicName", NpgsqlDbType.Varchar).Value = comicName 

に追加し、心に留めておくべき重要なことは、のために正しいNpgsqlDbTypeを使用することです更新しようとしている特定の列

+1

説明ありがとうございます!私は特別なキャラクターを持った漫画を持っていることを私の頭の中でも垣間見なかった! さらに掘り下げた後、 'myConnection.Open()'のようなものが原因である可能性があります。 デバッガは、次のような内部例外をスローしています。 ノンブロッキングソケット操作をすぐに完了できませんでした。 私はこれを理解できるかどうかを確認するためにGoogleに問い合わせます。 もう一度、ありがとうございました! – Eldridge

関連する問題