0

mysql のテーブルから値を読み取る際に問題が発生したのは、何があっても値を読み取ることができないインデックス値です。私が得るのは初期化された0の値だけです。データベースでクエリを実行すると、0が返されるため、エラーは発生しません。正しい値が得られます。executeScalar() を使用しようとしましたが、結果は同じでした。

     MySqlConnection conn = new MySqlConnection(MyConString);
    ulong ukey=0;
            try
            {
                string sql_users2 = "SELECT `key` FROM `permuser` WHERE `user` = '" + myuser + "' AND `code` = '" + mycode + "'";
                MySqlCommand cmdSel2 = new MySqlCommand(sql_users2, conn);
                conn.Open();
                MySqlDataReader dr2 = cmdSel2.ExecuteReader();
                dr2.Read();

                    ukey = dr2.GetUInt64(dr2.GetOrdinal("key")); 
                   // MessageBox.Show("Sorry " + myuser + " already have access to " + mycode + ",\nIf this is an extension, search for the user which key is  " + ukey + "   and edit the end date.", "Duplicate User Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                dr2.Close();
                dr2.Dispose();
            }
            catch (MySqlException ex) //catch 2
            {

                MessageBox.Show("catch ukey\nCan't connect to database\n" + ex.ToString());
            }

            conn.Close();
            conn.Dispose();     
4

2 に答える 2

1

クエリから単一の値を返すため、ExecuteReader の代わりにExecuteScalarを直接使用できます。(リンクは SqlServer の説明を指していますが、MySql でも同じです)

決して忘れてはならない重要な質問は、文字列連結の代わりにパラメーターを使用することです。または変数に一重引用符が含まれている
とどうなりますか? 間違った結果や構文エラーが発生します。もちろん、主な問題は決して過小評価されていないSQL インジェクション攻撃です。myusermycode

using(MySqlConnection conn = new MySqlConnection(MyConString))
{
    ulong ukey=0;
    try
    {
        string sql_users2 = "SELECT `key` FROM `permuser` WHERE `user` = @usr AND `code` = @code";
        MySqlCommand cmdSel2 = new MySqlCommand(sql_users2, conn);
        conn.Open();
        cmdSel2.Parameters.AddWithValue("@usr", myuser);
        cmdSel2.Parameters.AddWithValue("@code", mycode);

        object result  = cmdSel2.ExecuteScalar();
        if(result != null)
            ukey = Convert.ToUInt64(result); 


    }
    catch (MySqlException ex) //catch 2
    {
        MessageBox.Show("catch ukey\nCan't connect to database\n" + ex.ToString());
    }
}

また、UInt64 の使用方法についても少し困惑しています。key列に格納されるデータ型は何ですか?

于 2013-01-03T15:34:57.110 に答える
0

方法は単純にたくさんあります:

ukey = (uint)dr2[0];
于 2013-01-03T15:30:00.147 に答える