みなさん。こんにちは。。。ビジネスプロダクツグループ(以下BG)のグリーンアーミーメンです。

初投稿なので、真面目にプログラミングの話をしたいと思います。

皆さん。iBatis.netは使ってますか?

Javaでは普通に愛されているORマッパーですが、.Netは開発が止まったせいか今はほとんど人気がなくなった感じですね。

今は名前だけがMyBatis.netになっているだけで、中身は同じでした。

.Net系はiBatis以外にもLINQとかMapper、Entity FrameworkなどORマッパーの選択肢が多いものもiBatis.netの開発が止まった理由かもしれません。

なんの話をしようとしたんだろう。。

あ。。そうです。このiBatis.netの結果をList型ではないDataTableで貰えないかと思い作って見ました。

今は研究(?)段階で止まっていますが、

もし、私と同じことを考えた方がいらっしゃいましたら、どうぞぜひ使ってみてください。


 

■やりたいこと

SqlCommandをやめて、ORマッパーを使いたい。

なぜ?

SQLエスケイプするのが面倒だから

■何を悩んでるの?

DataTableも使いたい

なぜ?

便利だから

 

そうです。DatagridViewとDataTableは相性が良く、とっても仲いい相棒だと思っています。

iBatisは戻り値がList<Object>型になっちゃうのが残念なところでした。

 

■結果、こんなことできないか!と思いました。

 iBatisを使って、ORマッピングを行い、その結果をDataTableでもらいたい。

 

まず、グーグル先生に聞いてみました。

「世界中、私だけこんなこと考えたはずがない。きっと誰かが同じことやったはずだ!」と思いましたが、

なかなか見つからず。

「世界中、私だけこんなこと考えたかもしれない。」

それって偉いことなのか・・・?わかりませんが、

「私は偉い!」

ということにして作ってみました。

 

まず、宣言ですね。

 Dim mapper As ISqlMapper = Nothing 
 Dim session As SqlMapSession = Nothing 
 Dim statement As IMappedStatement = Nothing
 Dim request As RequestScope = Nothing
 Dim dom As New DomSqlMapBuilder()
 Dim result As Integer = 0
 Dim mysql_connection As New MySqlConnection
 Dim myCommand As New MySql.Data.MySqlClient.MySqlCommand

え?こんなの必要なの?

そうです。世界中、初めてのことなので、こんなことしなければなりません。

 

ここからが本番です。

 '空でもいいです。 
 mapper = DaoFactory.Instance("")

 'コネクション無しでSqlMapを作成する
 session = New SqlMapSession(mapper)

 'SQLをXMLから取得
 'sql_id : iBatisのsql.xmlのidです
 statement = mapper.GetMappedStatement(sql_id)
 'リクエストを作成する
 request = statement.Statement.Sql.GetRequestScope(statement, entity, session)
 'DBCommandを作成する
 'entity : Set,GetのEntityです。パラメータとしてもらいます。
 '★ここです。ここでマッピングが行われるんですよ。★素敵ー!
 statement.PreparedCommand.Create(request, session, statement.Statement, entity)
 
 'ここからはちょっとイマイチ感が満載ですが、DataTableを作るためにDataAdapterを生成します。
 da = New MySql.Data.MySqlClient.MySqlDataAdapter(request.IDbCommand.CommandText, mapper.DataSource.ConnectionString)
 For i As Integer = 0 To request.IDbCommand.Parameters.Count - 1
     Dim mysql_param As MySqlParameter = DirectCast(request.IDbCommand.Parameters(i), MySqlParameter)
     'DbParameterのコピー(そのままインスタンスをAddするだけだと例外がスローされる)
     'こんなに要る????
     Dim new_mysql_param As New MySqlParameter(mysql_param.ParameterName, _
                                               mysql_param.MySqlDbType, _
                                               mysql_param.Size, _
                                               mysql_param.Direction, _
                                               mysql_param.IsNullable, _
                                               mysql_param.Precision, _
                                               mysql_param.Scale, _
                                               mysql_param.SourceColumn, _
                                               mysql_param.SourceVersion, _
                                               mysql_param.Value)

     'パラメータの設定
     da.SelectCommand.Parameters.Add(new_mysql_param)
 Next

 'SELECT実行
 da.Fill(ds, "dt_table")
 dt = ds.Tables("dt_table")
 dt.TableName = "dt_table"
 '★よっしゃ!取れました!
 return dt

よっしゃよっしゃ!!!

 

いかがでしょうか?

すごく無理矢理な感じがしますが、これでやりたいことは実現できました。

でも、まだ本番では使っていません。いつか使う日が来るのでしょうか。

 

最近はEntity FrameworkかDapperがいいんじゃないとか別のフレームワークの話で盛り上がってます。

iBatis.netってもう昔の話になったみたいですね。

 

2番目に私と同じ考えを持った方がいらっしゃいましたら、是非使ってみてください。

 

※おまけ:デバック時に使ってください。

 ''' <summary>
 ''' SQLデバック出力
 ''' </summary>
 ''' <param name="function_name">機能名</param>
 ''' <param name="myCommand">MySqlCommand</param>
 ''' <remarks></remarks>
 Private Function debug_sql(ByVal function_name As String, ByVal myCommand As MySqlCommand) As String
     Dim sql As String = myCommand.CommandText.ToString
     For i As Integer = 0 To myCommand.Parameters.Count - 1
         sql = Replace(sql, myCommand.Parameters.Item(i).ParameterName, "'" & myCommand.Parameters.Item(i).Value & "'")
     Next
     Return sql
 End Function

 

 

 

リバークレインでは、エンジニアを募集しています。