前提・実現したいこと
VBでSQLを投げ、帰ってきた結果を表示させようと思います。
今まではクラスを作成し、そこにマッピングさせていたのですが、
今回はこの場所でしか使わないSQLであるため、クラスを作るのが面倒に思いました。
クラスを宣言せずに結果を入手することはできますでしょうか?
発生している問題・エラーメッセージ
A parameterless default constructor or one matching signature (System.Int32 id, System.String name, System.Decimal quantity) is required for System.Tuple`4[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] materialization 以下、スタックトレース 場所 Dapper.SqlMapper.GetTypeDeserializerImpl(Type type, IDataReader reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) 場所 Dapper.SqlMapper.TypeDeserializerCache.GetReader(IDataReader reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) 場所 Dapper.SqlMapper.TypeDeserializerCache.GetReader(Type type, IDataReader reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) 場所 Dapper.SqlMapper.GetDeserializer(Type type, IDataReader reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) 場所 Dapper.SqlMapper.<QueryImpl>d__69`1.MoveNext() 場所 System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 場所 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 場所 Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) 場所 Test.Database.DBAccessDapper.SelectSql[T](String sql, Object parameters) 場所 ***Test\Database\DBAccessDapper.vb:行 212 場所 Test.MyProject.TestDao.GetList[T](DBAccessDapper db, Boolean deleteContain) 場所 ***Test\MyProject\Dao\Impl\TrnTestDao.vb:行 277
該当のソースコード
DBAccessDapper
1Imports System.IO 2Imports System.Reflection 3Imports MyProject.Utils 4Imports Dapper 5Imports Npgsql 6 7Namespace Database 8 9 Public Class DBAccessDapper 10 Implements IDisposable 11 12#Region "定数" 13 14 Private Const DATABASE_ENCODING As String = "UTF8" 15 16#End Region 17 18#Region "Private変数" 19 20 Private Connection As IDbConnection 21 Private Transaction As IDbTransaction 22 Private Shared _DbConfigData As DbConfigData 23 Private ReadOnly Property IsConnected As Boolean 24 Get 25 Return If(Connection IsNot Nothing, Connection.State = ConnectionState.Open, False) 26 End Get 27 End Property 28 29#End Region 30 31#Region "Publicメソッド" 32 33 ''' <summary> 34 ''' コンストラクタ 35 ''' </summary> 36 Public Sub New() 37 Try 38 DefaultTypeMap.MatchNamesWithUnderscores = True 39 GetDbConfiData() 40 Open() 41 Catch ex As Exception 42 Throw New Exception("接続に失敗しました。" & " : " & ex.Message, ex) 43 End Try 44 End Sub 45 46 ''' <summary> 47 ''' コンストラクタ 48 ''' </summary> 49 Public Sub New(ByVal hostName As String, ByVal port As Integer, ByVal userName As String, password As String, ByVal databaseName As String) 50 Try 51 DefaultTypeMap.MatchNamesWithUnderscores = True 52 Open(hostName, port, userName, password, databaseName) 53 Catch ex As Exception 54 Throw New Exception("接続に失敗しました。" & " : " & ex.Message, ex) 55 End Try 56 End Sub 57 58 ''' <summary> 59 ''' データベースへの接続処理 60 ''' ※接続情報を設定ファイルから取得 61 ''' </summary> 62 Public Sub Open() 63 Open(_DbConfigData.ServerName, _DbConfigData.Port, _DbConfigData.UserId, _DbConfigData.Password, _DbConfigData.DatabaseName) 64 End Sub 65 66 ''' <summary> 67 ''' データベースへの接続処理 68 ''' ※接続情報を引数から取得 69 ''' </summary> 70 ''' <param name="hostName">ホスト名</param> 71 ''' <param name="port">ポート</param> 72 ''' <param name="userName">ユーザー名</param> 73 ''' <param name="password">パスワード</param> 74 ''' <param name="dbName">データベース名</param> 75 Public Sub Open(ByVal hostName As String, ByVal port As Integer, ByVal userName As String, password As String, ByVal dbName As String) 76 If Connection Is Nothing Then Connection = New NpgsqlConnection 77 78 Dim connStrBuilder As New NpgsqlConnectionStringBuilder 79 Try 80 '接続情報の設定 81 connStrBuilder.Host = hostName 82 connStrBuilder.Port = port 83 connStrBuilder.UserName = userName 84 connStrBuilder.Password = password 85 connStrBuilder.Database = dbName 86 87 '接続文字列の作成 88 Connection.ConnectionString = connStrBuilder.ToString 89 90 '接続 91 Connection.Open() 92 Catch ex As Exception 93 Throw New Exception("接続に失敗しました。" & " : " & ex.Message & "|" & connStrBuilder.ToString, ex) 94 End Try 95 End Sub 96 97~省略~ 98 99 ''' <summary> 100 ''' SQLの実行(SELECT) 101 ''' </summary> 102 ''' <typeparam name="T"></typeparam> 103 ''' <param name="sql">SQL文</param> 104 ''' <param name="parameters">SQLパラメーター</param> 105 ''' <returns></returns> 106 Public Function SelectSql(Of T)(ByVal sql As String, Optional ByVal parameters As Object = Nothing) As IEnumerable(Of T) 107 If Not IsConnected Then Throw New InvalidOperationException("データベースに接続されていません。") 108 109 Return If(parameters IsNot Nothing, Connection.Query(Of T)(sql, parameters), Connection.Query(Of T)(sql)) 110 End Function
TestDao
1 ''' <summary> 2 ''' データ取得 3 ''' </summary> 4 ''' <remarks></remarks> 5 Public Function GetList(Of T)(db As DBAccessDapper, Optional ByVal deleteContain As Boolean = False) As IEnumerable(Of T) 6 Dim query As New StringBuilder 7 query. 8 Append("SELECT "). 9 Append(" id "). 10 Append(", name "). 11 Append(", quantity "). 12 Append("FROM "). 13 Append(" mst_Test"). 14 15 Try 16 Dim temp = db.SelectSql(Of Tuple(Of Integer, String, Decimal))(query.ToString) 17 18 Return temp 19 Catch ex As Exception 20 Throw New Exception(ex.Message, ex) 21 End Try 22 End Function
id(integer) | name(character varying(128)) | quantity(numeric(16,6)) |
---|---|---|
1 | 一郎 | 1.5 |
2 | 二郎 | 1.8 |
3 | 三郎 | 1.75 |
試したこと
Tupleもしくは匿名型を使えばなんとかなりそうだと思ったのですが、書き方が分かりませんでした。
(現状のソースはTupleを使ってみようとしています)
参考:Dapperで匿名型を使う
こういった場合のベストプラクティスをご教授いただけると幸いです。
どうぞよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
VB 2012
.NET Framework 4
Postgresql 9.3
Windows Forms使用