0

名前、姓、電子メールを含むテーブルがあります。テーブルからそれらを取得したいので、次のように書きます。

if (LoginAs.SelectedValue == "Administrator")
{
    string result;
    string query = "Select * from AdminTable where ID='"+ idBox.Text +"'";
    cmd1 = new SqlCommand(query, con);
    result = Convert.ToString(cmd1.ExecuteScalar());

    Response.Redirect("Admin.aspx");
    //Admin user = new Admin(idBox.Text, "Active",  mail, firstName, LastName, passwordBox.Text);
}

問題は、「Select *」と書いたにもかかわらず、指定された行の名前フィールドしか返さないことです。ここで何が問題なのですか?

4

4 に答える 4

4

ExecuteScalarは最初の行の最初の列だけを返し、残りは無視します。

したがって、ExecuteReaderメソッドを使用する必要があります。MSDN の例:

using (SqlConnection connection = new SqlConnection(
           connectionString))
{
    connection.Open();

    SqlCommand command = new SqlCommand(queryString, connection);
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader[0]));
    }
}

while (reader.Read())は、クエリが (さらに) 結果を返したかどうかをチェックし、カーソルを次のレコードに配置して、それを読み取ることができることに注意してください。この例では、最初の列の値を出力します。
このusingステートメントは、何が起こっても、使用後に接続が確実に閉じられるようにします。

また、ユーザーからの入力 (TextBox の値など) を使用してクエリを直接作成しないでください。代わりにパラメーターを使用して、SQL インジェクション攻撃を防ぎます。

于 2013-05-27T11:02:35.413 に答える
3

ExecuteReader()使用する代わりに試してみる必要がありますExecuteScalar()

ExecuteScaler は、単一の値を読み取る必要がある状況で使用されます。例:

テーブル名から count(*) を選択します。

その間

ExecuteReader は、複数の行/列を持つ結果セットに使用されます (例: SELECT * from TableName)

于 2013-05-27T11:00:55.140 に答える
2

サンプルコード:

 string myQuery="Select * from AdminTable where ID=@myid";
 SqlCommand cmd=new SqlCommand(myQuery,conn);
 cmd.Parameters.AddWithValue("@myid", value);
 conn.Open();
 SqlDataReader dreader;
 dreader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
 while (dreader.Read())
 {
    string Value1= dreader["COl1"].ToString();
    string Value2= dreader["COl2"].ToString();
 }  
 dreader.Close(); 

パラメータ化されたクエリを常に使用する

于 2013-05-27T11:04:24.270 に答える
1

cmd1.ExecuteReader()代わりに試すことができます。

于 2013-05-27T11:00:50.623 に答える