ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

DbContextより、SQL文を直接実行する。

DbContextにSQL文を実行する。

MVC5以降(?)

int cnt = dbcontext.Database.ExecuteSqlCommand("delete tablename where id ={0}",id);
int cnt = dbcontext.Database.ExecuteSqlCommand("delete tablename where id =@p0",new object[] { id });

1行も文字列を返す

public string getClm1(DbContext context)
{
string sql = "select clm1 from tablename";
var result = context.Database.SqlQuery<string>(sql);
if (result != null)
  return result.toString();
else
  return string.Empty;
}

Entityを返す。

public List<Table1Model> getTable1(DbContext context)
{
string sql = "select * from table1";
var result = context.Database.SqlQuery<Table1Model>(sql);
if (result != null)
  return result.toList();
else
  return null;

SQL文を直接書いてEntityモデルに返す場合の注意点

  1. SQL文で実行する場合はColumnAttributeのカラム名設定が効かない
  2. 単純なSQLでもEntityモデルはテーブルとして正しく設定されている必要がある。

※基本、DbContextにより取得される場合、ColumnAttributeが設定されていれば、Property名が違っても正しくマッピングしてくれるが、SQL文の場合、Property名のみを認識するため、一致するカラム名がないとエラーになる。
※EntityモデルはEntityモデルであるとのこと、Keyがなかったり、おかしなところがあれば、Runtime errorになってしまう。

なんとも思うようにもならないのね。

DataTableにデータを取得する

DbProviderFactory factory = DbProviderFactories.GetFactory(_context.Database.Connection);

using (var cmd = factory.CreateCommand())
{
    cmd.CommandText = sqlQuery;
    cmd.CommandType = CommandType.Text;
    cmd.Connection = _context.Database.Connection;
    using (var adapter = factory.CreateDataAdapter())
    {
        adapter.SelectCommand = cmd;

        DataTable tb = new DataTable();
        adapter.Fill(tb);
        return tb;
    }
}