<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Program全般</title><link>http://blogs.wankuma.com/mrt/category/1479.aspx</link><description>Program全般</description><managingEditor>Mr.T</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Mr.T</dc:creator><title>[VB.NET]隠れたCOSTという話</title><link>http://blogs.wankuma.com/mrt/archive/2009/10/07/181942.aspx</link><pubDate>Wed, 07 Oct 2009 11:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2009/10/07/181942.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/181942.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2009/10/07/181942.aspx#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/181942.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/181942.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;元ネタは、&lt;a title="http://blogs.msdn.com/vbteam/archive/2009/10/06/hidden-costs-matt-gertz.aspx" href="http://blogs.msdn.com/vbteam/archive/2009/10/06/hidden-costs-matt-gertz.aspx"&gt;http://blogs.msdn.com/vbteam/archive/2009/10/06/hidden-costs-matt-gertz.aspx&lt;/a&gt;&lt;br&gt;# ほとんど、ネタに乗っかるだけの話なんで恐縮なんですけどね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;VB6.0以前でも云われてきた話じゃないかと思ってたんですが、ループなどで、こういう処理を書いたとします。&lt;/p&gt; &lt;div class="SourceBox"&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; MyList &lt;font color="blue"&gt;As&lt;/font&gt; List(Of &lt;font color="blue"&gt;String&lt;/font&gt;) = &lt;font color="blue"&gt;New&lt;/font&gt; List(Of &lt;font color="blue"&gt;String&lt;/font&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Sub&lt;/font&gt; Main()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; s &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;New&lt;/font&gt; System.Text.StringBuilder&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt; i &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;To&lt;/font&gt; MyList.Count&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(MyList(i))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;このとき、MyList.Countは、ループのたびに評価される、というのが隠れたCostということみたいです。&lt;/p&gt; &lt;p&gt;で、ほんじゃどんだけ違うのだろうと、MSILコードを見るとこんな感じでした。&lt;/p&gt; &lt;p&gt;#Costがあるってなら、何か余計な処理&amp;amp;時間がかかる処理があるんだろうと思うので。  &lt;p&gt;&amp;nbsp; &lt;p&gt;.method public static void&amp;nbsp; Main() cil managed&lt;br&gt;{&lt;br&gt;&amp;nbsp; .entrypoint&lt;br&gt;&amp;nbsp; .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) &lt;br&gt;&amp;nbsp; // コード サイズ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 48 (0x30)&lt;br&gt;&amp;nbsp; .maxstack&amp;nbsp; 3&lt;br&gt;&amp;nbsp; .locals init ([0] class [mscorlib]System.Text.StringBuilder s,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] int32 i,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [2] int32 VB$t_i4$L0)&lt;br&gt;&amp;nbsp; IL_0000:&amp;nbsp; newobj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance void [mscorlib]System.Text.StringBuilder::.ctor()&lt;br&gt;&amp;nbsp; IL_0005:&amp;nbsp; stloc.0&lt;br&gt;&amp;nbsp; IL_0006:&amp;nbsp; ldc.i4.0&lt;br&gt;&amp;nbsp; IL_0007:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt; Sample.Module1::MyList&lt;br&gt;&amp;nbsp; IL_000c:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance int32 class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt;::get_Count()&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp; IL_0011:&amp;nbsp; stloc.2（※１）&lt;/font&gt;&lt;br&gt;&amp;nbsp; IL_0012:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp; IL_0013:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002b&lt;br&gt;&amp;nbsp; IL_0015:&amp;nbsp; ldloc.0&lt;br&gt;&amp;nbsp; IL_0016:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt; Sample.Module1::MyList&lt;br&gt;&amp;nbsp; IL_001b:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_001c:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance !0 class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt;::get_Item(int32)&lt;br&gt;&amp;nbsp; IL_0021:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)&lt;br&gt;&amp;nbsp; IL_0026:&amp;nbsp; pop&lt;br&gt;&amp;nbsp; IL_0027:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_0028:&amp;nbsp; ldc.i4.1&lt;br&gt;&amp;nbsp; IL_0029:&amp;nbsp; add.ovf&lt;br&gt;&amp;nbsp; IL_002a:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp; IL_002b:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_002c:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_002d:&amp;nbsp; ble.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0015&lt;br&gt;&amp;nbsp; IL_002f:&amp;nbsp; ret&lt;br&gt;} // end of method Module1::Main  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;MyList.Coutを事前に求めておいたパターンで同じようにやってみました。&lt;/p&gt; &lt;div class="SourceBox"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; MyList &lt;font color="blue"&gt;As&lt;/font&gt; List(Of &lt;font color="blue"&gt;String&lt;/font&gt;) = &lt;font color="blue"&gt;New&lt;/font&gt; List(Of &lt;font color="blue"&gt;String&lt;/font&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Sub&lt;/font&gt; Main()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; s &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;New&lt;/font&gt; System.Text.StringBuilder&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; count &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = MyList.Count&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt; i &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;To&lt;/font&gt; count&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(MyList(i))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&lt;br&gt;&amp;nbsp;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;.method public static void&amp;nbsp; Main() cil managed&lt;br&gt;{&lt;br&gt;&amp;nbsp; .entrypoint&lt;br&gt;&amp;nbsp; .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) &lt;br&gt;&amp;nbsp; // コード サイズ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50 (0x32)&lt;br&gt;&amp;nbsp; .maxstack&amp;nbsp; 3&lt;br&gt;&amp;nbsp; .locals init ([0] int32 count,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] class [mscorlib]System.Text.StringBuilder s,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [2] int32 i,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [3] int32 VB$t_i4$L0)&lt;br&gt;&amp;nbsp; IL_0000:&amp;nbsp; newobj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance void [mscorlib]System.Text.StringBuilder::.ctor()&lt;br&gt;&amp;nbsp; IL_0005:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp; IL_0006:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt; Sample.Module1::MyList&lt;br&gt;&amp;nbsp; IL_000b:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance int32 class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt;::get_Count()&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp; IL_0010:&amp;nbsp; stloc.0（※２）&lt;/font&gt;&lt;br&gt;&amp;nbsp; IL_0011:&amp;nbsp; ldc.i4.0&lt;br&gt;&amp;nbsp; IL_0012:&amp;nbsp; ldloc.0&lt;br&gt;&amp;nbsp; IL_0013:&amp;nbsp; stloc.3&lt;br&gt;&amp;nbsp; IL_0014:&amp;nbsp; stloc.2&lt;br&gt;&amp;nbsp; IL_0015:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002d&lt;br&gt;&amp;nbsp; IL_0017:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_0018:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt; Sample.Module1::MyList&lt;br&gt;&amp;nbsp; IL_001d:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_001e:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance !0 class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt;::get_Item(int32)&lt;br&gt;&amp;nbsp; IL_0023:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)&lt;br&gt;&amp;nbsp; IL_0028:&amp;nbsp; pop&lt;br&gt;&amp;nbsp; IL_0029:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_002a:&amp;nbsp; ldc.i4.1&lt;br&gt;&amp;nbsp; IL_002b:&amp;nbsp; add.ovf&lt;br&gt;&amp;nbsp; IL_002c:&amp;nbsp; stloc.2&lt;br&gt;&amp;nbsp; IL_002d:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_002e:&amp;nbsp; ldloc.3&lt;br&gt;&amp;nbsp; IL_002f:&amp;nbsp; ble.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0017&lt;br&gt;&amp;nbsp; IL_0031:&amp;nbsp; ret&lt;br&gt;} // end of method Module1::Main  &lt;p&gt;&amp;nbsp; &lt;p&gt;よくわからんのだけど、この※１と※２は、Countの戻り値を評価スタックとやらにPushしてるわけで、この値を比較対象と&lt;br&gt;してるんだと思ってるんですが、違うんですかね？  &lt;p&gt;この時点では、もうどちらもint32の値として利用されているから、Costなんてなさそうな感じがします。  &lt;p&gt;前段では、  &lt;p&gt;&amp;nbsp; IL_002d:&amp;nbsp; ble.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0015  &lt;p&gt;後段では、  &lt;p&gt;&amp;nbsp; IL_002f:&amp;nbsp; ble.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0017  &lt;p&gt;&amp;nbsp; &lt;p&gt;ここで、ループというか指定行に飛んでいくようになってます。つまり、これを見る限りは、Appendは毎回評価されている  &lt;p&gt;けど、Countは毎回なんぞ評価されていないように見えます。  &lt;p&gt;&amp;nbsp; &lt;p&gt;じゃあ、For Each使えばどうなのよ、ってことで、  &lt;div class="SourceBox"&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; MyList &lt;font color="blue"&gt;As&lt;/font&gt; List(Of &lt;font color="blue"&gt;String&lt;/font&gt;) = &lt;font color="blue"&gt;New&lt;/font&gt; List(Of &lt;font color="blue"&gt;String&lt;/font&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Sub&lt;/font&gt; Main()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; s &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;New&lt;/font&gt; System.Text.StringBuilder&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Each&lt;/font&gt; data &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;String&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;In&lt;/font&gt; MyList&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(data)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&amp;nbsp; &lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;.method public static void&amp;nbsp; Main() cil managed&lt;br&gt;{&lt;br&gt;&amp;nbsp; .entrypoint&lt;br&gt;&amp;nbsp; .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) &lt;br&gt;&amp;nbsp; // コード サイズ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 61 (0x3d)&lt;br&gt;&amp;nbsp; .maxstack&amp;nbsp; 2&lt;br&gt;&amp;nbsp; .locals init ([0] class [mscorlib]System.Text.StringBuilder s,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] string data,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [2] valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator&amp;lt;string&amp;gt; VB$t_struct$L0)&lt;br&gt;&amp;nbsp; IL_0000:&amp;nbsp; newobj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance void [mscorlib]System.Text.StringBuilder::.ctor()&lt;br&gt;&amp;nbsp; IL_0005:&amp;nbsp; stloc.0&lt;br&gt;&amp;nbsp; .try&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0006:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt; Sample.Module1::MyList&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_000b:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator&amp;lt;!0&amp;gt; class [mscorlib]System.Collections.Generic.List`1&amp;lt;string&amp;gt;::GetEnumerator()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0010:&amp;nbsp; stloc.2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0011:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0023&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0013:&amp;nbsp; ldloca.s&amp;nbsp;&amp;nbsp; VB$t_struct$L0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0015:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance !0 valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator&amp;lt;string&amp;gt;::get_Current()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001a:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001b:&amp;nbsp; ldloc.0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001c:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_001d:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0022:&amp;nbsp; pop&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0023:&amp;nbsp; ldloca.s&amp;nbsp;&amp;nbsp; VB$t_struct$L0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0025:&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance bool valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator&amp;lt;string&amp;gt;::MoveNext()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002a:&amp;nbsp; brtrue.s&amp;nbsp;&amp;nbsp; IL_0013&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002c:&amp;nbsp; leave.s&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_003c&lt;br&gt;&amp;nbsp; }&amp;nbsp; // end .try&lt;br&gt;&amp;nbsp; finally&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002e:&amp;nbsp; ldloca.s&amp;nbsp;&amp;nbsp; VB$t_struct$L0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0030:&amp;nbsp; constrained. valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator&amp;lt;string&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0036:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance void [mscorlib]System.IDisposable::Dispose()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_003b:&amp;nbsp; endfinally&lt;br&gt;&amp;nbsp; }&amp;nbsp; // end handler&lt;br&gt;&amp;nbsp; IL_003c:&amp;nbsp; ret&lt;br&gt;} // end of method Module1::Main  &lt;p&gt;まあ、このヘンになってくると比較にもならん結果になるので、パスw&lt;br&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;で、引用元の人は、こういうのは最悪だろって話をしてるんだけど、  &lt;div class="SourceBox"&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; MyLameObjectHeader &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject = &lt;font color="blue"&gt;New&lt;/font&gt; MyLameObject&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Sub&lt;/font&gt; Main()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; s &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;New&lt;/font&gt; System.Text.StringBuilder&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt; i &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;To&lt;/font&gt; MyLameObjectHeader.Count&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(MyLameObjectHeader.Item(i))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;/font&gt; MyLameObject&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; data &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;String&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; NextMLO &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt; Insert(&lt;font color="blue"&gt;ByVal&lt;/font&gt; mlo &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; NextMLO IsNot &lt;font color="blue"&gt;Nothing&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NextMLO = mlo&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Else&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mlo.NextMLO = NextMLO.NextMLO&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NextMLO.NextMLO = mlo&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;If&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; Count() &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; ct &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; current &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject = &lt;font color="blue"&gt;Me&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Do&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;While&lt;/font&gt; current IsNot &lt;font color="blue"&gt;Nothing&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ct += &lt;font color="#c00040"&gt;1&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current = current.NextMLO&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Loop&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt; ct&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; Item(&lt;font color="blue"&gt;ByVal&lt;/font&gt; index &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt;) &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; index &amp;gt;= Count() &lt;font color="blue"&gt;OrElse&lt;/font&gt; index &amp;lt; &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Nothing&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; current &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject = &lt;font color="blue"&gt;Me&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt; i &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;To&lt;/font&gt; index&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current = current.NextMLO&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt; current&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;/font&gt; &lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;MyLameObject.Countが毎回、ループで処理されるからひどいことになるよってことですな。せめてこうしろって話ですな。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="SourceBox"&gt;(Mainの変更後）  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; MyLameObjectHeader &lt;font color="blue"&gt;As&lt;/font&gt; MyLameObject = &lt;font color="blue"&gt;New&lt;/font&gt; MyLameObject&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Sub&lt;/font&gt; Main()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; s &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;New&lt;/font&gt; System.Text.StringBuilder&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; c &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = MyLameObjectHeader.Count&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt; i &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;To&lt;/font&gt; c&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(MyLameObjectHeader.Item(i))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt; &lt;/p&gt;&lt;/div&gt; &lt;p&gt;--Main部分 変更前&lt;/p&gt; &lt;p&gt;.method public static void&amp;nbsp; Main() cil managed&lt;br&gt;{&lt;br&gt;&amp;nbsp; .entrypoint&lt;br&gt;&amp;nbsp; .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) &lt;br&gt;&amp;nbsp; // コード サイズ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 48 (0x30)&lt;br&gt;&amp;nbsp; .maxstack&amp;nbsp; 3&lt;br&gt;&amp;nbsp; .locals init ([0] class [mscorlib]System.Text.StringBuilder s,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] int32 i,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [2] int32 VB$t_i4$L0)&lt;br&gt;&amp;nbsp; IL_0000:&amp;nbsp; newobj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance void [mscorlib]System.Text.StringBuilder::.ctor()&lt;br&gt;&amp;nbsp; IL_0005:&amp;nbsp; stloc.0&lt;br&gt;&amp;nbsp; IL_0006:&amp;nbsp; ldc.i4.0&lt;br&gt;&amp;nbsp; IL_0007:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader&lt;br&gt;&amp;nbsp; IL_000c:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance int32 Sample.Module1/MyLameObject::Count()&lt;br&gt;&amp;nbsp; IL_0011:&amp;nbsp; stloc.2&lt;br&gt;&amp;nbsp; IL_0012:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp; IL_0013:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002b&lt;br&gt;&amp;nbsp; IL_0015:&amp;nbsp; ldloc.0&lt;br&gt;&amp;nbsp; IL_0016:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader&lt;br&gt;&amp;nbsp; IL_001b:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_001c:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class Sample.Module1/MyLameObject Sample.Module1/MyLameObject::Item(int32)&lt;br&gt;&amp;nbsp; IL_0021:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(object)&lt;br&gt;&amp;nbsp; IL_0026:&amp;nbsp; pop&lt;br&gt;&amp;nbsp; IL_0027:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_0028:&amp;nbsp; ldc.i4.1&lt;br&gt;&amp;nbsp; IL_0029:&amp;nbsp; add.ovf&lt;br&gt;&amp;nbsp; IL_002a:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp; IL_002b:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_002c:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_002d:&amp;nbsp; ble.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0015&lt;br&gt;&amp;nbsp; IL_002f:&amp;nbsp; ret&lt;br&gt;} // end of method Module1::Main  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;--Main部分 変更後&lt;/p&gt; &lt;p&gt;.method public static void&amp;nbsp; Main() cil managed&lt;br&gt;{&lt;br&gt;&amp;nbsp; .entrypoint&lt;br&gt;&amp;nbsp; .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) &lt;br&gt;&amp;nbsp; // コード サイズ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50 (0x32)&lt;br&gt;&amp;nbsp; .maxstack&amp;nbsp; 3&lt;br&gt;&amp;nbsp; .locals init ([0] int32 c,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1] class [mscorlib]System.Text.StringBuilder s,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [2] int32 i,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [3] int32 VB$t_i4$L0)&lt;br&gt;&amp;nbsp; IL_0000:&amp;nbsp; newobj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; instance void [mscorlib]System.Text.StringBuilder::.ctor()&lt;br&gt;&amp;nbsp; IL_0005:&amp;nbsp; stloc.1&lt;br&gt;&amp;nbsp; IL_0006:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader&lt;br&gt;&amp;nbsp; IL_000b:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance int32 Sample.Module1/MyLameObject::Count()&lt;br&gt;&amp;nbsp; IL_0010:&amp;nbsp; stloc.0&lt;br&gt;&amp;nbsp; IL_0011:&amp;nbsp; ldc.i4.0&lt;br&gt;&amp;nbsp; IL_0012:&amp;nbsp; ldloc.0&lt;br&gt;&amp;nbsp; IL_0013:&amp;nbsp; stloc.3&lt;br&gt;&amp;nbsp; IL_0014:&amp;nbsp; stloc.2&lt;br&gt;&amp;nbsp; IL_0015:&amp;nbsp; br.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_002d&lt;br&gt;&amp;nbsp; IL_0017:&amp;nbsp; ldloc.1&lt;br&gt;&amp;nbsp; IL_0018:&amp;nbsp; ldsfld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader&lt;br&gt;&amp;nbsp; IL_001d:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_001e:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class Sample.Module1/MyLameObject Sample.Module1/MyLameObject::Item(int32)&lt;br&gt;&amp;nbsp; IL_0023:&amp;nbsp; callvirt&amp;nbsp;&amp;nbsp; instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(object)&lt;br&gt;&amp;nbsp; IL_0028:&amp;nbsp; pop&lt;br&gt;&amp;nbsp; IL_0029:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_002a:&amp;nbsp; ldc.i4.1&lt;br&gt;&amp;nbsp; IL_002b:&amp;nbsp; add.ovf&lt;br&gt;&amp;nbsp; IL_002c:&amp;nbsp; stloc.2&lt;br&gt;&amp;nbsp; IL_002d:&amp;nbsp; ldloc.2&lt;br&gt;&amp;nbsp; IL_002e:&amp;nbsp; ldloc.3&lt;br&gt;&amp;nbsp; IL_002f:&amp;nbsp; ble.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IL_0017&lt;br&gt;&amp;nbsp; IL_0031:&amp;nbsp; ret&lt;br&gt;} // end of method Module1::Main  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;クラス部分は変更してないから、同じだし。&lt;/p&gt; &lt;p&gt;それ以外だと、やっぱりContの部分なんですが・・・これって、やっぱりループごとに評価されているわけじゃないように&lt;br&gt;見えるんですが・・・&lt;/p&gt; &lt;p&gt;サルでもわかる説明とかないですかねw&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/181942.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>共通テーブル式（ＣＴＥ）の使いどころ？</title><link>http://blogs.wankuma.com/mrt/archive/2009/09/10/181090.aspx</link><pubDate>Thu, 10 Sep 2009 18:09:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2009/09/10/181090.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/181090.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2009/09/10/181090.aspx#Feedback</comments><slash:comments>188</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/181090.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/181090.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Ognacさんのエントリで共通テーブル式（ＣＴＥ）のことをあげたら、こんなコメントが・・・&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.wankuma.com/ognac/archive/2009/09/10/181052.aspx#181071" href="http://blogs.wankuma.com/ognac/archive/2009/09/10/181052.aspx#181071"&gt;http://blogs.wankuma.com/ognac/archive/2009/09/10/181052.aspx#181071&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;正直、どこをどう説明したらいいのかわかりませんが、もうめちゃくちゃ安易に使ってます。&lt;/p&gt; &lt;p&gt;#シビアなパフォーマンスを比較的求められないケースがほとんどなので、Indexは？とかそういうのは&lt;br&gt;#今のところあまり問題になってません。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;例えば、普通に二つのテーブルを外部結合してるＳＱＬがあったとします。&lt;/p&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;X名簿、Y名簿とも、ID,名前,苗字というフィールドのテーブルとして &lt;p&gt;select T1.[名前],T1.[苗字] from [X名簿] T1&lt;br&gt;left join [Y名簿] T2&lt;br&gt;on T1.ID = T2.ID&lt;br&gt;where T1.ID&amp;lt;100 &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;これに、Y名簿のIDが200未満という条件がついていたとすると、そのままかけば&lt;/p&gt; &lt;p&gt;select T1.[名前],T1.[苗字],T2.[結婚前苗字] from [X名簿] T1&lt;br&gt;left join (select * from [Y名簿] where ID&amp;lt;200) T2&lt;br&gt;on T1.ID = T2.ID&lt;br&gt;where ID&amp;lt;100 &lt;p&gt;&amp;nbsp; &lt;p&gt; こんな風になりますよね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;私は、(select * from [Y名簿] where ID&amp;lt;200)の部分が長くなるのが非常に見難く感じるので、ここをざくっと&lt;/p&gt; &lt;p&gt;こうしちゃいます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;with [Y名簿のID200未満] as (&lt;/p&gt; &lt;p&gt;select * from [Y名簿] where ID&amp;lt;200&lt;/p&gt; &lt;p&gt;)&lt;/p&gt; &lt;p&gt;select T1.[名前],T1.[苗字] from [X名簿] T1&lt;br&gt;left join [Y名簿のID200未満] T2&lt;br&gt;on T1.ID = T2.ID&lt;br&gt;where T1.ID&amp;lt;100 &lt;p&gt;&amp;nbsp; &lt;p&gt;withでくくるのは、複数かけるので、 &lt;p&gt;with テーブルA as () &lt;p&gt;.テーブルB as () &lt;p&gt;,・・・ &lt;p&gt;select * from テーブルA,テーブルB &lt;p&gt;みたいに、やってますね。 &lt;p&gt;SQLは大きくなるほど、ここで抽出してるのはどういうデータなのかを忘れちゃうので、 &lt;p&gt;こうやって名前付けて出しちゃうのは見た目で結構わかりやすいと個人的にはおもってます。 &lt;p&gt;&amp;nbsp; &lt;p&gt;他の人、CTEってどういうときにつかってるんだろ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/181090.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>[SQL]連番だけど抜けがある番号群から最小の抜け番号を探す</title><link>http://blogs.wankuma.com/mrt/archive/2009/07/10/177331.aspx</link><pubDate>Fri, 10 Jul 2009 12:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2009/07/10/177331.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/177331.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2009/07/10/177331.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/177331.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/177331.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt;
&lt;p&gt;SQLで連番関連というのは色々とあるけども、今回考え付いたのは、以下の条件のときのSQL。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;番号が800000～999999までの間から番号を一つ取得すること。&lt;/p&gt;
&lt;p&gt;ただし、取得されていないうちで、一番小さいものから取得していくこと。&lt;/p&gt;
&lt;p&gt;取得したら、取得済みテーブルに番号フィールドで保存済する。（番号フィールドはint）&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;なので、取得済みテーブルの登録状況が&lt;/p&gt;
&lt;p&gt;【番号】&lt;/p&gt;
&lt;p&gt;800000&lt;/p&gt;
&lt;p&gt;800001&lt;/p&gt;
&lt;p&gt;999999&lt;/p&gt;
&lt;p&gt;みたいな取得状況というわけです。&lt;/p&gt;
&lt;p&gt;次にとるのは800002ですね。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;with BaseTmp as (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select [番号] as pNo&lt;br&gt;&amp;nbsp;&amp;nbsp; from [取得済みテーブル]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where [番号]&amp;gt;=800000&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and [番号]&amp;lt;999999&lt;br&gt;)&lt;br&gt;,UpBaseTmp as (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select [番号]+1 as pNo&lt;br&gt;&amp;nbsp;&amp;nbsp; from [取得済みテーブル]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where [番号]&amp;gt;=800000&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and [番号]&amp;lt;999999&lt;br&gt;&amp;nbsp; union ALL&lt;br&gt;&amp;nbsp; select 800000&lt;br&gt;)&lt;br&gt;select min(T1.pNo)&lt;br&gt;from UpBaseTmp T1&lt;br&gt;left join BaseTmp as T2&lt;br&gt;on T1.pNo = T2.pNo&lt;br&gt;where T2.pNo is null &lt;/p&gt;
&lt;p&gt;こんな感じ。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/177331.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>SqlDataReaderのGetSchemeTableで、余計な列(フィールド)まで取ってくるときがある。</title><link>http://blogs.wankuma.com/mrt/archive/2009/02/11/167951.aspx</link><pubDate>Wed, 11 Feb 2009 11:48:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2009/02/11/167951.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/167951.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2009/02/11/167951.aspx#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/167951.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/167951.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;#.NetFrameWork2.0　, SQLServer 2005での環境です。  &lt;p&gt;ちなみに、これではないみたいです。&lt;br&gt;[BUG] SqlDataReader の GetSchemaTable() が誤った列名を返す　&lt;a href="http://support.microsoft.com/kb/307512/ja"&gt;http://support.microsoft.com/kb/307512/ja&lt;/a&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;SQLServerからデータを取得して、それをDataTableにセットしたい...でも、フィールドの情報はいちいち指定したくない&lt;/p&gt; &lt;p&gt;という場合に、SqlDataReader.GetSchemaTableによって、テーブルのフィールド情報を取得し、そのフィールド名と&lt;/p&gt; &lt;p&gt;型情報をとってきて、自動的にDataTableへ落とし込む、なんてことをしてたりしますか？&lt;/p&gt; &lt;p&gt;今じゃ古いやり方なのかもしれませんけど、まあベタな方法ですよね。&lt;/p&gt; &lt;p&gt;#それとも、もう、やらないのかなぁ。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;この流れでいうと、まずはDataTaleを用意して、そこにカラムを追加し、データを突っ込むことになりますが、&lt;/p&gt; &lt;p&gt;カラムを用意する時点で、どうもエラーになる。それは、例えば、こんなソース。&lt;/p&gt; &lt;p&gt;&lt;font color="blue"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; targetSchemeDataReader &lt;font color="blue"&gt;As&lt;/font&gt; SqlDataReader = &lt;font color="blue"&gt;Nothing&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; targetScheme &lt;font color="blue"&gt;As&lt;/font&gt; DataTable&lt;br&gt;targetSchemeDataReader = targetSQLCommand.ExecuteReader(CommandBehavior.KeyInfo)&lt;br&gt;targetScheme = targetSchemeDataReader.GetSchemaTable&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; fieldNameIndex &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = targetScheme.Columns(&lt;font color="#c00040"&gt;"ColumnName"&lt;/font&gt;).Ordinal&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; typeIndex &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = targetScheme.Columns(&lt;font color="#c00040"&gt;"DataType"&lt;/font&gt;).Ordinal&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; isHiddenIndex &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = targetScheme.Columns(&lt;font color="#c00040"&gt;"IsHidden"&lt;/font&gt;).Ordinal&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;For&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Each&lt;/font&gt; iRow &lt;font color="blue"&gt;As&lt;/font&gt; System.Data.DataRow &lt;font color="blue"&gt;In&lt;/font&gt; targetScheme.Rows&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; targetDataTable.Columns.Add(iRow.Item(fieldNameIndex).ToString, _　&lt;font color="#ff0000"&gt;←ここでエラー&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type.&lt;font color="blue"&gt;GetType&lt;/font&gt;(&lt;font color="blue"&gt;CType&lt;/font&gt;(iRow.Item(typeIndex), Type).FullName))&lt;br&gt;&lt;font color="blue"&gt;Next&lt;/font&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;br&gt;デバッグしてみると、ストアドプロシジャから返された結果に対して、&lt;strong&gt;意図していないフィールド&lt;/strong&gt;まで&lt;/p&gt; &lt;p&gt;返されていることがわかり、そのフィールドのカラム名がだぶっている様子。&lt;/p&gt; &lt;p&gt;#ダブったのは今回のケースではそうなっただけ&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Ｓｅｌｅｃｔで返す予定になっていたのは、４つのフィールドであるのに、スキーマ情報として取得されたときには、8つのフィールド名&lt;/p&gt; &lt;p&gt;ということで、なぜそんなものまで返されるのか正直わけがわからなかった。&lt;/p&gt; &lt;p&gt;で、調べたところ似たような現象のお方がいた。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic53804.aspx"&gt;http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic53804.aspx&lt;/a&gt;  &lt;p&gt;&lt;br&gt;なんじゃ、英語でわからんのだけども、ロバートという人こんなこといってます。&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;When you specify the CommandBehavior.KeyInfo option, Sql Server will &lt;br&gt;automatically return you the columns in your original select along with the &lt;br&gt;necessary additional columns needed to uniquely identify the rows returned.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;SQLComman.ExeteReader(CommandBehavior.KeyInfo)を使うと、SQLServerは、&lt;/p&gt; &lt;p&gt;行を一意に識別するため、自動的にキー項目を追加する、みたいな感じですね。&lt;/p&gt; &lt;p&gt;これ、どこがソース（情報源）になっているのかわかりませんが、そう考えると納得できます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;さらに、上記の返答のRessには、&lt;/p&gt; &lt;p&gt;IsHiddenという項目があること&lt;/p&gt; &lt;p&gt;取得元がViewであるなら、WITH VIEW_METADATAをつけるとええよ&lt;/p&gt; &lt;p&gt;とか云ってます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;とりあえず、そういうことであれば列情報に違いがあるんじゃないかと思い、比較してみたところ、&lt;/p&gt; &lt;p&gt;メタデータにIsHiddenという項目があることがわかりました。&lt;/p&gt; &lt;p&gt;これを比較すると、こちらがSelect ・・・と指定したフィールドに対しては、True,書いてないフィールドはFalseが&lt;/p&gt; &lt;p&gt;返ってきています。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;そういうわけで、ソースをこんな風に変更。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; targetSchemeDataReader &lt;font color="blue"&gt;As&lt;/font&gt; SqlDataReader = &lt;font color="blue"&gt;Nothing&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; targetScheme &lt;font color="blue"&gt;As&lt;/font&gt; DataTable&lt;br&gt;targetSchemeDataReader = targetSQLCommand.ExecuteReader(CommandBehavior.KeyInfo)&lt;br&gt;targetScheme = targetSchemeDataReader.GetSchemaTable&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; fieldNameIndex &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = targetScheme.Columns(&lt;font color="#c00040"&gt;"ColumnName"&lt;/font&gt;).Ordinal&lt;br&gt;&lt;font color="blue"&gt;Dim&lt;/font&gt; typeIndex &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = targetScheme.Columns(&lt;font color="#c00040"&gt;"DataType"&lt;/font&gt;).Ordinal&lt;br&gt;&lt;font color="#0000ff"&gt;Dim&lt;/font&gt; isHiddenIndex &lt;font color="#0000ff"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;Integer&lt;/font&gt; = targetScheme.Columns(&lt;font color="#c00040"&gt;"IsHidden"&lt;/font&gt;).Ordinal &lt;font color="#ff0000"&gt;←追加&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;For&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Each&lt;/font&gt; iRow &lt;font color="blue"&gt;As&lt;/font&gt; System.Data.DataRow &lt;font color="blue"&gt;In&lt;/font&gt; targetScheme.Rows&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;CBool&lt;/font&gt;(iRow.Item(isHiddenIndex)) = &lt;font color="blue"&gt;False&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then　&lt;/font&gt;&lt;font color="#ff0000"&gt;←追加&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; targetDataTable.Columns.Add(iRow.Item(fieldNameIndex).ToString, _&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type.&lt;font color="blue"&gt;GetType&lt;/font&gt;(&lt;font color="blue"&gt;CType&lt;/font&gt;(iRow.Item(typeIndex), Type).FullName))&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;If　&lt;/font&gt;&lt;font color="#ff0000"&gt;←追加&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;Next&lt;/font&gt; &lt;p&gt; めでたく、必要な情報のみ取得できました。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;って、KeyInfo使えっていってるのは、MSDNサンプルにもあるのに、どういうことなんじゃ！&lt;/p&gt; &lt;p&gt;DataReader の GetSchemaTable メソッドと Visual Basic .NET を使用して列スキーマを取得する方法&lt;/p&gt; &lt;p&gt;&lt;a title="http://support.microsoft.com/kb/310108/ja" href="http://support.microsoft.com/kb/310108/ja"&gt;http://support.microsoft.com/kb/310108/ja&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/167951.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>SQLServer ManagementStudio上でクエリ作成時によくやること</title><link>http://blogs.wankuma.com/mrt/archive/2008/12/10/163310.aspx</link><pubDate>Wed, 10 Dec 2008 17:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2008/12/10/163310.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/163310.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2008/12/10/163310.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/163310.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/163310.aspx</trackback:ping><description>&lt;P&gt;Mr.Tです、こんにちは。&lt;/P&gt;
&lt;P&gt;なんていうか、こうやってるよーってだけの話ですが。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=4&gt;共通テーブル式をつかいまくる。&lt;BR&gt;&lt;/FONT&gt;
&lt;P&gt;もちろん、CTE使いまくる。&lt;BR&gt;共通テーブル式がないと、SQLかけないくらいです。 &lt;BR&gt;&lt;BR&gt;SQLServerでは、With ほげほげ as () と使います。&lt;BR&gt;多段につかいたければ、&lt;BR&gt;&lt;FONT color=blue&gt;with&lt;/FONT&gt; hoge1 &lt;FONT color=blue&gt;as&lt;/FONT&gt;(&lt;BR&gt;&lt;BR&gt;),&lt;BR&gt;hoge2 &lt;FONT color=blue&gt;as&lt;/FONT&gt;(&lt;BR&gt;&lt;BR&gt;)&lt;BR&gt;&lt;FONT color=blue&gt;select&lt;/FONT&gt; * ... &lt;BR&gt;&lt;BR&gt;とします。&lt;BR&gt;&lt;/P&gt;
&lt;LI&gt;&lt;FONT size=4&gt;範囲選択して、実行とかやりまくる。&lt;BR&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;これは、SQLServer2000とかでもできたとおもったけど、クエリを範囲選択して&lt;BR&gt;SQL実行できるんですよね。 &lt;BR&gt;&lt;BR&gt;&lt;FONT color=blue&gt;select&lt;/FONT&gt; * &lt;FONT color=blue&gt;from&lt;/FONT&gt; hoge&lt;BR&gt;&lt;FONT color=blue&gt;where&lt;/FONT&gt; A=&lt;FONT color=#c00040&gt;1&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=blue&gt;and&lt;/FONT&gt; B=&lt;FONT color=#c00040&gt;2&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;こんなSQLで、A=1のときだけがちょっとしりたいなーってときには、&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;select * from hoge&lt;BR&gt;where A=1&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=blue&gt;and&lt;/FONT&gt; B=&lt;FONT color=#c00040&gt;2&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;ここを範囲選択してから、F5で実行すると見事に、その部分だけの条件で実行されます&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;&lt;FONT size=3&gt;/* */のコメントで、いらないところを削る。&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;これもよくやるんですが、&lt;BR&gt;&lt;FONT color=blue&gt;&lt;BR&gt;select&lt;/FONT&gt; hogehoge1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,hogehoge2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,hogehoge3&lt;BR&gt;&amp;nbsp;&lt;FONT color=blue&gt;from&lt;/FONT&gt; hoge&lt;BR&gt;ここで、hogehoge2がいらねーとかしたときに、 &lt;BR&gt;&lt;BR&gt;&lt;FONT color=blue&gt;select&lt;/FONT&gt; hogehoge1&lt;BR&gt;&lt;FONT color=green&gt;/*,hogehoge2*/&lt;/FONT&gt;&lt;BR&gt;,hogehoge3&lt;BR&gt;&amp;nbsp;&lt;FONT color=blue&gt;from&lt;/FONT&gt; hoge&lt;BR&gt;なんて方法で減らすのはよくあります。&lt;/P&gt;
&lt;LI&gt;
&lt;P&gt;&lt;FONT size=3&gt;クエリ内で、複数の結果を返させる。&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=blue&gt;select&lt;/FONT&gt; * &lt;FONT color=blue&gt;from&lt;/FONT&gt; hoge1&lt;BR&gt;&lt;BR&gt;&lt;FONT color=blue&gt;select&lt;/FONT&gt; * &lt;FONT color=blue&gt;from&lt;/FONT&gt; hoge2 &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;　　　　　をひとつのウィンドウ内で、投げるとかはよくやりますね。当然結果は、多段表示されますけど。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/163310.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>XQueryをどう使うのか（大阪勉強会#22のLTまとめ）</title><link>http://blogs.wankuma.com/mrt/archive/2008/08/29/154596.aspx</link><pubDate>Fri, 29 Aug 2008 00:40:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2008/08/29/154596.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/154596.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2008/08/29/154596.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/154596.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/154596.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;すっかり忘れてたのですが、先週行われた大阪勉強会#22でLTを行いました。伝え切れなかった部分も含めてまとめておきます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;【指令】XQueryを使え&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;　XQueryを使ったことがある人は、聞いてみてもやはり少なかったのです。&lt;/p&gt; &lt;p&gt;&amp;nbsp; XQuerｙはXMLに対するといわせ言語という位置づけで、XMLデータベースをつつく上では非常に重要なものといえる&lt;/p&gt; &lt;p&gt;でしょう。FLWORといえば聞いたことがあるかもしれません。&lt;/p&gt; &lt;p&gt;　ともかく、SQLServer2005で初めて対応した、XQueryなのですが、そもそも、これを何に使うとうれしいのか全くわかってないw&lt;/p&gt; &lt;p&gt;#いまでもやっぱりわからないｗｗ&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;　というのも、SQLSreverはリレーショナルDBとして利用するからこそ価値があるわけで、そこにXMLを利用できるようにしたところで&lt;/p&gt; &lt;p&gt;XMLフィールドが使えるよ、というものでしかなく、XMLフィールドの中身はどこまでいっても、XMLそのものしか格納できません。&lt;/p&gt; &lt;p&gt;　つまりXMLの内容には全くリレーショナルDBとして機能を発揮できそうなところが見受けられないというのです。&lt;/p&gt; &lt;p&gt;　リレーショナルDBといえば、SQLによって問い合わせ、集計、グルーピング、などをして、特定のデータを参照するわけですが、&lt;/p&gt; &lt;p&gt;XMLをXMLフィールドとして格納してしまっては、&lt;strong&gt;そんなことできやしない。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;　例えば、伝票とかを考えて見ましょう。&lt;/p&gt; &lt;div class="RichSource"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;伝票&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;伝票番号&amp;gt;12345&amp;lt;/伝票番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;得意先名&amp;gt;わんくま同盟上海支社&amp;lt;/得意先名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;売上日付&amp;gt;2016/12/31&amp;lt;/売上日付&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;明細&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;あいふぉーん&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;65000&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="2"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;商品A&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;100&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="3"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;商品B&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;200&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="4"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;商品C&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;500&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/明細&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/伝票&amp;gt; &lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;まあ、そもそも、こういう形でデータを扱うことなんて、私自身はまったくないんですが...しかし、XQueryを使うことを前提に&lt;/p&gt; &lt;p&gt;XMLを考えてみると、XMLの解析がデータベース内できちんとできるというわけですから、これを使わない理由はないのかもしれません。&lt;/p&gt; &lt;p&gt;　伝票データのやりとりなんてのは、更新内容が非常に多いわけで、それをストアドに渡すのは一旦、&lt;/p&gt; &lt;p&gt;ワークテーブルに格納する、&lt;/p&gt; &lt;p&gt;パラメータ数を増やす、&lt;/p&gt; &lt;p&gt;直列データもどきをストアドに使う&lt;/p&gt; &lt;p&gt;なんて形にしなくてはならないと思います。（それ以外もあるのかもしれませんけど）&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;それをXML使えば、たったの二つにパラメータをまとめてくれます。&lt;/p&gt; &lt;div class="RichSource" style="font-size: 14pt"&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create Procedure Sample &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @InputPara XML &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , @OutputPara XML &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; as &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Begin&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End &lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;outputには、更新結果用のXMLとか突っ込めばよいわけですね。&lt;/p&gt; &lt;p&gt;もちろんエラーがあった場合は、どんな詳細なエラー内容も、XMLなら自由にできますね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;まずは、LTで利用したスクリプト例を見てみましょう。&lt;/p&gt; &lt;p&gt;一時テーブルを作成して、そこにXQueryで解析したものを突っ込んでSelectかける、という単純なものです。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="RichSource" style="padding-left: 2em"&gt; &lt;p&gt;begin try  &lt;p&gt;declare @DebugFlag int  &lt;p&gt;set @DebugFlag = 1  &lt;p&gt;Create Table #伝票(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [伝票番号]&amp;nbsp;&amp;nbsp;&amp;nbsp; integer not null,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [得意先名] nvarchar(max),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [売上日付]&amp;nbsp;&amp;nbsp;&amp;nbsp; datetime&lt;br&gt;)  &lt;p&gt;Create table #明細(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [伝票番号]&amp;nbsp;&amp;nbsp;&amp;nbsp; integer not null,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [行番号]&amp;nbsp;&amp;nbsp;&amp;nbsp; integer not null,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [商品名]&amp;nbsp;&amp;nbsp;&amp;nbsp; nvarchar(150) not null,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [単価]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; money not null&lt;br&gt;)  &lt;p&gt;declare @SaveData xml  &lt;p&gt;set @SaveData = '&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;伝票&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;伝票番号&amp;gt;12345&amp;lt;/伝票番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;得意先名&amp;gt;わんくま同盟上海支社&amp;lt;/得意先名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;売上日付&amp;gt;2016/12/31&amp;lt;/売上日付&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;明細&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;あいふぉーん&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;65000&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="2"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;商品A&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;100&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="3"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;商品B&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;200&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;行番号 No="4"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;商品名&amp;gt;商品C&amp;lt;/商品名&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;単価&amp;gt;500&amp;lt;/単価&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/行番号&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/明細&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/伝票&amp;gt;&lt;br&gt;'  &lt;p&gt;declare @伝票番号 integer&lt;br&gt;declare @得意先名 nvarchar(max)&lt;br&gt;declare @売上日付 datetime  &lt;p&gt;--ヘッダ取得  &lt;p&gt;if @DebugFlag = 0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select @SaveData.query('/伝票/伝票番号').value('.','integer')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@SaveData.query('/伝票/得意先名').value('.','nvarchar(max)')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@SaveData.query('/伝票/売上日付').value('.','datetime')&lt;br&gt;else&lt;br&gt;begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @伝票番号 = @SaveData.query('/伝票/伝票番号').value('.','integer')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @得意先名 = @SaveData.query('/伝票/得意先名').value('.','nvarchar(max)')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @売上日付 = @SaveData.query('/伝票/売上日付').value('.','datetime')  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into #伝票 values(@伝票番号,@得意先名,@売上日付)&lt;br&gt;end  &lt;p&gt;declare @行番号 int&lt;br&gt;declare @商品名 nvarchar(150)&lt;br&gt;declare @単価 money  &lt;p&gt;if @DebugFlag = 0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select targetColumn.query('.')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from @SaveData.nodes('/伝票/明細/行番号') targetTable(targetColumn)  &lt;p&gt;declare @明細行 xml&lt;br&gt;declare 明細カーソル cursor for&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select targetColumn.query('.')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from @SaveData.nodes('/伝票/明細/行番号') targetTable(targetColumn)  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; open 明細カーソル&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fetch next from 明細カーソル into @明細行&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (@@fetch_status = 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if @DebugFlag = 0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select @明細行.query('data(/行番号/@No)').value('.','integer')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@明細行.query('data(/行番号/商品名)').value('.','nvarchar(150)')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,@明細行.query('data(/行番号/単価)').value('.','money')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @行番号 = @明細行.query('data(/行番号/@No)').value('.','integer')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @商品名 = @明細行.query('data(/行番号/商品名)').value('.','nvarchar(150)')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set @単価 = @明細行.query('data(/行番号/単価)').value('.','money')  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into #明細 values(@伝票番号,@行番号,@商品名,@単価)  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fetch next from 明細カーソル into @明細行&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; close 明細カーソル&lt;br&gt;deallocate 明細カーソル  &lt;p&gt;if @DebugFlag = 1&lt;br&gt;begin&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select * from #伝票&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select * from #明細&lt;br&gt;end  &lt;p&gt;drop table #伝票&lt;br&gt;drop table #明細  &lt;p&gt;end try&lt;br&gt;begin catch&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ERROR_MESSAGE()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drop table #伝票&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drop table #明細&lt;br&gt;end&amp;nbsp; catch &lt;/p&gt;&lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp; 見ればわかるように、非常に構造は単純です。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;　　XMLを格納する&lt;/li&gt; &lt;li&gt;　　属性の値を取ってくる&lt;a href="mailto:&amp;rarr;@SaveData.query('/"&gt;→例えば、@SaveData.&lt;strong&gt;query&lt;/strong&gt;('/&lt;/a&gt;伝票/伝票番号').&lt;strong&gt;value&lt;/strong&gt;('.','integer')&lt;/li&gt; &lt;li&gt;　　子要素が複数あれば、それを取得して、ループでまわす。&lt;br&gt;&lt;/li&gt;例：&lt;br&gt;declare 明細カーソル &lt;strong&gt;cursor&lt;/strong&gt; for&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select targetColumn.query('.')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from @SaveData.&lt;strong&gt;nodes&lt;/strong&gt;('/伝票/明細/行番号') targetTable(targetColumn)&lt;br&gt;&lt;br&gt; &lt;li&gt;これらを繰り返す。&lt;br&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&amp;nbsp; このやり方だと、&lt;/p&gt; &lt;ul&gt; &lt;li&gt;どんな値もXMLで書けば、ストアド内で処理できちゃう。ストアド万歳！ &lt;/li&gt; &lt;li&gt;XMLをパラメータにするなら、ぶっちゃけ、どんなサービスから投げられても更新できるじゃん。 &lt;/li&gt; &lt;li&gt;XMLをつくなら、LINQだって使えるし、手書きもできる！ &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　むろん、このやり方だとノードの深さが深いと、かなりカーソルループを何重にもまわさないといけなくなるのが、難点でしょう。&lt;/p&gt; &lt;p&gt;　ここをカーソルを使わずに更新できるとかなり使い勝手もかわるんでしょうが、そういうわけには行かない（？）ようです。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;リレーショナルDBのように、テーブルとフィールドがある形式では、どうしたってXMLの中身をばらして、&lt;br&gt;フィールド更新しないといけない（と思う） &lt;/li&gt; &lt;li&gt;速度なんてのは、あまり考慮してない。 &lt;/li&gt; &lt;li&gt;そもそも、こういう使い方なんて有効性があるのかどうか、わからない &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp; まあ、こんな風につかうこともできるんだ、ということで。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/154596.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>SQLServerのXquery</title><link>http://blogs.wankuma.com/mrt/archive/2008/08/15/153044.aspx</link><pubDate>Fri, 15 Aug 2008 00:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2008/08/15/153044.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/153044.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2008/08/15/153044.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/153044.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/153044.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.wankuma.com/seminar/20080823osaka22/Default.aspx"&gt;8/23のわんくま勉強会&lt;/a&gt;で、2度目のLTを行うことになっていますが、今度はようやく技術ネタをしようと思っているわけで、&lt;/p&gt; &lt;p&gt;そのネタというか下準備をしていたわけです。&lt;/p&gt; &lt;p&gt;そこで今どうだろうかと考えているのが、SQLServer2005で対応したXqueryを使って、何かしてみようかな、というもの&lt;/p&gt; &lt;p&gt;なんですが...&lt;/p&gt; &lt;p&gt;このXQuery自体は、なんだかよくわかっていません。XMLデータベースというものを扱う上では、このXQueryが非常に重要に&lt;br&gt;なるのだろうということはあるのですけども、そもそもがXMLデータベースという形をSQLServerで扱うことができません。&lt;br&gt;できませんというか、XML型に対して、XML文をいれておくしか方法がありません。&lt;/p&gt; &lt;p&gt;現状のSQLServerは、リレーショナルDBであるため、テーブル構造であるとか、そのデータ構造自体は、リレーショナルDBから&lt;br&gt;扱う方法が確立されているわけですが、XMLから扱う方法はSQLXML くらいしか見つけられませんでした。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;SQLXMLの話はまだ、全然調べてないというのもあるし、ネタ的にLTには収まってくれないので、いつかの話にしようと&lt;br&gt;思っています。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;ということで、XQueryは、XMLを扱えるとはいえど、データだったらテーブルに突っ込めばおしまいだろ的な発想からすると、&lt;br&gt;ナニに使うんだろう、という疑問が解消できませんでした。&lt;/p&gt; &lt;p&gt;で、ようやく思いついたのが、ストアドのパラメータでした。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;「アプリから発行するのはストアド一発だけで、トランザクションなんざDB側にまかせて処理させたいから」&lt;/p&gt; &lt;p&gt;「でも、ストアドのパラメータって、いうなりゃ画面からの入力値じゃんか？」&lt;/p&gt; &lt;p&gt;「それだとちょっとした更新ならいいけど、業務系なら、結構一回の更新とかでも、パラメタ数が多くなって面倒くさくね？」&lt;/p&gt; &lt;p&gt;「グリッドデータなんか最悪じゃんか。配列っぽく渡そうとしても、結局文字列をシリアライズするみたいな感じだし」&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;「じゃあ、XMLで渡せばよくね？」&lt;/p&gt; &lt;p&gt;「XMLなら扱うクラスもあるし、今ならLInq to XMLとかでできるんだろうし、Validチェックもxsdファイルつくればできるよ」&lt;/p&gt; &lt;p&gt;「受け取ったXMLデータは、XqueryでリレーショナルDb用にバラすこともできるよね」&lt;/p&gt; &lt;p&gt;「じゃあ、配列もどきみたいなものとかよりも楽にデータチェックとかできるよね？」&lt;/p&gt; &lt;p&gt;という話で、ストアドパラメータにXQueryを使ってみようと思っています。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;もっと時間があれば、そのXMLをVB.NETから、XML作ってーみたいな形でいけるかもしれませんが...&lt;/p&gt; &lt;p&gt;まあ、こんな方法よりも、もっときちんとした方法があるのかどうかもわかってないんですけどね。&lt;/p&gt; &lt;p&gt;SQLXMLってのも、あるみたいですが。枠があれば、こういった話ができるのかもしれませんし。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;で、業務連絡w&lt;/p&gt; &lt;p&gt;ノートPCをお貸しいただくとりこびっちさん。SQLServer2005以降はそちらで利用できる環境でしょうか。&lt;/p&gt; &lt;p&gt;これがないと、口先だけでデモすることになりますので、どうか入れておいてくださいませ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/153044.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>WindowsFormのユーザコントロールでは、内部でSize変更するとLocation値が変更されてしまう。</title><link>http://blogs.wankuma.com/mrt/archive/2008/08/01/151418.aspx</link><pubDate>Fri, 01 Aug 2008 15:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2008/08/01/151418.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/151418.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2008/08/01/151418.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/151418.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/151418.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;WindowsFormって、こんなに面倒だったっけ？とか思いつつ、メモ。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;当たり前といえば、当たり前なのかもしれないが、ユーザコントロールに適当なLabelをおいて、ユーザコントロールの大きさを&lt;/p&gt; &lt;p&gt;マウスでぐりぐり動かしてみると、わかる。&lt;/p&gt; &lt;p&gt;ラベル位置（0,0)の位置は、ユーザコントロール側からすると相対的な位置でしかない。&lt;/p&gt; &lt;p&gt;サイズを変更すると、貼り付けたラベルの位置は変わってしまう。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Anchor = none &lt;p&gt;Dock = none &lt;p&gt;AutoSize = false &lt;p&gt;の状態です。 &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;たとえば、こんなの。水色の部分がユーザフォーム。&lt;/p&gt; &lt;p&gt;&lt;img src="http://f.hatena.ne.jp/images/fotolife/M/Mr_T_0023/20080801/20080801152955.jpg?1217572312"&gt; &lt;/p&gt; &lt;p&gt;この端っこをマウスでぐりっと大きくする。&lt;/p&gt; &lt;p&gt;Labelの位置は動いてしまう。つまり、サイズ変更が、Lableの位置まで変更してしまう。&lt;/p&gt; &lt;p&gt;&lt;img src="http://f.hatena.ne.jp/images/fotolife/M/Mr_T_0023/20080801/20080801152956.jpg?1217572249"&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;こんなことで時間をとってしまうなんて。&lt;/p&gt; &lt;p&gt;なんだか、違和感があるのは、私だけ？ というか、WindowsFormを扱いが初心者並なのがバレバレですな。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/151418.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>VB.NETでXMLファイルの整合性とる（チェックする）</title><link>http://blogs.wankuma.com/mrt/archive/2008/07/08/147953.aspx</link><pubDate>Tue, 08 Jul 2008 16:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2008/07/08/147953.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/147953.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2008/07/08/147953.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/147953.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/147953.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;そもそもやりたいことは、単純にいえば、XMLのチェックだ。動的に作成されたXMLが、きちんと生成規則にあっているかどうかを見たいのだが、&lt;/p&gt; &lt;p&gt;具体的にはxsdファイルで定義されいてる内容で目的のXMLデータをValidすることになる。&lt;/p&gt; &lt;p&gt;その際には、XMLSchemeSetクラスが必要。&lt;/p&gt; &lt;p&gt;で、Validするためのサンプルクラスは以下。&lt;/p&gt; &lt;div class="SourceBox"&gt;&lt;font color="blue"&gt;Imports&lt;/font&gt; System.Xml.Schema&lt;br&gt;&lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;/font&gt; XMLChecker&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;Private&lt;/font&gt; _targetXML &lt;font color="blue"&gt;As&lt;/font&gt; XElement&lt;br&gt;&lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Property&lt;/font&gt; TargetXML() &lt;font color="blue"&gt;As&lt;/font&gt; XElement&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Get&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt; _targetXML&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Get&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Set&lt;/font&gt;(&lt;font color="blue"&gt;ByVal&lt;/font&gt; value &lt;font color="blue"&gt;As&lt;/font&gt; XElement)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _targetXML = value&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Set&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Property&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;Private&lt;/font&gt; _validValue &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Boolean&lt;/font&gt; = &lt;font color="blue"&gt;True&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;Private&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt; ReadValid(&lt;font color="blue"&gt;ByVal&lt;/font&gt; sender &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Object&lt;/font&gt;, &lt;font color="blue"&gt;ByVal&lt;/font&gt; e &lt;font color="blue"&gt;As&lt;/font&gt; Xml.Schema.ValidationEventArgs)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _validValue = &lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="green"&gt;'MessageBox.Show(e.Message)&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;Private&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt; XMLValid(&lt;font color="blue"&gt;ByVal&lt;/font&gt; sender &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Object&lt;/font&gt;, &lt;font color="blue"&gt;ByVal&lt;/font&gt; e &lt;font color="blue"&gt;As&lt;/font&gt; ValidationEventArgs)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _validValue = &lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="green"&gt;'MessageBox.Show(e.Message)&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; Valid(&lt;font color="blue"&gt;ByVal&lt;/font&gt; resourceName &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;String&lt;/font&gt;) &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Boolean&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; myAssembly = System.Reflection.&lt;font color="blue"&gt;Assembly&lt;/font&gt;.GetExecutingAssembly&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; targetStream = myAssembly.GetManifestResourceStream(resourceName)&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; targetStream &lt;font color="blue"&gt;Is&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Nothing&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; targetSheme = XmlSchema.Read(targetStream, &lt;font color="blue"&gt;AddressOf&lt;/font&gt; ReadValid)&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; _validValue = &lt;font color="blue"&gt;False&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; targetShemeSet = &lt;font color="blue"&gt;New&lt;/font&gt; XmlSchemaSet&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; targetShemeSet.Add(targetSheme)&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; targetDocument = &lt;font color="blue"&gt;New&lt;/font&gt; XDocument&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; targetDocument.Add(_targetXML)&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; targetDocument.Validate(targetShemeSet, &lt;font color="blue"&gt;AddressOf&lt;/font&gt; XMLValid)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; _validValue = &lt;font color="blue"&gt;False&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt; _validValue&lt;br&gt;&lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; &lt;br&gt;&lt;/div&gt; &lt;p&gt; ここまで至るには、結構な穴があったのだが、まずは列挙。&lt;/p&gt; &lt;p&gt;・実際のValid処理では、XDocumentインスタンスに対して、拡張メソッドのValidを使う。&lt;br&gt;　しかし、そのValidをインテリセンス上に出すには、きちんとImports System.XML.Shemaを書かないと、Validが表示されない。&lt;/p&gt; &lt;p&gt;　※Validは、拡張メソッドってことで、&lt;a href="http://msdn.microsoft.com/ja-jp/library/bb310028.aspx"&gt;Extensions クラス&lt;/a&gt;のメンバになります。拡張メソッド、はじめて使ったよ。&lt;/p&gt; &lt;p&gt;・Validメソッドは、XDocumentに対して拡張されます。XElementとかには拡張されません。なので、Linqとかで使われるXElementをXDocumentに&lt;br&gt;変換しましょう。&lt;/p&gt; &lt;p&gt;・Validして、「おかしいよー」という場合のみ、Addressofで指定されたプロシジャに飛びます。Validした結果は、どこにも保存されないので、&lt;br&gt;自前でプロパティなどに保存すべし。&lt;/p&gt; &lt;p&gt;・XMLファイルからxsdファイルを生成できることを、&lt;a href="http://blogs.wankuma.com/torikobito/"&gt;とりこびと&lt;/a&gt;さんに&lt;a href="http://www.wankuma.com/seminar/20080628osaka20/Default.aspx"&gt;わんくま大阪勉強会#20&lt;/a&gt;で教えてもらったはいいが、そこからStreamにするには&lt;br&gt;どうすりゃいいのかわかっていない。&lt;br&gt;　で、調べたら、アセンブリリソースにしてから、GetManifestResourceStreamを使えという内容を＠ITで発見。⇒&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43530&amp;amp;forum=7&amp;amp;2"&gt;ココ&lt;/a&gt;&lt;/p&gt; &lt;p&gt;※返答していたのが&lt;a href="http://techbank.jp/community/blogs/kametaro/default.aspx"&gt;TecｈBankのかめたろさん&lt;/a&gt;、であることに後で気がついたw&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; で、やってみたらが、GetManifestResourceStreamの引数に、プロジェクト名.***.xsdとしてみたが、StreamはNothingのままで、また悩む。&lt;br&gt;&amp;nbsp; &lt;a href="http://www.atmarkit.co.jp/fdotnet/dotnettips/220resources3/resources3.html"&gt;ここ&lt;/a&gt;も参考にしてみたりしたが、やはりだめ。なぜだろうと、思ったら、VBでいう&lt;strong&gt;「デフォルトの名前空間」をわざと空にしていた！&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;　これがデフォルトの名前空間の弊害か！？&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;　&lt;/strong&gt;指定文字列を”***.xsd”とそのまま書いてみたら、あっさりOK。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;こんなところで、XSDファイルの内容から、チェックできるようになったわけでした。　ファイルパスを指定するらもちょっと簡単にできる。&lt;br&gt;⇒XmlSchemaSetに、そのままファイルパスでAddできる。&lt;/p&gt; &lt;p&gt;自動生成されたXSDファイルは、きちんと見直す必要がありますから、そこも注意。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/147953.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Mr.T</dc:creator><title>Equalsをオーバーライドする（VB.NET）</title><link>http://blogs.wankuma.com/mrt/archive/2008/06/05/141703.aspx</link><pubDate>Thu, 05 Jun 2008 14:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/mrt/archive/2008/06/05/141703.aspx</guid><wfw:comment>http://blogs.wankuma.com/mrt/comments/141703.aspx</wfw:comment><comments>http://blogs.wankuma.com/mrt/archive/2008/06/05/141703.aspx#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://blogs.wankuma.com/mrt/comments/commentRss/141703.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/mrt/services/trackbacks/141703.aspx</trackback:ping><description>&lt;p&gt;Mr.Tです、こんにちは。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;HogeクラスのEaualsをオーバーライドする必要があったので、Memoです。&lt;/p&gt;
&lt;p&gt;既定のEaualsは、クラスが参照型である場合は、参照先の比較になるので、クラス内部の フィールドとかは比較してくれません。 
&lt;p&gt;なので、自前で実装する必要があります。 
&lt;p&gt;まずは、前提条件をば。 &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;複雑なクラスそのものを比較するなら、そのクラスのEqualsをオーバライドする必要があります。 
&lt;li&gt;更に、Equalsをオーバライドしたら、GetHashCodeメソッドもオーバーライドしないといけません。 
&lt;li&gt;EaualsがTrueとなる場合、GetHashCodeで返される値は同じものでなくてはなりません。&lt;br&gt;ただし、必要条件であって、十分条件ではない。 
&lt;li&gt;Nothingとの比較は必ずFalseを返さなくてはならない 
&lt;li&gt;例外をスローすることはない（ってスローしないように作れってことですね）&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;以下を前提にして、更にわからんところを埋める。&lt;/p&gt;
&lt;p&gt;参照ではなく値で比較しなくてはならない場合は、&lt;/p&gt;
&lt;p&gt;
&lt;div class="SourceBox"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Private&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;/font&gt; testclassA&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; valA &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;String&lt;/font&gt; = &lt;font color="#c00040"&gt;""&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; listB &lt;font color="blue"&gt;As&lt;/font&gt; List(Of testclassB) = &lt;font color="blue"&gt;New&lt;/font&gt; List(Of testclassB)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;br&gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Private&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;/font&gt; testclassB&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; val1 &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;String&lt;/font&gt; = &lt;font color="#c00040"&gt;""&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;br&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;こんな感じのクラスで、valAとListBを比較しなくてはならないこと。当然testClassBの比較は、既定のEqualsを使うのではなく、val1を&lt;/p&gt;
&lt;p&gt;比較するように&lt;strong&gt;オーバーライドしなくてはならない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;更に、だ。&lt;/p&gt;
&lt;p&gt;Equalsの引数に取るのは、Objectであることに注意。&lt;/p&gt;
&lt;p&gt;Objectであるため、なんでも引数に取れる。とれるが、それが比較したいクラスではなく、まったく別のクラスであっても&lt;/p&gt;
&lt;p&gt;コンパイルは通る。そして例外が発生したりする。使う側で同一のクラスであるかどうか、というのをあらかじめ知って&lt;/p&gt;
&lt;p&gt;いる場合でないと使えない。（当然だが）&lt;/p&gt;
&lt;p&gt;しかい、それでは困るので、タイプセーフ（？）となるように、Typeの比較を先におこなってしまうのがいいだろう。 &lt;/p&gt;
&lt;div class="SourceBox"&gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Private&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;/font&gt; testclassA&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; valA &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;String&lt;/font&gt; = &lt;font color="#c00040"&gt;""&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt; listB &lt;font color="blue"&gt;As&lt;/font&gt; List(Of testclassB) = &lt;font color="blue"&gt;New&lt;/font&gt; List(Of testclassB)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Class&lt;br&gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt; Test()&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; target = new testclassA&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; flg = target.Equlas(&lt;font color="#c00040"&gt;100&lt;/font&gt;) ⇒こんなのがかけてしまう！&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Sub&lt;/font&gt; &lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;結果、Objectが引数のケースと、自分自身のクラスを引数とする場合を二つ考えておく必要があるってことで、こんな風にする。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="SourceBox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Overloads&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; Equals(&lt;font color="blue"&gt;ByVal&lt;/font&gt; obj &lt;font color="blue"&gt;As&lt;/font&gt; SubGroupData) &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Boolean&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; obj &lt;font color="blue"&gt;Is&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Nothing&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Object&lt;/font&gt;.ReferenceEquals(&lt;font color="blue"&gt;Me&lt;/font&gt;, obj) = &lt;font color="blue"&gt;True&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;True&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Me&lt;/font&gt;.GetHashCode &amp;lt;&amp;gt; obj.GetHashCode &lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False　（※１）&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="green"&gt;'個別実装&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; (&lt;font color="blue"&gt;Me&lt;/font&gt;.SubGroupName &amp;lt;&amp;gt; obj.SubGroupName) &lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; (&lt;font color="blue"&gt;Me&lt;/font&gt;.SubGroupNo &amp;lt;&amp;gt; obj.SubGroupNo) &lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Me&lt;/font&gt;.Count &amp;lt;&amp;gt; obj.Count &lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt; i &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;To&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Me&lt;/font&gt;.Count - &lt;font color="#c00040"&gt;1&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Me&lt;/font&gt;.Item(i).Equals(obj.Item(i)) = &lt;font color="blue"&gt;False&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;True&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Overrides&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; Equals(&lt;font color="blue"&gt;ByVal&lt;/font&gt; obj &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Object&lt;/font&gt;) &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Boolean&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;If&lt;/font&gt; obj.&lt;font color="blue"&gt;GetType&lt;/font&gt;.Equals(&lt;font color="blue"&gt;Me&lt;/font&gt;.&lt;font color="blue"&gt;GetType&lt;/font&gt;) = &lt;font color="blue"&gt;False&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Then&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;False&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Else&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt; Equals(&lt;font color="blue"&gt;CType&lt;/font&gt;(obj, SubGroupData))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;If&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Public&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Overrides&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;/font&gt; GetHashCode() &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; subGroupNameHash &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="blue"&gt;Me&lt;/font&gt;.SubGroupName.GetHashCode&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; subGroupNoHash &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="blue"&gt;Me&lt;/font&gt;.SubGroupNo.GetHashCode&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Dim&lt;/font&gt; listHash &lt;font color="blue"&gt;As&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Integer&lt;/font&gt; = &lt;font color="#c00040"&gt;0&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;For&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Each&lt;/font&gt; sItem &lt;font color="blue"&gt;As&lt;/font&gt; InspectionItemData &lt;font color="blue"&gt;In&lt;/font&gt; _inspectionItemList&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listHash = listHash &lt;font color="blue"&gt;Xor&lt;/font&gt; sItem.GetHashCode&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Next&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;Return&lt;/font&gt; listHash &lt;font color="blue"&gt;Xor&lt;/font&gt; subGroupNameHash &lt;font color="blue"&gt;Xor&lt;/font&gt; subGroupNoHash&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="blue"&gt;End&lt;/font&gt;&amp;nbsp;&lt;font color="blue"&gt;Function&lt;br&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;少々困ったのは、GetHashCodeの実装方法だ。&lt;/p&gt;
&lt;p&gt;これについては、MSDNに書いてある、書いてあるという情報しか見つけられず、結局中に載っていたサンプルを参考に&lt;/p&gt;
&lt;p&gt;各比較値の&lt;strong&gt;HashCodeをXor&lt;/strong&gt;することで、生成することにした。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;めんどくせーーーー。 &lt;/p&gt;
&lt;p&gt;参考URL：&lt;/p&gt;
&lt;p&gt;&lt;a title="http://msdn.microsoft.com/ja-jp/library/336aedhh(vs.80).aspx" href="http://msdn.microsoft.com/ja-jp/library/336aedhh(vs.80).aspx"&gt;http://msdn.microsoft.com/ja-jp/library/336aedhh(vs.80).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.ailight.jp/blog/kazuk/articles/6293.aspx" href="http://www.ailight.jp/blog/kazuk/articles/6293.aspx"&gt;http://www.ailight.jp/blog/kazuk/articles/6293.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;※補足&lt;/p&gt;
&lt;p&gt;今回の場合、Equals内部でGetHashCodeを利用しているが、それがループでHashCodeを作成している。&lt;br&gt;これが速度的なネックにはなりそうである。&lt;br&gt;そもそも、GetHashCodeの比較部分（※１）は、実際十分条件は満たすが、必要条件ではない。&lt;br&gt;つまり、このチェックをしなくても、その後のチェックできちんと判断はされる。&lt;/p&gt;
&lt;p&gt;とすれば、後はこのGetHashCodeそのものにかかる時間と、すっとばしたときの時間との兼ね合いになるが&lt;br&gt;個別実装部分のチェックでもループを回すので、どちらに時間がかかるか、というのはすぐに理解できるだろう。&lt;br&gt;&lt;br&gt;ということで、（※１）は「今回は」しなくていいわけですね。&lt;br&gt;もし、GetHashCodeがもっとすばやく取得できるなら実装しても問題はないのだろう。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/mrt/aggbug/141703.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>