【解決方法】コマンド実行中に致命的なエラーが発生しました


'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Fatal error encountered during command execution.

私が試したこと:

<pre> mcmd.CommandText = "delete from results"
        mcmd.Connection = mycon
        mcmd.ExecuteNonQuery()
        mcmd.CommandText = "insert into results (MOB_NO, CNAME, BIRTH_DATE, F_H_NAME, L_HOUSE_NO, L_STREET, L_LOCALITY, L_CITY, L_STATE, L_PIN, ALTER_TELE_NO, CONN_TYPE, ACT_DATE) select MOB_NO, CNAME, BIRTH_DATE, F_H_NAME, L_HOUSE_NO, L_STREET, L_LOCALITY, L_CITY, L_STATE, L_PIN, ALTER_TELE_NO, CONN_TYPE, ACT_DATE from addressfull where " & crtext
        mcmd.Connection = mycon
        mdataadapter.SelectCommand = mcmd
        mdataadapter.Fill(myData)
        mcmd.ExecuteNonQuery()
        mcmd.CommandText = "select MOB_NO, TSP_NAME, CNAME, BIRTH_DATE, F_H_NAME, L_HOUSE_NO, L_STREET, L_LOCALITY, L_CITY, L_STATE, L_PIN, ALTER_TELE_NO, CONN_TYPE, ACT_DATE,ID_DOCMENT_NO from results"
        mcmd.Connection = mycon
        mdataadapter.SelectCommand = mcmd
        mdataadapter.Fill(myData)
        dgvmobilenos.DataSource = myData

解決策 1

まず、そんなことしないでください! 文字列を連結して SQL コマンドを作成しないでください。 偶発的または意図的な SQL インジェクション攻撃にさらされ、データベース全体が破壊される可能性があります。 代わりに常にパラメータ化されたクエリを使用してください。

文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

SQL に関する限り、ユーザーが追加した引用符によって文字列が終了するため、問題が発生します。 しかし、さらに悪化する可能性もあります。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL はまったく異なるコマンドを受け取ります。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

SQL では、次の 3 つの個別のコマンドとして認識されます。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全に有効な SELECT

SQL
DROP TABLE MyTable;

完全に有効な「テーブルの削除」コマンド

SQL
--'

それ以外はすべてコメントです。
つまり、一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。

したがって、常にパラメータ化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元できるように準備してください。 バックアップは定期的に取っていますよね?

しかし、ここでアドバイスをやめなければなりません。私たちはあなたのデータベースやあなたが扱っているデータにアクセスできず、コードのどこでエラーが発生しているのかわかりません。

それはあなた次第です。
幸いなことに、何が起こっているかを調べるのに役立つツール、デバッガーが利用可能です。 使い方がわからない場合は、Google で「Visual Studio デバッガー」を検索すると必要な情報が得られます。

関数の最初の行にブレークポイントを設定し、デバッガーでコードを実行します。 次に、コードとデータを調べて、手動で何が起こるかを考えます。 次に、各行を 1 ステップずつ実行して、期待したことが実際に起こったかどうかを確認します。 そうでない場合は、問題が発生しているときなので、前に戻って (またはもう一度実行して詳しく調べて) 理由を調べることができます。

申し訳ありませんが、私たちはそれを行うことはできません。新しい (そして非常に便利な) スキルであるデバッグを学ぶ時期です。

コメント

タイトルとURLをコピーしました