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

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

.NetのEntityFrameworkCoreでSQL Server接続を設定してみた

EntityFrameworkCore設定

.NetプロジェクトにEntityFrameworkCoreを設定する歩法についてメモする。
今回の対象はSql Serverにするが、対象はNugetパッケージでインストールする物によって変わる。

ProjectにNugetパッケージを追加する。

バージョンはテスト時点のバージョン

 - Microsoft.EntityFrameworkCore.Design v5.0.11
 - Microsoft.EnrityFrameworkCore.SqlServer v5.0.11
 - Microsoft.EnrityFrameworkCore.Tools v5.0.11

※基本は「 Sqlserver」だけあれば接続可能

EntityFrameworkCore CLI Toolsのインストール

dotnet tool install --global dotnet-ef

EF Core ツールリファレンス (.NET CLI)-EF Core | Microsoft Docs

DbContextとModels作成

対象のプロジェクトファイルがあるフォルダーまで移動後、実行

dotnet ef dbcontext scaffold
 "Server=127.0.0.1;Database=testdb;User Id=sa;Password=password"
 Microsoft.EntityFrameworkCore.SqlServer
 -o Models

※生成ファイルはプロジェクトのModelsフォルダーに生成される。

接続情報の環境設定化

appsetting.json

{
  "ConnectionStrings": {
    "DBConnection": "Server=127.0.0.1;Database=testdb;User Id=sa;Password=password"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}
  • ConnectionStrings : 接続文字列情報
  • Microsoft.EntityFrameworkCore.Database.Command : SQLログ出力のため追加

Startup.cs修正

using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
public void ConfigureServices(IServiceCollection services)
{
#if DEBUG
    services.AddDbContextFactory<testdbContext>(opt => 
        opt.UseSqlServer(Configuration.GetConnectionString("DBConnection"))
        .EnableSensitiveDataLogging());
#else
    services.AddDbContextFactory<testdbContext>(
        options => options.UseSqlServer(
            Configuration.GetConnectionString("DBConnection")));
#endif
    services.AddRazorPages();
    services.AddServerSideBlazor();
    .....
}
  • DEBUG時にはEnableSensitiveDataLoggingにより、SQLログを出力する。

使用例

razor

@using Microsoft.EntityFrameworkCore
@implements IDisposable
@inject IDbContextFactory<testdbContext> DbFactory

@code {
private MyProject.Models.testdb context;
protected override async Task OnInitializedAsync()
{
    Busy = true;
    try
    {
        context = DbFactory.CreateDbContext();
        List = await context.Contacts
            .SingleOrDefaultAsync(c => c.Id == ContactId);
    }
    finally
    {
        Busy = false;
    }
    await base.OnInitializedAsync();
}
}

ASP.NET Core Blazor Server と Entity Framework Core (EFCore) | Microsoft Docs ASP.NET Core での依存関係の挿入 | Microsoft Docs

WPF用タイマー実装

WPF画面上で一定時間ごとにリフレシュする

普通のTimerではプロセスがSTAじゃないからとかエラーになったため、調べたらWPFの場合、WPF内部のDispatcherを利用しなければならないらしい

XAMLページ

using System.Threading;

public partial class MainWindow : Window
{
    private Timer _timer;

    public void CallBackTimerAction(object state) {
        this.Dispatcher.Invoke(new Action(() => {  
            ///MyAction// 
        }) );
    } 

    public void StartTImer()  {
        _timer = new Timer(CallBackTimerAction, null, Timeout.Infinite, Timeout.Infinite);
       _timer.Change(0, 10000); // 10秒単位で、すぐ実行

      //終了時にタイマーを停止させる。
      this.Closing += (s, o) => {
          _timer.Change(Timeout.Infinite, Timeout.Infinite); // タイマ停止
         _timer.Dispose();
      };
    } 
}
  • CallBackTimerAction(object state) タイマーが実行する処理、ここでDispatcher.Invokeされる。
  • new Timer(CallBackTimerAction, null, Timeout.Infinite, Timeout.Infinite); タイマーを定義、コールバックを指定する。
  • _timer.Change(0, 10000); すぐ実行後、10000ミリ秒後に再度コールバックされる。
  • this.Closing += (s, o) タイマーは自動で終了しないため、Window終了時に一緒に終了する。

Ubuntu 20.04にdotnetをインストール

dotnet インストール

Linuxで環境構築してみようと思ってので、Ubuntu 20.04にdotnetインストール手順を残してみます。

信頼されたキーの一覧に Microsoft パッケージ署名キーを追加

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

SDKインストール

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

ランタイムのインストール

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y aspnetcore-runtime-5.0

参考

コマンドは以下を参照しました。バージョンによって非対応の場合があるようなので、最新を確認して実行する必要があります。

dotnet ubuntu関連
https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu

dotnet Help
https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet

VS Code エディター関連メモ

Macで「code .」で起動出来るようにする。

何回もやっているが、すごく忘れぽくて毎回探すことになってしまっているので、メモっときます。

  • VS Codeを起動
  • コマンドパレットを起動(Command + Shift + P)
  • Shellと入力し以下を選択
    • Shell Command: Install 'code' command in PATH

OracleのRAW型をSQL ServerのVARBINARY型への移行方法

OracleのテーブルをMSSQLへ移行する

ORACLEがRAW型を持つデータがあり、SQL Serverへ移行する方法を探した結果
なんとか解決したので、メモ。

OracleのRAW型に対応するMS SQLServerの型はVARBINARY型

ORACLE

  CREATE TABLE rawdata
   (
      PASSWORD RAW(64)
   ); 

SQL SERVER

  CREATE TABLE bindata
   (
      PASSWORD VARBINARY(64)
   ); 

OracleのRAW型はRAWTOHEXでHEX値として出力

SELECT RAWTOHEX(PASSWORD) AS PASSWORD FROM rawdata;
-------
PASSWORD
88db98ae696277dd28b0d2bda6e3....
eaead8048dbe6d7f375bfd11d8947f....

SQLSERVERへは’0x'をつけてHEX値としてINSERTする

insert into bindata values (0x88db98ae696277dd28b0d2bda6e3....);

ORACLEのSELECT文でInsert文を作る

SELECT
 'insert into bindata values (0x' || RAWTOHEX(PASSWORD)  || ');'
FROM bindata

参考

RAW Data Type - Oracle to SQL Server Migration - SQLines Open Source Tools

タスクスケジューラ、タスク作成メモ

(0x1)エラーになる

操作のプログラムをbatファイルにしていたりすると、実行パスが認識されず、エラーになる。
解決:開始(オプション)に実行パスを設定してする。

その他、 最上位の権限で実行するがチェックされていると同じエラーになる。

裏でタスクが実行されていない?

確認する。 全般の「ユーザーがログオンしているかどうかに関わらず実行する」にチェックをいれる。

Image 関連メモ

Imageの変換

Imageからbyte[]への変換

ImageConverter imgconv = new ImageConverter();
byte[] b = (byte[])imgconv.ConvertTo(myThumbnail, typeof(byte[]));

byte[]へからImageへの変換

byte[] b ;
Image img;
using (var ms = new System.IO.MemoryStream(b)) {
    img = Image.FromStream(ms);
}

byte[]からBase64への変換

byte[] b ;
String base64 = Convert.ToBase64String(b);

サムネイル画像を生成する

// Callback指定、Delegateは使用できない模様
public bool ThumbnailCallback()
{
    return false;
}

public main() 
{
    Image img = new Image("c:\work\img1.jpg");

    Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
    Image myThumbnail = img.GetThumbnailImage40, 40, myCallback, IntPtr.Zero);
}

イメージをWebページに表示する

public String ImageSrcBase64
{
    get
    {
        return Convert.ToBase64String(_b);
    }
}
<img src="data:image/jpeg;base64,<%=Html.DisplayFor(m => m.ImageSrcBase64) %>"

参考

https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.getthumbnailimage?view=dotnet-plat-ext-3.1

https://edge.sincar.jp/web/base64-inline-image/