ASP.NET C#初学者です。
WebAPIを作成するために、ドキュメントに沿って学習しています。DBと連携しパラメータによって動的にデータを返すことを想定し、試しに単純なテストデータから任意のカラムデータを変数に代入する際にスコープの問題か変数への代入後の参照がうまくできず、フィールド変数で定義した場合は参照できましたが以下のコードの場所ではデバッグ実行できません。
開発環境(windows10, VisualStudio2015 Express for web, .NET Framework4.5.2)
テーブルデータは以下になります。
id | name | age |
---|---|---|
1 | taro | 19 |
2 | tadokoro | 24 |
```C# | ||
using AnimalsAppFor_C.Models; | ||
using Npgsql; | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Diagnostics; | ||
using System.Linq; | ||
using System.Net; | ||
using System.Web.Http; |
namespace AnimalsApp.Controllers
{
[RoutePrefix("api/animals")]
public class AnimalsController : ApiController
{
//①フィールド変数で定義すると値が割り当てられる。
string test;
Animal[] products = new Animal[] { //今回は関係がないので省略。 }; [HttpGet] [Route("")] public IEnumerable<Animal> GetAllAnimals() { return products; } [HttpGet] [Route("{id}")] public IHttpActionResult GetAnimal(int id) { //接続文字列 string conn_str = "Server=localhost;Port=5432;User ID=postgres;Database=postgres;Password=パスワード;Enlist=true";
//②リストクラスを定義したtest_listは正常にretunされる。
List<string> test_list = new List<string>();
//↓③これだと未割当のローカル変数が使用されましたとでる。
//string test;
using (var conn = new NpgsqlConnection(conn_str))
{
//PostgreSQLへ接続
conn.Open();
Debug.WriteLine("Connection success!");
var command = new NpgsqlCommand(@"select * from person", conn);
//↓④これだと現在のコンテキストに'test'は存在しませんとでる。
//string test;
var dataReader = command.ExecuteReader();
int i = 0;
while (dataReader.Read())
{
Debug.WriteLine("value : {0},", dataReader["name"]);
//配列ver
test_list.Add((string)dataReader["name"]);
//文字列ver
test = (string)dataReader["name"];
Debug.WriteLine(i + ":" +test);
i = i + 1;
}
conn.Close();
}
return Ok(test); /* ①の結果:"tadokoro" ③の結果:未割当のローカル変数が使用されましたとでる。デバック実行不可。
④の結果:現在のコンテキストに'test'は存在しませんとでる。デバック実行不可。
*/
//return Ok(test_list ); >> ②結果:["taro","tadokoro"]
}
}
}
④の場合、スコープによる参照ができていない問題だと思うのですが、③の場合、②と同じ場所に定義していますが、②は参照され、③は未割り当てとなるのはなぜでしょうか? そもそもwhile内に文字列として入れていることが不格好ですが、なぜ③のケースはダメなのか調べましたが思うような結果を得られず質問させていただきました。 何か参考になるサイトまたはご教授いただけないでしょうか? お願いいたします。
回答1件
あなたの回答
tips
プレビュー