質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

2回答

572閲覧

SQLiteへのサンプル登録のC#コードの重複をなくしたい

Q12

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2019/02/14 08:04

こんにちは。

前提・実現したいこと

先ほどはSQLiteにご示唆いただきありがとうございます。
SQLは少し経験がありますがSQLiteは初心者なので、ちがいにとまどっています。

今回の質問はSQLiteへのサンプル登録のC#コードの重複をなくしたい件です。

発生している問題

SQLiteに登録用のC#コードを書き、サンプル登録をしました。
Model(=table)ごとにコードを書いて動くことは動きました。
サンプルも登録できました。
ところがこのコード、Modelを渡すので、同じコードがテーブルの数だけできてしまい、保守性がありません。
List<Model>のかわりにList<object>とすると、

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー 型 'Microsoft.VisualStudio.DesignTools.WpfDesigner.InstanceBuilders.WindowInstance' のオブジェクトを型 'DamabaseManager.MainWindow' にキャストできません。 DamabaseManager MainWindow.xaml 2

という、意味不明のエラーとなります。
プロジェクトはWPFです。

該当のソースコード

C#

1 public static void InsertData(List<Model> items) 2 { 3 // SampleDb.sqlite を作成(存在しなければ) 4 using (var connection = new SQLiteConnection("Data Source=Model.sqlite")) 5 { 6 // データベースに接続 7 connection.Open(); 8 // コマンドの実行 9 using (var command = connection.CreateCommand()) 10 { 11 try 12 { 13 var index = SQLiteCreateTableUtility.CreateTable(command, typeof(Model), null, "id"); 14 SQLiteCreateTableUtility.CreateIndex(command, typeof(Model), index); 15 16 InsertSample(connection, items); 17 } 18 catch (Exception exception) 19 { 20 throw; 21 } 22 } 23 // 切断 24 connection.Close(); 25 } 26 } 27 28 private static void InsertSample(SQLiteConnection connection, List<Model> items) 29 { 30 // データ挿入 31 using (DataContext context = new DataContext(connection)) 32 { 33 Table<Model> additems = context.GetTable<Model>(); 34 foreach (var item in items) 35 { 36 try 37 { 38 additems.InsertOnSubmit(item); 39 } 40 catch (Exception exception) 41 { 42 throw; 43 } 44 } 45 try 46 { 47 context.SubmitChanges(); 48 } 49 catch (Exception exception) 50 { 51 throw; 52 } 53 } 54 } 55

試したこと

List<Model>のかわりにList<object>としてみた。

ひょっとして、CastすればOKでしょうか?

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2017
Version 15.9.2
VisualStudio.15.Release/15.9.2+28307.108
Microsoft .NET Framework
Version 4.7.03190
OS Microsoft Windows 10 Pro
SQLite System.Data.SQLite.Core v1.0.109.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

https://ufcpp.net/study/csharp/sp2_generics.html

Genericを使おう。

public static void InsertData<T>(List<T> items) { }

こういう感じのやつ。

投稿2019/02/14 08:27

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

いまいち掴めてないのですが、↓こういうこと?(このほかに、additemなんかも<T>にします)

csharp

1 private static void InsertSample<T>(SQLiteConnection connection, List<T> items)

まだあった↓こちらも(typeof(T)とする)

csharp

1public static void InsertData<T>(List<T> items)

投稿2019/02/14 08:27

編集2019/02/14 08:28
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q12

2019/02/15 09:00 編集

ありがとうございます。 早速、下記のようにしてみましたが、エラーになっています。 ``` private static void InsertSample(SQLiteConnection connection, List<Model> items) ``` を ``` private static void InsertSample<T>(SQLiteConnection connection, List<T> items) ``` ``` Table<Model> additems = context.GetTable<Model>(); ``` を ``` Table<T> additems = context.GetTable<T>(); ``` エラーは、 ``` 型Tはジェネリック型のパラメータTEntityまたはメソッドTable<TEntity>として使用するために、参照型でなければなりません。 ``` です。 これはどのように回避すればよいでしょう?
Q12

2019/02/26 05:14

ありがとうございます。 しばらくコーディングから外されていて検証できませんでした。 ようやく戻ってきてテストしたところうまくいきました。 「型パラメーターの制約」初めてでした。覚えます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問