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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

1709閲覧

クラス定義無しでSQLの結果を受け取りたい

heart_crimson

総合スコア15

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/03/27 05:59

編集2019/03/27 08:02

前提・実現したいこと

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使用

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/03/27 06:33

VBじゃなくてVB.NETにするとよさげ。
heart_crimson

2019/03/27 07:31

コメントありがとうございます。修正しました。
退会済みユーザー

退会済みユーザー

2019/03/27 07:50 編集

Windows Forms アプリの話ですか? Dapper とか使ってます? それぐらいは質問に含めて書きましょうよ。
heart_crimson

2019/03/27 08:02

コメントありがとうございます。情報が足りず大変申し訳ございません。追記いたしました。まだ不足がございましたらご指摘いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2019/03/27 09:20

Dapper を使うのが必須条件ということですと自分は回答できませんが、必須でなくて、単純に IEnumerable(Of T) の T を定義するのが面倒ということであれば、そのクラス定義を含めてコードを自動生成してくれる ADO.NET Emtity Data Model のウィザードを使うというのはいかがですか? PostgreSQL のデザイナがどこまでサポートしているか不明ですが SQL Server と同等ならすべて自動生成してくれます。そんなとは十分ご承知で、そんな単純な話ではないということでしたら失礼しました。
heart_crimson

2019/03/29 00:53

Tの定義が面倒というのが事の発端です。「ADO.NET」というものを初めて聞きました。他の個所でもDapperを使用しているのでこちらも同じように使いたいですが、ADO.NETの使い勝手や仕様によっては使ってみようと思います。貴重なご意見ありがとうございます。
guest

回答1

0

sqlをxmlなどのDBへ格納し、プログラムでそこからsqlを読み出し
必要な個所を置き換えsqlを発行する方法でどうでしょうか?xmlに登録することにより(外部ファイル)sqlの整合性チェック(explain により)により確認したり
sqlとその説明を関連ずけることにより、sqlの仕様書を発行させる機能を提供することができるかと思います。また、explanにはsqlに所要する時間も計測する機能も(実際に更新するのでrollbackが必要)あります。これによりプログラム的な問題とsqlの問題を切り離して確認することができます。このように構築することにより、別システムでも再利用(利用するsqlを置き換えるだけで)することも可能になり、生産性向上にもつながるかと思います。
セキュリティに問題があるようであれば、xmlに登録したsqlを暗号化することも考慮するとより堅牢となることと思います。

投稿2019/07/19 09:00

akirafudo6

総合スコア341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問