2017年2月23日木曜日

SQL ループ文でインクリメント

ループして複数行を挿入する SQL 文を書いてみました。

テーブルはこんな構成です。







register 列は DateTime 型のデータです。ループの中では変数の @index を利用して
分(MINUTE)の部分をインクリメントして追加しています。

DECLARE @index int;
SET @index = 1;
WHILE @index < 10
BEGIN
 DECLARE @toDate   DATETIME = DATEADD(DAY, -1, GETDATE())
 INSERT [Test1].[dbo].[TestTable] (id, name, register) 
    VALUES(
  @index,
  'user' + LTRIM(STR(@index)),
  (SELECT DATEADD(MINUTE, @index, @toDate))
  ); 
 SET @index = @index + 1
END


実行すると行が複数挿入されており、分の部分が1ずつ増加しています。



2017年2月12日日曜日

ASP.NET MVC ビューにクラスインスタンスを渡す際のエラー(InvalidOperationException)

2つのモデルを結合したモデルを表示しようとしたところ、こんなエラーが出ました。

--------エラーここから--------

'/' アプリケーションでサーバー エラーが発生しました。

ディクショナリに型 'System.Collections.Generic.List`1[WordLearner.Models.WordDetail]' のモデル項目が渡されましたが、このディクショナリには型 'WordLearner.Models.WordDetail' のモデル項目が必要です。

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.InvalidOperationException: ディクショナリに型 'System.Collections.Generic.List`1[WordLearner.Models.WordDetail]' のモデル項目が渡されましたが、このディクショナリには型 'WordLearner.Models.WordDetail' のモデル項目が必要です。

--------エラーここまで--------

調べてみると同じエラーで困っている人がいました。
Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery`1[]' using linq lambda expression
http://stackoverflow.com/a/22918838

そして回答も掲載されていました。今回検索結果のオブジェクトをビューに返すところを、クエリの状態でビューに渡しているのが原因でした💨
変数 query に FirstOrDefault() メソッドでオブジェクトを取得することで解決しました。


public ActionResult Test(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Word word = db.Word.Find(id);
    if (word == null)
    {
        return HttpNotFound();
    }
    
    int _id = id.Value;
    var meaning = db.Meanings;
    var query = from x in db.Word
              join y in meaning on x.ID equals y.WordID
              where x.ID.Equals(_id)
              select new WordDetail
              {
                  ID = x.ID,
                  Spelling = x.Spelling,
                  Meaning = y.Meaning
              };
    
    return View("Details", query.FirstOrDefault());
}