3

次のような SQL クエリがあります。

SqlConnection conn = new SqlConnection(connectionString);

conn.Open();

SqlCommand cmd = new SqlCommand("SELECT id FROM Pages WHERE pageName=about",conn);
//cmd.Parameters.Add("@pageName","hakkinda");

SqlDataReader reader = cmd.ExecuteReader();

flID = reader.GetInt16(0);

reader.Close();
conn.Close();

エラー メッセージが表示されます。

Invalid attempt to read when no data is present.

どうしたの?

4

4 に答える 4

3

いくつかの潜在的な問題に気付きました:

データを読み取ろうとする前に、reader.Read() を呼び出す必要があります。これは通常、複数の行が必要な場合にループで行われます。

while (reader.Read()) {
    flID = reader.GetInt16(0);
}

また、SQL で「about」がリテラルであり、別の列名ではない場合、おそらくそれを一重引用符で囲む必要があります。

"SELECT id FROM Pages WHERE pageName='about'"
于 2012-09-22T19:52:32.480 に答える
0

クエリは 0 件の結果を返しています。これは、SQL 文字列のパラメーター値に引用符がないためです。次のように表示されます (「about」という単語が一重引用符で囲まれていることに注意してください)。

SqlCommand cmd = new SqlCommand("SELECT id FROM Pages WHERE pageName='about'",conn);
于 2012-09-22T19:51:53.520 に答える
0

DataReader.Read結果を取得するには、次のように呼び出す必要があります。

SqlDataReader reader = cmd.ExecuteReader();
reader.Read();

DataReader.Readブール値を返すため、結果が複数ある場合は、次のことができます。

while (reader.Read()) {
  // read data here
}

select ステートメントは次のようになります。

"SELECT id FROM Pages WHERE pageName='about'"
于 2012-09-22T19:55:55.433 に答える
0

単一の値のみが返されることが予想される場合は、.ExecuteScalar()を使用できます。

flID = int.Parse(query.ExecuteScalar().ToString());

また、pageName 値には単一引用符を使用します。

SqlCommand cmd = new SqlCommand("SELECT id FROM Pages WHERE pageName='about';",conn);
于 2012-09-22T20:12:45.390 に答える