Accessの通貨型にはSystem.Decimal

TL;DR .Net FrameworkからAccessの通貨型の列に値を設定する場合は、System.Decimal型を利用する。 経緯 伝票番号が11桁の数値となるシステムにて、値をSystem.Int64型に格納していた。最終的にAccessのテーブルに格納する必要があり、こちらは通貨型で整数部11桁で定義していた。 OleDb経由でParameterを利用して(SQLにべた書きせずにobject型の変数として渡す)INSERTしたところ、何のエラーも吐かずにこけた。 どうも、System.Int64(=long)が渡されるとAccess側ではLong型(-2,147,483,648 ~ 2,147,483,647)に変換しようとするらしい。ただ、該当の列に「1L」(System.Int64型)を与えるとこけるが、「1」(System.Int32)ではこけないので、値そのものではなく型の違いによるエラーなのだと思われる。DEBUG実行してもエラーをはかずにこけるので切り分けに時間がかかった… 相手が通貨型11桁なのでそれに合わせてよしなに変換してくれるものと思っていたが甘かった。が、前回同じコードを実行した際にはエラーは起きなかったはずなのだが… 仕様が変わったのか? まぁ、特にAccessのような(レガシーな?)システムとの接続の際には、自動変換には期待せずこちらで必要な型が分かる場合は指定したほうが無難だと理解した。

July 21, 2021 · 1 min · tack41

テスト対象プロジェクトのコンテンツファイルが必要なテスト実行時の注意

要約 テスト対象プロジェクトのコンテンツファイルが存在することが必要となるテストを行う場合は、テストクラスに[DeploymentItem(@"Files\contents.xlsx", "Files")]の記述が必要 内容 Targetプロジェクトにて、Files\contents.xlsxをコンテンツ指定しており、これを利用する機能をTargetTestプロジェクトから実行する場合、何も考えずに実行するとFiles\contents.xlsxが見つからない旨のエラー(File or Directory Not found)が出る。 で、そのあとにテスト単体を個別に実行するとうまくいく。[選択して実行]と[すべてを実行]では実行パスが違い、前者では何も指定しなくてもコンテンツもコピーされるが、後者ではされないためのようだ。 [http://blog.livedoor.jp/nanoris/archives/51825230.html:embed:cite] 対応としては、TestClassのアノテーションの下にDeploymentItemのアノテーションを追加するとうまくいった。 [TestClass] [DeploymentItem(@"Files\contents.xlsx", "Files")]` public class TestClass{ ... ディレクトリ「Files」も指定しないとDirectoryNotFoundExceptionとなった。コンテンツファイルをテストプロジェクトにコピーする必要はない。

June 18, 2020 · 1 min · tack41

MSTest の実行順番

要約 MSTestは、複数クラスのメソッドを交互に実行しうる。これが困る場合は1つのクラスにまとめるべきかもしれない 内容 テストクラスAで更新系のテストをまとめてクラス初期化時にデータ整備を行い、テストクラスBで参照系のテストをまとめてテスト実行時にデータ整備を行っていた。 MSTestでは標準で並列実行はしないので問題ないと思っていたが、タイミングによって参照系のテストがこけることがあった。よくよく調べてみると、参照系のテストの一部が終わった状態で更新系のテストに移り、そこでデータが更新されてしまった状態で残りの参照系のテストが行われ、データが合わない状態だった。 並列実行しないというのはメソッド単位の話で、クラス単位のメソッドの実行順位が入れ子になることはあるようだ。成功したり、失敗したりするヤなパターンとなる。 対応として参照系、更新系を同一クラスにまとめ、全メソッドに対してメソッド実行時にデータ整備を行うこととした。 参照系のテストのみであればデータ整備はクラス初期化時でよいのだが、更新系が混ざる場合は参照系を含む全メソッドでメソッド実行時にデータ整備を行わないといけないということか。

June 18, 2020 · 1 min · tack41

DataGridViewの列の並び順

Windows FormのDataGridView .Net Framework 4.7.2 にて DataGridViewでDataSourceにDataTableを代入して利用する。 dataGridView1.DataSource = dt1; 1回目に列名2020/1,2020/2,2020/3,2020/4 の4つの列名を含むDataTableを設定。その後2019/10,2019/11,2019/12,2020/1 の4つを列名に含むDataTableを渡すと、重複する2020/1が 先頭に表示されてしまう。DataSource自体は全く別のオブジェクトなのだが、DataGridView側で前回のColumn情報を覚えていて、列名がマッチしたら使いまわしているのかもしれない。 対策としては、DataSourceに代入する前に dtaGridView1.Columns.Clear(); を実行すればよい。

June 8, 2020 · 1 min · tack41

IODATAのクラウドストレージ連携(S3)でエラー

IODATAのNASで利用しているクラウドストレージ連携でS3にバックアップしているのだが、今日、急に以下のようなエラーが出るようになった。 <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'ap-northeast-1'</Message><Region>ap-northeast-1</Region><RequestId>...</RequestId><HostId>...=</HostId></Error> NAS, S3側で特に設定変更はしていないのだが… クラウドストレージ連携のバージョン1.28が2020/2/26にリリースされているようなので、これが自動更新されたのかもしれない。 https://www.iodata.jp/support/qanda/answer/s30471.htm https://github.community/t5/GitHub-Actions/Cannot-get-an-AWS-Action-to-run-in-the-correct-region/td-p/17413 にあるように、既定で接続するとリージョンがus-east-1となり、ap-northeast-1リージョンのS3 bucketを操作しようとしてエラーとなっていると推測される。 対応として、詳細設定にあるエンドポイント指定にて、今まで未指定だったところに「s3.ap-northeast-1.amazonaws.com」を指定したところ、接続テストが成功することを確認。

March 26, 2020 · 1 min · tack41