0

私は現在、クラスのasp.netプロジェクトを仕上げており、必要条件の1つに大きな欠陥があることに気付き始めました。アプリケーションは 5 つの質問をし、その回答をデータベースに書き込みます。その後、調査の結果をユーザーに表示する必要があります。

これは私がこれまでに試みたことです:

 public static string GetConnectionString()
    {
        string connStr = String.Format("server={0}; user id={1}; password={2};" + "database= -table to be accessed-; pooling=false", 
            "-database server-", "-user-", "-password-");
        return connStr;
    } 

 protected void Button1_Click(object sender, EventArgs e)
    {

        if (Page.IsValid)
        {
            string sex = gender.Text;
            string likes = interests.Text;
            string edu = education.Text;
            string nation = nationality.Text;
            string userage = age.Text;

            MySql.Data.MySqlClient.MySqlConnection mycon;

            mycon = new MySqlConnection(GetConnectionString());

            try
            {
                MySqlCommand cmd = new MySqlCommand("INSERT INTO survey (gender, age, birthplace, occupation, winner) VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", mycon);
                cmd.ExecuteNonQuery();
                mycon.Open();
            }

            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }

            finally
            {
                mycon.Close();
            }

        }
    }

先に進み、データベース情報をプレースホルダーに置き換えました。

データベースは MySql で、外部サーバーでホストされています。

私が経験している問題は、コードはコンパイルされますが、情報がデータベースに書き込まれないことです。これがコードをまだテスト中であり、Web アプリケーションをサーバーにアップロードしていないという事実によるものなのか、それとも単に間違っているという事実によるものなのかはわかりません。

結果を表示する限り、上記のコードが正しければ、単純に SQL クエリを変更するだけですよね?

洞察力を前もって感謝します。

4

5 に答える 5

5

データベース接続を開く前にコマンドを実行しています。

ExecuteNonQuery()メソッドおよびその他すべての Execute メソッドでは、開いているデータベース接続が必要です。

もう 1 つのエラーは次のとおり
です。列の数 (つまり 5) と指定された値 (つまり 4) が等しくありません。

そして、 Steve Wellensが述べたように、コードのもう 1 つの問題がここにあります

以下のようにコードを変更します。

try
{
    MySqlCommand cmd = new MySqlCommand("INSERT INTO survey (gender, age, birthplace, occupation, winner) VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", mycon);
    mycon.Open();
    cmd.ExecuteNonQuery();
}    
catch (Exception ex)
{
    Response.Write(ex.Message);
}    
finally
{
    mycon.Close();
}

セキュリティに関する注意事項:

演算子dataを使用してクエリに追加しないでください。SQL インジェクション+を引き起こす可能性があります。

1); DROP TABLE <table-name> --ユーザーがAge TextBox..?? と入力するとどうなりますか?
誰でもデータベースからテーブルを完全に削除できます。

このような問題を回避するには、 MySQL パラメータを使用します。データベース全体に深刻な損害を与えるのを防ぐことができます。

于 2013-02-23T18:48:36.100 に答える
1

これはおそらく唯一の問題ではありませんが問題です。

"INSERT INTO survey (gender, age, birthplace, occupation, winner) " + 
"VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", 

(読みやすくするために、2 つの文字列に分割しています。)

5 つの列に挿入しています。4 つのデータ値のみを指定していますが、性別を除いて、正しい順序になっていないか、正しいデータでさえないようです。

于 2013-02-23T18:49:08.277 に答える
1

最初に接続を開いてから、クエリを実行する必要があります。

    try
                {
                    MySqlCommand cmd = new MySqlCommand("INSERT INTO survey (gender, age, birthplace, occupation, winner) VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", mycon);
                    mycon.Open();
                    cmd.ExecuteNonQuery(); 
                }
于 2013-02-23T18:02:17.357 に答える
1

接続文字列で:

"database= -table to be accessed-;

...テーブルを置きません。テーブルは SQL ステートメントで指定されます。

于 2013-02-23T17:30:56.980 に答える
-1

これらのことを確認してみてください:

  1. SQL を実行する前に接続を開いてみてください

  2. SQL を確認し、データベースに対して直接実行してみてください。あなたのSQLに表示されるのは、値を1つの文字列に連結していることです(引用符は最初と最後にのみ存在しますが、渡されたパラメーターの間には存在しません)

于 2013-02-23T17:35:46.953 に答える