System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 223a76bb4870abbfd6ea97628522417d3fcfe3ec:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 20 0d 0a  soft.com).. * ..
00b0: 20 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74   * Released to t
00c0: 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
00d0: 2c 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77  , use at your ow
00e0: 6e 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a  n risk!.. ******
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2f 0d 0a 0d 0a 75 73 69 6e 67 20 53 79 73  **/....using Sys
0130: 74 65 6d 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74  tem;..using Syst
0140: 65 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f 6e 3b 0d  em.Data.Common;.
0150: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61  .using System.Da
0160: 74 61 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65  ta;..using Syste
0170: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 3b 0d 0a  m.Data.SQLite;..
0180: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 72 61  using System.Tra
0190: 6e 73 61 63 74 69 6f 6e 73 3b 0d 0a 75 73 69 6e  nsactions;..usin
01a0: 67 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74  g System.Collect
01b0: 69 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 75  ions.Generic;..u
01c0: 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 65 78 74  sing System.Text
01d0: 3b 0d 0a 0d 0a 6e 61 6d 65 73 70 61 63 65 20 74  ;....namespace t
01e0: 65 73 74 0d 0a 7b 0d 0a 20 20 69 6e 74 65 72 6e  est..{..  intern
01f0: 61 6c 20 63 6c 61 73 73 20 54 65 73 74 43 61 73  al class TestCas
0200: 65 73 20 3a 20 54 65 73 74 43 61 73 65 42 61 73  es : TestCaseBas
0210: 65 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 72 69 76  e..  {..    priv
0220: 61 74 65 20 63 6f 6e 73 74 20 69 6e 74 20 4e 75  ate const int Nu
0230: 6d 54 68 72 65 61 64 73 20 3d 20 38 3b 0d 0a 20  mThreads = 8;.. 
0240: 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
0250: 20 69 6e 74 20 54 68 72 65 61 64 54 69 6d 65 6f   int ThreadTimeo
0260: 75 74 20 3d 20 36 30 30 30 30 3b 0d 0a 0d 0a 20  ut = 60000;.... 
0270: 20 20 20 70 72 69 76 61 74 65 20 4c 69 73 74 3c     private List<
0280: 73 74 72 69 6e 67 3e 20 64 72 6f 70 74 61 62 6c  string> droptabl
0290: 65 73 20 3d 20 6e 65 77 20 4c 69 73 74 3c 73 74  es = new List<st
02a0: 72 69 6e 67 3e 28 29 3b 0d 0a 20 20 20 20 70 72  ring>();..    pr
02b0: 69 76 61 74 65 20 4c 69 73 74 3c 73 74 72 69 6e  ivate List<strin
02c0: 67 3e 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 20  g> maydroptable 
02d0: 3d 20 6e 65 77 20 4c 69 73 74 3c 73 74 72 69 6e  = new List<strin
02e0: 67 3e 28 29 3b 0d 0a 0d 0a 23 69 66 20 21 49 4e  g>();....#if !IN
02f0: 54 45 52 4f 50 5f 4c 4f 47 0d 0a 20 20 20 20 70  TEROP_LOG..    p
0300: 72 69 76 61 74 65 20 6c 6f 6e 67 20 6c 6f 67 65  rivate long loge
0310: 76 65 6e 74 73 20 3d 20 30 3b 0d 0a 23 65 6e 64  vents = 0;..#end
0320: 69 66 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e  if....    intern
0330: 61 6c 20 54 65 73 74 43 61 73 65 73 28 29 0d 0a  al TestCases()..
0340: 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      {..    }....
0350: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 54 65 73      internal Tes
0360: 74 43 61 73 65 73 28 44 62 50 72 6f 76 69 64 65  tCases(DbProvide
0370: 72 46 61 63 74 6f 72 79 20 66 61 63 74 6f 72 79  rFactory factory
0380: 2c 20 73 74 72 69 6e 67 20 63 6f 6e 6e 65 63 74  , string connect
0390: 69 6f 6e 53 74 72 69 6e 67 29 0d 0a 20 20 20 20  ionString)..    
03a0: 20 20 3a 20 62 61 73 65 28 66 61 63 74 6f 72 79    : base(factory
03b0: 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  , connectionStri
03c0: 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ng)..    {..    
03d0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
03e0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
03f0: 49 6e 73 65 72 74 73 20 62 69 6e 61 72 79 20 64  Inserts binary d
0400: 61 74 61 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ata into the dat
0410: 61 62 61 73 65 20 75 73 69 6e 67 20 61 20 6e 61  abase using a na
0420: 6d 65 64 20 70 61 72 61 6d 65 74 65 72 0d 0a 20  med parameter.. 
0430: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
0440: 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  >..    internal 
0450: 76 6f 69 64 20 42 69 6e 61 72 79 49 6e 73 65 72  void BinaryInser
0460: 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  t()..    {..    
0470: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
0480: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
0490: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
04a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
04b0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
04c0: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
04d0: 54 65 73 74 43 61 73 65 28 46 69 65 6c 64 36 29  TestCase(Field6)
04e0: 20 56 41 4c 55 45 53 28 40 62 69 6e 29 22 3b 0d   VALUES(@bin)";.
04f0: 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d  .        DbParam
0500: 65 74 65 72 20 46 69 65 6c 64 36 20 3d 20 63 6d  eter Field6 = cm
0510: 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  d.CreateParamete
0520: 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  r();....        
0530: 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20 62  byte[] b = new b
0540: 79 74 65 5b 34 30 30 30 5d 3b 0d 0a 20 20 20 20  yte[4000];..    
0550: 20 20 20 20 62 5b 30 5d 20 3d 20 31 3b 0d 0a 20      b[0] = 1;.. 
0560: 20 20 20 20 20 20 20 62 5b 31 30 30 5d 20 3d 20         b[100] = 
0570: 32 3b 0d 0a 20 20 20 20 20 20 20 20 62 5b 31 30  2;..        b[10
0580: 30 30 5d 20 3d 20 33 3b 0d 0a 20 20 20 20 20 20  00] = 3;..      
0590: 20 20 62 5b 32 30 30 30 5d 20 3d 20 34 3b 0d 0a    b[2000] = 4;..
05a0: 20 20 20 20 20 20 20 20 62 5b 33 30 30 30 5d 20          b[3000] 
05b0: 3d 20 35 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  = 5;....        
05c0: 46 69 65 6c 64 36 2e 50 61 72 61 6d 65 74 65 72  Field6.Parameter
05d0: 4e 61 6d 65 20 3d 20 22 40 62 69 6e 22 3b 0d 0a  Name = "@bin";..
05e0: 20 20 20 20 20 20 20 20 46 69 65 6c 64 36 2e 56          Field6.V
05f0: 61 6c 75 65 20 3d 20 62 3b 0d 0a 0d 0a 20 20 20  alue = b;....   
0600: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
0610: 65 72 73 2e 41 64 64 28 46 69 65 6c 64 36 29 3b  ers.Add(Field6);
0620: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
0630: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
0640: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
0650: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
0660: 61 6c 20 76 6f 69 64 20 43 68 65 63 6b 4c 6f 63  al void CheckLoc
0670: 6b 65 64 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ked()..    {..  
0680: 20 20 20 20 2f 2f 20 4c 65 74 73 20 6d 61 6b 65      // Lets make
0690: 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
06a0: 73 65 20 69 73 6e 27 74 20 6c 6f 63 6b 65 64 2e  se isn't locked.
06b0: 20 20 49 66 20 69 74 20 69 73 2c 20 77 65 27 76    If it is, we'v
06c0: 65 20 66 61 69 6c 65 64 2e 0d 0a 20 20 20 20 20  e failed...     
06d0: 20 75 73 69 6e 67 20 28 44 62 43 6f 6e 6e 65 63   using (DbConnec
06e0: 74 69 6f 6e 20 6e 65 77 63 6e 6e 20 3d 20 28 28  tion newcnn = ((
06f0: 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e 6e 29  ICloneable)_cnn)
0700: 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62 43 6f  .Clone() as DbCo
0710: 6e 6e 65 63 74 69 6f 6e 29 0d 0a 20 20 20 20 20  nnection)..     
0720: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
0730: 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e 43  d cmd = newcnn.C
0740: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
0750: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
0760: 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61    if (newcnn.Sta
0770: 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e  te != Connection
0780: 53 74 61 74 65 2e 4f 70 65 6e 29 20 6e 65 77 63  State.Open) newc
0790: 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20  nn.Open();....  
07a0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
07b0: 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20  dText = "INSERT 
07c0: 49 4e 54 4f 20 54 65 73 74 43 61 73 65 20 28 46  INTO TestCase (F
07d0: 69 65 6c 64 31 29 20 53 45 4c 45 43 54 20 31 20  ield1) SELECT 1 
07e0: 57 48 45 52 45 20 31 20 3d 20 32 22 3b 0d 0a 20  WHERE 1 = 2";.. 
07f0: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
0800: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20  teNonQuery();.. 
0810: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
0820: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
0830: 69 64 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29  id CheckSQLite()
0840: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69  ..    {..      i
0850: 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70 65  f (_fact.GetType
0860: 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66 28  ().Name.IndexOf(
0870: 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e 67  "SQLite", String
0880: 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e  Comparison.Ordin
0890: 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d  alIgnoreCase) ==
08a0: 20 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 74 68   -1)..        th
08b0: 72 6f 77 20 6e 65 77 20 49 6e 63 6f 6e 63 6c 75  row new Inconclu
08c0: 73 69 76 65 45 78 63 65 70 74 69 6f 6e 28 22 4e  siveException("N
08d0: 6f 74 20 61 20 53 51 4c 69 74 65 20 64 61 74 61  ot a SQLite data
08e0: 62 61 73 65 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a  base");..    }..
08f0: 0d 0a 23 69 66 20 49 4e 54 45 52 4f 50 5f 43 4f  ..#if INTEROP_CO
0900: 44 45 43 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  DEC..    /// <su
0910: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
0920: 54 65 73 74 73 20 63 68 61 6e 67 69 6e 67 20 70  Tests changing p
0930: 61 73 73 77 6f 72 64 20 6f 6e 20 61 6e 20 65 6e  assword on an en
0940: 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
0950: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
0960: 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74  mary>..    [Test
0970: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
0980: 76 6f 69 64 20 43 68 61 6e 67 65 50 61 73 73 77  void ChangePassw
0990: 6f 72 64 54 65 73 74 28 29 0d 0a 20 20 20 20 7b  ordTest()..    {
09a0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 5f 66  ..        if (_f
09b0: 61 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61  act.GetType().Na
09c0: 6d 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69  me.IndexOf("SQLi
09d0: 74 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61  te", StringCompa
09e0: 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e  rison.OrdinalIgn
09f0: 6f 72 65 43 61 73 65 29 20 3e 20 2d 31 29 0d 0a  oreCase) > -1)..
0a00: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0a10: 20 20 20 20 20 20 20 2f 2f 20 4f 70 65 6e 73 20         // Opens 
0a20: 61 6e 20 75 6e 65 6e 63 72 79 70 74 65 64 20 64  an unencrypted d
0a30: 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20  atabase..       
0a40: 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
0a50: 63 74 69 6f 6e 20 63 6e 6e 20 3d 20 6e 65 77 20  ction cnn = new 
0a60: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
0a70: 28 5f 63 6e 6e 73 74 72 69 6e 67 2e 43 6f 6e 6e  (_cnnstring.Conn
0a80: 65 63 74 69 6f 6e 53 74 72 69 6e 67 29 3b 0d 0a  ectionString);..
0a90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ..            cn
0aa0: 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20  n.Open();....   
0ab0: 20 20 20 20 20 20 20 20 20 2f 2f 20 45 6e 63 72           // Encr
0ac0: 79 70 74 73 20 74 68 65 20 64 61 74 61 62 61 73  ypts the databas
0ad0: 65 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e. The connectio
0ae0: 6e 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  n remains valid 
0af0: 61 6e 64 20 75 73 61 62 6c 65 20 61 66 74 65 72  and usable after
0b00: 77 61 72 64 73 2e 0d 0a 20 20 20 20 20 20 20 20  wards...        
0b10: 20 20 20 20 63 6e 6e 2e 43 68 61 6e 67 65 50 61      cnn.ChangePa
0b20: 73 73 77 6f 72 64 28 22 6d 79 70 61 73 73 77 6f  ssword("mypasswo
0b30: 72 64 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  rd");....       
0b40: 20 20 20 20 20 6d 61 79 64 72 6f 70 74 61 62 6c       maydroptabl
0b50: 65 2e 41 64 64 28 22 43 68 61 6e 67 65 50 61 73  e.Add("ChangePas
0b60: 73 77 6f 72 64 54 65 73 74 22 29 3b 0d 0a 20 20  swordTest");..  
0b70: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6e            if (cn
0b80: 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65  n.State != Conne
0b90: 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29  ctionState.Open)
0ba0: 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20   cnn.Open();..  
0bb0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
0bc0: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
0bd0: 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61   cnn.CreateComma
0be0: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  nd())..         
0bf0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
0c00: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
0c10: 64 54 65 78 74 20 3d 20 22 43 52 45 41 54 45 20  dText = "CREATE 
0c20: 54 41 42 4c 45 20 43 68 61 6e 67 65 50 61 73 73  TABLE ChangePass
0c30: 77 6f 72 64 54 65 73 74 28 49 44 20 69 6e 74 20  wordTest(ID int 
0c40: 70 72 69 6d 61 72 79 20 6b 65 79 29 22 3b 0d 0a  primary key)";..
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
0c70: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
0c80: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
0c90: 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29       cnn.Close()
0ca0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
0cb0: 20 2f 2f 20 54 72 79 20 72 65 2d 6f 70 65 6e 69   // Try re-openi
0cc0: 6e 67 20 77 69 74 68 20 62 61 64 20 70 61 73 73  ng with bad pass
0cd0: 77 6f 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20  word..          
0ce0: 20 20 63 6e 6e 2e 53 65 74 50 61 73 73 77 6f 72    cnn.SetPasswor
0cf0: 64 28 22 21 6d 79 70 61 73 73 77 6f 72 64 22 29  d("!mypassword")
0d00: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ;..            c
0d10: 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20  nn.Open();..    
0d20: 20 20 20 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73          cnn.Clos
0d30: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
0d40: 20 20 20 20 2f 2f 20 54 72 79 20 72 65 2d 6f 70      // Try re-op
0d50: 65 6e 69 6e 67 20 77 69 74 68 20 67 6f 6f 64 20  ening with good 
0d60: 70 61 73 73 77 6f 72 64 0d 0a 20 20 20 20 20 20  password..      
0d70: 20 20 20 20 20 20 63 6e 6e 2e 53 65 74 50 61 73        cnn.SetPas
0d80: 73 77 6f 72 64 28 22 6d 79 70 61 73 73 77 6f 72  sword("mypasswor
0d90: 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  d");..          
0da0: 20 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d    cnn.Open();...
0db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
0dc0: 44 65 63 72 70 79 74 20 64 61 74 61 62 61 73 65  Decrpyt database
0dd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ..            cn
0de0: 6e 2e 43 68 61 6e 67 65 50 61 73 73 77 6f 72 64  n.ChangePassword
0df0: 28 22 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ("");....       
0e00: 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29       cnn.Close()
0e10: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
0e20: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e60: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
0e70: 20 20 20 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d      cnn.Open();.
0e80: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
0e90: 2f 20 52 65 2d 45 6e 63 72 79 70 74 73 20 74 68  / Re-Encrypts th
0ea0: 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  e database. The 
0eb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 6d 61 69  connection remai
0ec0: 6e 73 20 76 61 6c 69 64 20 61 6e 64 20 75 73 61  ns valid and usa
0ed0: 62 6c 65 20 61 66 74 65 72 77 61 72 64 73 2e 0d  ble afterwards..
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e  .            cnn
0ef0: 2e 43 68 61 6e 67 65 50 61 73 73 77 6f 72 64 28  .ChangePassword(
0f00: 22 6d 79 70 61 73 73 77 6f 72 64 22 29 3b 0d 0a  "mypassword");..
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e              cnn.
0f20: 43 68 61 6e 67 65 50 61 73 73 77 6f 72 64 28 22  ChangePassword("
0f30: 6d 79 6e 65 77 65 72 70 61 73 73 77 6f 72 64 22  mynewerpassword"
0f40: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
0f50: 20 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e 41    maydroptable.A
0f60: 64 64 28 22 43 68 61 6e 67 65 50 61 73 73 77 6f  dd("ChangePasswo
0f70: 72 64 54 65 73 74 32 22 29 3b 0d 0a 20 20 20 20  rdTest2");..    
0f80: 20 20 20 20 20 20 20 20 69 66 20 28 63 6e 6e 2e          if (cnn.
0f90: 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74  State != Connect
0fa0: 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 63  ionState.Open) c
0fb0: 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20  nn.Open();..    
0fc0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
0fd0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63  bCommand cmd = c
0fe0: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
0ff0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ())..           
1000: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1010: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
1020: 65 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41  ext = "CREATE TA
1030: 42 4c 45 20 43 68 61 6e 67 65 50 61 73 73 77 6f  BLE ChangePasswo
1040: 72 64 54 65 73 74 32 28 49 44 20 69 6e 74 20 70  rdTest2(ID int p
1050: 72 69 6d 61 72 79 20 6b 65 79 29 22 3b 0d 0a 20  rimary key)";.. 
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1070: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
1080: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
1090: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10a0: 20 20 20 20 2f 2f 20 44 65 63 72 70 79 74 20 64      // Decrpyt d
10b0: 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20  atabase..       
10c0: 20 20 20 20 20 63 6e 6e 2e 43 68 61 6e 67 65 50       cnn.ChangeP
10d0: 61 73 73 77 6f 72 64 28 22 22 29 3b 0d 0a 20 20  assword("");..  
10e0: 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 43 6c            cnn.Cl
10f0: 6f 73 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ose();....      
1100: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1150: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 72 79 20           // Try 
1160: 6f 70 65 6e 69 6e 67 20 6e 6f 77 20 77 69 74 68  opening now with
1170: 6f 75 74 20 70 61 73 73 77 6f 72 64 0d 0a 20 20  out password..  
1180: 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 4f 70            cnn.Op
1190: 65 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  en();..         
11a0: 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d     cnn.Close();.
11b0: 0a 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ...        }..  
11c0: 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20    }..#endif.... 
11d0: 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63     [Test(Sequenc
11e0: 65 3d 31 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72  e=1)]..    inter
11f0: 6e 61 6c 20 73 74 72 69 6e 67 20 56 65 72 73 69  nal string Versi
1200: 6f 6e 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  onTest()..    {.
1210: 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69  .      CheckSQLi
1220: 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 73 74 72  te();..      str
1230: 69 6e 67 5b 5d 20 76 65 72 73 69 6f 6e 20 3d 20  ing[] version = 
1240: 5f 63 6e 6e 2e 53 65 72 76 65 72 56 65 72 73 69  _cnn.ServerVersi
1250: 6f 6e 2e 53 70 6c 69 74 28 27 2e 27 29 3b 0d 0a  on.Split('.');..
1260: 20 20 20 20 20 20 69 66 20 28 43 6f 6e 76 65 72        if (Conver
1270: 74 2e 54 6f 49 6e 74 33 32 28 76 65 72 73 69 6f  t.ToInt32(versio
1280: 6e 5b 30 5d 29 20 3c 20 33 0d 0a 20 20 20 20 20  n[0]) < 3..     
1290: 20 20 20 7c 7c 20 28 43 6f 6e 76 65 72 74 2e 54     || (Convert.T
12a0: 6f 49 6e 74 33 32 28 76 65 72 73 69 6f 6e 5b 30  oInt32(version[0
12b0: 5d 29 20 3d 3d 20 33 20 26 26 20 43 6f 6e 76 65  ]) == 3 && Conve
12c0: 72 74 2e 54 6f 49 6e 74 33 32 28 76 65 72 73 69  rt.ToInt32(versi
12d0: 6f 6e 5b 31 5d 29 20 3c 20 36 29 0d 0a 20 20 20  on[1]) < 6)..   
12e0: 20 20 20 20 20 7c 7c 20 28 43 6f 6e 76 65 72 74       || (Convert
12f0: 2e 54 6f 49 6e 74 33 32 28 76 65 72 73 69 6f 6e  .ToInt32(version
1300: 5b 30 5d 29 20 3d 3d 20 33 20 26 26 20 43 6f 6e  [0]) == 3 && Con
1310: 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 76 65 72  vert.ToInt32(ver
1320: 73 69 6f 6e 5b 31 5d 29 20 3d 3d 20 36 20 26 26  sion[1]) == 6 &&
1330: 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32   Convert.ToInt32
1340: 28 76 65 72 73 69 6f 6e 5b 32 5d 29 20 3c 20 31  (version[2]) < 1
1350: 29 0d 0a 20 20 20 20 20 20 20 20 29 20 74 68 72  )..        ) thr
1360: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
1370: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
1380: 53 51 4c 69 74 65 20 45 6e 67 69 6e 65 20 69 73  SQLite Engine is
1390: 20 7b 30 7d 2e 20 20 4d 69 6e 69 6d 75 6d 20 73   {0}.  Minimum s
13a0: 75 70 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e  upported version
13b0: 20 69 73 20 33 2e 36 2e 31 22 2c 20 5f 63 6e 6e   is 3.6.1", _cnn
13c0: 2e 53 65 72 76 65 72 56 65 72 73 69 6f 6e 29 29  .ServerVersion))
13d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ;....      retur
13e0: 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n String.Format(
13f0: 22 53 51 4c 69 74 65 20 45 6e 67 69 6e 65 20 69  "SQLite Engine i
1400: 73 20 7b 30 7d 22 2c 20 5f 63 6e 6e 2e 53 65 72  s {0}", _cnn.Ser
1410: 76 65 72 56 65 72 73 69 6f 6e 29 3b 0d 0a 20 20  verVersion);..  
1420: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 5b 54 65    }....    //[Te
1430: 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20 31 29  st(Sequence = 1)
1440: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
1450: 76 6f 69 64 20 50 61 72 73 65 54 65 73 74 28 29  void ParseTest()
1460: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 44  ..    {..      D
1470: 61 74 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 5f  ataTable tbl = _
1480: 63 6e 6e 2e 47 65 74 53 63 68 65 6d 61 28 22 56  cnn.GetSchema("V
1490: 69 65 77 43 6f 6c 75 6d 6e 73 22 29 3b 0d 0a 20  iewColumns");.. 
14a0: 20 20 20 20 20 44 61 74 61 54 61 62 6c 65 20 74       DataTable t
14b0: 62 6c 32 20 3d 20 5f 63 6e 6e 2e 47 65 74 53 63  bl2 = _cnn.GetSc
14c0: 68 65 6d 61 28 22 56 69 65 77 73 22 29 3b 0d 0a  hema("Views");..
14d0: 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
14e0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
14f0: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
1500: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
1510: 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d         cmd.Param
1520: 65 74 65 72 73 2e 41 64 64 28 63 6d 64 2e 43 72  eters.Add(cmd.Cr
1530: 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 29  eateParameter())
1540: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ;..        cmd.P
1550: 61 72 61 6d 65 74 65 72 73 5b 30 5d 2e 56 61 6c  arameters[0].Val
1560: 75 65 20 3d 20 31 3b 0d 0a 0d 0a 20 20 20 20 20  ue = 1;....     
1570: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
1580: 73 2e 41 64 64 28 63 6d 64 2e 43 72 65 61 74 65  s.Add(cmd.Create
1590: 50 61 72 61 6d 65 74 65 72 28 29 29 3b 0d 0a 20  Parameter());.. 
15a0: 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d         cmd.Param
15b0: 65 74 65 72 73 5b 31 5d 2e 56 61 6c 75 65 20 3d  eters[1].Value =
15c0: 20 31 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63   1;....        c
15d0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
15e0: 20 22 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20   "select * from 
15f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6c 69  sqlite_master li
1600: 6d 69 74 20 3f 20 6f 66 66 73 65 74 20 3f 22 3b  mit ? offset ?";
1610: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1620: 20 6f 62 6a 20 3d 20 63 6d 64 2e 45 78 65 63 75   obj = cmd.Execu
1630: 74 65 53 63 61 6c 61 72 28 29 3b 0d 0a 0d 0a 20  teScalar();.... 
1640: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
1650: 6e 64 54 65 78 74 20 3d 20 40 22 0d 0a 43 52 45  ndText = @"..CRE
1660: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 41  ATE TEMP TABLE A
1670: 28 49 44 20 49 4e 54 45 47 45 52 2c 20 42 49 44  (ID INTEGER, BID
1680: 20 49 4e 54 45 47 45 52 29 3b 43 52 45 41 54 45   INTEGER);CREATE
1690: 20 54 45 4d 50 20 54 41 42 4c 45 20 42 28 49 44   TEMP TABLE B(ID
16a0: 20 49 4e 54 45 47 45 52 2c 20 4d 59 56 41 4c 20   INTEGER, MYVAL 
16b0: 56 41 52 43 48 41 52 29 3b 0d 0a 49 4e 53 45 52  VARCHAR);..INSER
16c0: 54 20 49 4e 54 4f 20 41 20 28 49 44 2c 20 42 49  T INTO A (ID, BI
16d0: 44 29 20 56 41 4c 55 45 53 28 32 2c 20 31 29 3b  D) VALUES(2, 1);
16e0: 0d 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 42 20  ..INSERT INTO B 
16f0: 28 49 44 2c 20 4d 59 56 41 4c 29 20 56 41 4c 55  (ID, MYVAL) VALU
1700: 45 53 28 31 2c 27 54 45 53 54 27 29 3b 0d 0a 22  ES(1,'TEST');.."
1710: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45  ;..        cmd.E
1720: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
1730: 3b 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20  ;..        ..   
1740: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
1750: 54 65 78 74 20 3d 20 22 73 65 6c 65 63 74 20 2a  Text = "select *
1760: 2c 20 28 73 65 6c 65 63 74 20 31 20 61 73 20 63  , (select 1 as c
1770: 20 66 72 6f 6d 20 62 20 77 68 65 72 65 20 62 2e   from b where b.
1780: 69 64 20 3d 20 61 2e 62 69 64 29 20 66 72 6f 6d  id = a.bid) from
1790: 20 61 3b 22 3b 0d 0a 20 20 20 20 20 20 20 20 75   a;";..        u
17a0: 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64  sing (DbDataRead
17b0: 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e  er reader = cmd.
17c0: 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29 29  ExecuteReader())
17d0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
17e0: 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 52 65         reader.Re
17f0: 61 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  ad();..        }
1800: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
1810: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 73  CommandText = "s
1820: 65 6c 65 63 74 20 61 2e 69 64 20 61 73 20 61 61  elect a.id as aa
1830: 20 66 72 6f 6d 20 61 20 77 68 65 72 65 20 28 73   from a where (s
1840: 65 6c 65 63 74 20 31 20 66 72 6f 6d 20 28 73 65  elect 1 from (se
1850: 6c 65 63 74 20 31 20 77 68 65 72 65 20 31 20 3d  lect 1 where 1 =
1860: 20 61 61 29 29 3b 22 3b 0d 0a 20 20 20 20 20 20   aa));";..      
1870: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
1880: 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20 63  eader reader = c
1890: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
18a0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
18b0: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65 72            reader
18c0: 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20 20  .Read();..      
18d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20    }..        .. 
18e0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
18f0: 6e 64 54 65 78 74 20 3d 20 22 73 65 6c 65 63 74  ndText = "select
1900: 20 2a 2c 20 28 73 65 6c 65 63 74 20 63 6f 75 6e   *, (select coun
1910: 74 28 63 29 20 66 72 6f 6d 20 28 73 65 6c 65 63  t(c) from (selec
1920: 74 20 31 20 61 73 20 63 20 66 72 6f 6d 20 62 20  t 1 as c from b 
1930: 77 68 65 72 65 20 62 2e 69 64 20 3d 20 61 2e 62  where b.id = a.b
1940: 69 64 29 29 20 66 72 6f 6d 20 61 3b 22 3b 0d 0a  id)) from a;";..
1950: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
1960: 62 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64  bDataReader read
1970: 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65  er = cmd.Execute
1980: 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20  Reader())..     
1990: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
19a0: 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a  reader.Read();..
19b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
19d0: 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20   [Test(Sequence 
19e0: 3d 20 33 39 29 5d 0d 0a 20 20 20 20 69 6e 74 65  = 39)]..    inte
19f0: 72 6e 61 6c 20 76 6f 69 64 20 4d 75 6c 74 69 70  rnal void Multip
1a00: 6c 65 46 75 6e 63 74 69 6f 6e 73 28 29 0d 0a 20  leFunctions().. 
1a10: 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63     {..      Chec
1a20: 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 20 20 20 20  kSQLite();..    
1a30: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
1a40: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
1a50: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
1a60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1a70: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
1a80: 20 3d 20 22 53 45 4c 45 43 54 20 4d 59 43 4f 55   = "SELECT MYCOU
1a90: 4e 54 28 46 69 65 6c 64 31 29 2c 20 4d 59 43 4f  NT(Field1), MYCO
1aa0: 55 4e 54 28 46 69 65 6c 64 32 29 20 46 52 4f 4d  UNT(Field2) FROM
1ab0: 20 54 65 73 74 43 61 73 65 22 3b 0d 0a 20 20 20   TestCase";..   
1ac0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
1ad0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
1ae0: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
1af0: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
1b00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 61  {..          rea
1b10: 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20  der.Read();..   
1b20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1b30: 0a 20 20 20 20 7d 0d 0a 0d 0a 23 69 66 20 55 53  .    }....#if US
1b40: 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 26 26  E_INTEROP_DLL &&
1b50: 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49   INTEROP_EXTENSI
1b60: 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 0d 0a 20 20  ON_FUNCTIONS..  
1b70: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
1b80: 20 3d 20 38 29 5d 0d 0a 20 20 20 20 69 6e 74 65   = 8)]..    inte
1b90: 72 6e 61 6c 20 76 6f 69 64 20 46 75 6e 63 74 69  rnal void Functi
1ba0: 6f 6e 57 69 74 68 43 6f 6c 6c 61 74 69 6f 6e 28  onWithCollation(
1bb0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
1bc0: 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a  CheckSQLite();..
1bd0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
1be0: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
1bf0: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
1c00: 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
1c10: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
1c20: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 43  Text = "SELECT C
1c30: 48 41 52 49 4e 44 45 58 28 27 70 61 74 27 2c 20  HARINDEX('pat', 
1c40: 27 74 68 65 70 61 74 27 29 2c 20 43 48 41 52 49  'thepat'), CHARI
1c50: 4e 44 45 58 28 27 70 61 74 27 2c 20 27 54 48 45  NDEX('pat', 'THE
1c60: 50 41 54 27 29 2c 20 43 48 41 52 49 4e 44 45 58  PAT'), CHARINDEX
1c70: 28 27 70 61 74 27 20 43 4f 4c 4c 41 54 45 20 4e  ('pat' COLLATE N
1c80: 4f 43 41 53 45 2c 20 27 54 48 45 50 41 54 27 20  OCASE, 'THEPAT' 
1c90: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29 22  COLLATE NOCASE)"
1ca0: 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ;..        using
1cb0: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
1cc0: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
1cd0: 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20  uteReader())..  
1ce0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1cf0: 20 20 20 72 65 61 64 65 72 2e 52 65 61 64 28 29     reader.Read()
1d00: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ;..          if 
1d10: 28 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34  (reader.GetInt64
1d20: 28 30 29 20 21 3d 20 72 65 61 64 65 72 2e 47 65  (0) != reader.Ge
1d30: 74 49 6e 74 36 34 28 32 29 20 7c 7c 20 72 65 61  tInt64(2) || rea
1d40: 64 65 72 2e 47 65 74 49 6e 74 36 34 28 31 29 20  der.GetInt64(1) 
1d50: 21 3d 20 30 20 7c 7c 20 72 65 61 64 65 72 2e 47  != 0 || reader.G
1d60: 65 74 49 6e 74 36 34 28 30 29 20 21 3d 20 34 29  etInt64(0) != 4)
1d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  ..            th
1d80: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
1d90: 6e 28 22 43 68 61 72 49 6e 64 65 78 20 72 65 74  n("CharIndex ret
1da0: 75 72 6e 65 64 20 77 72 6f 6e 67 20 72 65 73 75  urned wrong resu
1db0: 6c 74 73 21 22 29 3b 0d 0a 20 20 20 20 20 20 20  lts!");..       
1dc0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
1dd0: 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28   }....    [Test(
1de0: 53 65 71 75 65 6e 63 65 20 3d 20 39 29 5d 0d 0a  Sequence = 9)]..
1df0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
1e00: 64 20 46 75 6e 63 74 69 6f 6e 57 69 74 68 43 6f  d FunctionWithCo
1e10: 6c 6c 61 74 69 6f 6e 32 28 29 0d 0a 20 20 20 20  llation2()..    
1e20: 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51  {..      CheckSQ
1e30: 4c 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75  Lite();..      u
1e40: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
1e50: 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
1e60: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
1e70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d     {..        cm
1e80: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
1e90: 22 53 45 4c 45 43 54 20 43 41 53 45 54 45 53 54  "SELECT CASETEST
1ea0: 28 27 70 61 74 27 2c 20 27 70 61 74 27 29 2c 20  ('pat', 'pat'), 
1eb0: 43 41 53 45 54 45 53 54 28 27 70 61 74 27 2c 20  CASETEST('pat', 
1ec0: 27 50 41 54 27 29 2c 20 43 41 53 45 54 45 53 54  'PAT'), CASETEST
1ed0: 28 27 70 61 74 27 20 43 4f 4c 4c 41 54 45 20 4e  ('pat' COLLATE N
1ee0: 4f 43 41 53 45 2c 20 27 50 41 54 27 20 43 4f 4c  OCASE, 'PAT' COL
1ef0: 4c 41 54 45 20 4e 4f 43 41 53 45 29 2c 20 43 41  LATE NOCASE), CA
1f00: 53 45 54 45 53 54 28 27 70 61 74 27 20 43 4f 4c  SETEST('pat' COL
1f10: 4c 41 54 45 20 4d 59 53 45 51 55 45 4e 43 45 2c  LATE MYSEQUENCE,
1f20: 20 27 50 41 54 27 20 43 4f 4c 4c 41 54 45 20 4d   'PAT' COLLATE M
1f30: 59 53 45 51 55 45 4e 43 45 29 2c 20 43 41 53 45  YSEQUENCE), CASE
1f40: 54 45 53 54 28 27 74 61 70 27 2c 20 27 54 41 50  TEST('tap', 'TAP
1f50: 27 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  ' COLLATE NOCASE
1f60: 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69  )";..        usi
1f70: 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72  ng (DbDataReader
1f80: 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78   reader = cmd.Ex
1f90: 65 63 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a  ecuteReader())..
1fa0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1fb0: 20 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64       reader.Read
1fc0: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ();..          i
1fd0: 66 20 28 72 65 61 64 65 72 2e 47 65 74 49 6e 74  f (reader.GetInt
1fe0: 36 34 28 30 29 20 21 3d 20 72 65 61 64 65 72 2e  64(0) != reader.
1ff0: 47 65 74 49 6e 74 36 34 28 32 29 20 7c 7c 20 72  GetInt64(2) || r
2000: 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34 28 31  eader.GetInt64(1
2010: 29 20 21 3d 20 31 20 7c 7c 20 72 65 61 64 65 72  ) != 1 || reader
2020: 2e 47 65 74 49 6e 74 36 34 28 30 29 20 21 3d 20  .GetInt64(0) != 
2030: 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)..            
2040: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
2050: 69 6f 6e 28 22 43 68 61 72 49 6e 64 65 78 20 72  ion("CharIndex r
2060: 65 74 75 72 6e 65 64 20 77 72 6f 6e 67 20 72 65  eturned wrong re
2070: 73 75 6c 74 73 21 22 29 3b 0d 0a 20 20 20 20 20  sults!");..     
2080: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
2090: 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a     }..#endif....
20a0: 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20      [Test]..    
20b0: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 44 61  internal void Da
20c0: 74 61 54 79 70 65 73 53 63 68 65 6d 61 28 29 0d  taTypesSchema().
20d0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73  .    {..      us
20e0: 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20 74  ing (DataTable t
20f0: 62 6c 20 3d 20 5f 63 6e 6e 2e 47 65 74 53 63 68  bl = _cnn.GetSch
2100: 65 6d 61 28 22 44 61 74 61 54 79 70 65 73 22 29  ema("DataTypes")
2110: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
2120: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
2130: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
2140: 0a 20 20 20 20 2f 2f 2f 20 4d 61 6b 65 20 73 75  .    /// Make su
2150: 72 65 20 6f 75 72 20 69 6d 70 6c 65 6d 65 6e 74  re our implement
2160: 61 74 69 6f 6e 20 6f 66 20 43 6c 65 61 72 50 6f  ation of ClearPo
2170: 6f 6c 28 29 20 62 65 68 61 76 65 73 20 65 78 61  ol() behaves exa
2180: 63 74 6c 79 20 61 73 20 74 68 65 20 53 71 6c 43  ctly as the SqlC
2190: 6c 69 65 6e 74 20 76 65 72 73 69 6f 6e 20 69 73  lient version is
21a0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 74 6f 20 62   documented to b
21b0: 65 68 61 76 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ehave...    /// 
21c0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
21d0: 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 3d 39  [Test(Sequence=9
21e0: 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  0)]..    interna
21f0: 6c 20 76 6f 69 64 20 43 6c 65 61 72 50 6f 6f 6c  l void ClearPool
2200: 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  Test()..    {.. 
2210: 20 20 20 20 20 73 74 72 69 6e 67 20 74 61 62 6c       string tabl
2220: 65 20 3d 20 22 63 6c 65 61 72 70 6f 6f 6c 22 3b  e = "clearpool";
2230: 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 74  ..      string t
2240: 65 6d 70 20 3d 20 22 54 45 4d 50 22 3b 0d 0a 0d  emp = "TEMP";...
2250: 0a 20 20 20 20 20 20 69 66 20 28 5f 66 61 63 74  .      if (_fact
2260: 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e  .GetType().Name.
2270: 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74 65 22  IndexOf("SQLite"
2280: 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73  , StringComparis
2290: 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65  on.OrdinalIgnore
22a0: 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a 20 20  Case) == -1)..  
22b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74      {..        t
22c0: 65 6d 70 20 3d 20 53 74 72 69 6e 67 2e 45 6d 70  emp = String.Emp
22d0: 74 79 3b 0d 0a 20 20 20 20 20 20 20 20 74 61 62  ty;..        tab
22e0: 6c 65 20 3d 20 22 23 63 6c 65 61 72 70 6f 6f 6c  le = "#clearpool
22f0: 22 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ";..      }.... 
2300: 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
2310: 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 5f 63  e;..      if (_c
2320: 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47 65 74 56  nnstring.TryGetV
2330: 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67 22 2c 20  alue("Pooling", 
2340: 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d 20 66 61  out value) == fa
2350: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
2360: 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e  xception("Poolin
2370: 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  g not present in
2380: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
2390: 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  ng");..      if 
23a0: 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20 3d 3d 20  ((bool)value == 
23b0: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
23c0: 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78 63   InconclusiveExc
23d0: 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20  eption("Pooling 
23e0: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69 6e 20 74  not enabled in t
23f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
2400: 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  ring");....     
2410: 20 73 74 72 69 6e 67 20 73 71 6c 20 3d 20 53 74   string sql = St
2420: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 43 52 45  ring.Format("CRE
2430: 41 54 45 20 7b 30 7d 20 54 41 42 4c 45 20 7b 31  ATE {0} TABLE {1
2440: 7d 28 69 64 20 69 6e 74 20 70 72 69 6d 61 72 79  }(id int primary
2450: 20 6b 65 79 29 3b 22 2c 20 74 65 6d 70 2c 20 74   key);", temp, t
2460: 61 62 6c 65 29 3b 0d 0a 20 20 20 20 20 20 75 73  able);..      us
2470: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
2480: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
2490: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
24a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20    {..        // 
24b0: 43 72 65 61 74 65 20 61 20 74 65 6d 70 20 74 61  Create a temp ta
24c0: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
24d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 20 77 65  connection so we
24e0: 20 63 61 6e 20 63 6f 6e 66 69 72 6d 20 6f 75 72   can confirm our
24f0: 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   new connections
2500: 20 61 72 65 20 75 73 69 6e 67 20 74 72 75 65 20   are using true 
2510: 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d  new connections.
2520: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
2530: 6d 61 6e 64 54 65 78 74 20 3d 20 73 71 6c 3b 0d  mandText = sql;.
2540: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
2550: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
2560: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
2570: 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30    for (int n = 0
2580: 3b 20 6e 20 3c 20 31 30 3b 20 6e 2b 2b 29 0d 0a  ; n < 10; n++)..
2590: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
25a0: 20 75 73 69 6e 67 20 28 44 62 43 6f 6e 6e 65 63   using (DbConnec
25b0: 74 69 6f 6e 20 6e 65 77 63 6e 6e 20 3d 20 28 28  tion newcnn = ((
25c0: 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e 6e 29  ICloneable)_cnn)
25d0: 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62 43 6f  .Clone() as DbCo
25e0: 6e 6e 65 63 74 69 6f 6e 29 0d 0a 20 20 20 20 20  nnection)..     
25f0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2600: 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61 74 65  if (newcnn.State
2610: 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74   != ConnectionSt
2620: 61 74 65 2e 4f 70 65 6e 29 20 6e 65 77 63 6e 6e  ate.Open) newcnn
2630: 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20 20 20  .Open();..      
2640: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
2650: 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e  mand cmd = newcn
2660: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
2670: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
2680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
2690: 49 66 20 74 68 65 20 70 6f 6f 6c 20 69 73 20 70  If the pool is p
26a0: 72 6f 70 65 72 6c 79 20 69 6d 70 6c 65 6d 65 6e  roperly implemen
26b0: 74 65 64 20 61 6e 64 20 74 68 65 20 70 6f 6f 6c  ted and the pool
26c0: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  ed connection pr
26d0: 6f 70 65 72 6c 79 20 64 65 73 74 72 6f 79 65 64  operly destroyed
26e0: 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77  , this command w
26f0: 69 6c 6c 20 73 75 63 63 65 65 64 2e 0d 0a 20 20  ill succeed...  
2700: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20            // If 
2710: 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
2720: 6f 6e 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  on was obtained 
2730: 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 65 76  from the pool ev
2740: 65 6e 20 61 66 74 65 72 20 77 65 20 63 6c 65 61  en after we clea
2750: 72 65 64 20 69 74 2c 20 74 68 65 6e 20 74 68 69  red it, then thi
2760: 73 20 74 61 62 6c 65 20 77 69 6c 6c 20 61 6c 72  s table will alr
2770: 65 61 64 79 20 65 78 69 73 74 0d 0a 20 20 20 20  eady exist..    
2780: 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 64 20 74          // and t
2790: 68 65 20 74 65 73 74 20 66 61 69 6c 73 2e 0d 0a  he test fails...
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
27b0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 73 71  CommandText = sq
27c0: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
27d0: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
27e0: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
27f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
2800: 2f 20 54 72 79 20 61 6e 64 20 63 6c 65 61 72 20  / Try and clear 
2810: 74 68 65 20 70 6f 6f 6c 20 61 73 73 6f 63 69 61  the pool associa
2820: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 66 69  ted with this fi
2830: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 65  le..          ne
2840: 77 63 6e 6e 2e 47 65 74 54 79 70 65 28 29 2e 49  wcnn.GetType().I
2850: 6e 76 6f 6b 65 4d 65 6d 62 65 72 28 22 43 6c 65  nvokeMember("Cle
2860: 61 72 50 6f 6f 6c 22 2c 20 53 79 73 74 65 6d 2e  arPool", System.
2870: 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
2880: 6e 67 46 6c 61 67 73 2e 53 74 61 74 69 63 20 7c  ngFlags.Static |
2890: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
28a0: 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e  on.BindingFlags.
28b0: 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 20 7c 20 53  InvokeMethod | S
28c0: 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
28d0: 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 50 75  .BindingFlags.Pu
28e0: 62 6c 69 63 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  blic, null, null
28f0: 2c 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d 20 7b  , new object[] {
2900: 20 6e 65 77 63 6e 6e 20 7d 29 3b 0d 0a 0d 0a 20   newcnn });.... 
2910: 20 20 20 20 20 20 20 20 20 2f 2f 20 41 74 20 74           // At t
2920: 68 69 73 20 70 6f 69 6e 74 20 77 68 65 6e 20 74  his point when t
2930: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
2940: 20 64 65 73 74 72 6f 79 65 64 2c 20 69 74 20 73   destroyed, it s
2950: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 74  hould not be ret
2960: 75 72 6e 65 64 20 74 6f 20 74 68 65 20 70 6f 6f  urned to the poo
2970: 6c 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 64  l, but instead d
2980: 69 73 70 6f 73 65 64 2e 0d 0a 20 20 20 20 20 20  isposed...      
2990: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
29a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
29b0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
29c0: 2f 20 54 68 69 73 20 74 65 73 74 73 20 43 6c 65  / This tests Cle
29d0: 61 72 41 6c 6c 50 6f 6f 6c 73 28 29 20 66 75 6e  arAllPools() fun
29e0: 63 74 69 6f 6e 61 6c 69 74 79 2e 20 20 4d 61 6b  ctionality.  Mak
29f0: 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
2a00: 20 70 6f 6f 6c 20 69 73 20 77 6f 72 6b 69 6e 67   pool is working
2a10: 20 70 72 6f 70 65 72 6c 79 20 61 6e 64 20 63 6c   properly and cl
2a20: 65 61 72 69 6e 67 20 70 72 6f 70 65 72 6c 79 2e  earing properly.
2a30: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
2a40: 61 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74 28  ary>..    [Test(
2a50: 53 65 71 75 65 6e 63 65 20 3d 20 31 30 30 29 5d  Sequence = 100)]
2a60: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
2a70: 6f 69 64 20 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c  oid ClearAllPool
2a80: 73 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a  sTest()..    {..
2a90: 20 20 20 20 20 20 73 74 72 69 6e 67 20 74 61 62        string tab
2aa0: 6c 65 20 3d 20 22 63 6c 65 61 72 70 6f 6f 6c 22  le = "clearpool"
2ab0: 3b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20  ;..      string 
2ac0: 74 65 6d 70 20 3d 20 22 54 45 4d 50 22 3b 0d 0a  temp = "TEMP";..
2ad0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 65 78 69        string exi
2ae0: 73 74 73 20 3d 20 22 20 49 46 20 4e 4f 54 20 45  sts = " IF NOT E
2af0: 58 49 53 54 53 20 22 3b 0d 0a 0d 0a 20 20 20 20  XISTS ";....    
2b00: 20 20 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54    if (_fact.GetT
2b10: 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78  ype().Name.Index
2b20: 4f 66 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72  Of("SQLite", Str
2b30: 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72  ingComparison.Or
2b40: 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29  dinalIgnoreCase)
2b50: 20 3d 3d 20 2d 31 29 0d 0a 20 20 20 20 20 20 7b   == -1)..      {
2b60: 0d 0a 20 20 20 20 20 20 20 20 74 65 6d 70 20 3d  ..        temp =
2b70: 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 3b 0d 0a   String.Empty;..
2b80: 20 20 20 20 20 20 20 20 65 78 69 73 74 73 20 3d          exists =
2b90: 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 3b 0d 0a   String.Empty;..
2ba0: 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 3d 20          table = 
2bb0: 22 23 63 6c 65 61 72 70 6f 6f 6c 22 3b 0d 0a 20  "#clearpool";.. 
2bc0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2bd0: 6f 62 6a 65 63 74 20 76 61 6c 75 65 3b 0d 0a 20  object value;.. 
2be0: 20 20 20 20 20 69 66 20 28 5f 63 6e 6e 73 74 72       if (_cnnstr
2bf0: 69 6e 67 2e 54 72 79 47 65 74 56 61 6c 75 65 28  ing.TryGetValue(
2c00: 22 50 6f 6f 6c 69 6e 67 22 2c 20 6f 75 74 20 76  "Pooling", out v
2c10: 61 6c 75 65 29 20 3d 3d 20 66 61 6c 73 65 29 20  alue) == false) 
2c20: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
2c30: 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20 6e 6f 74  ion("Pooling not
2c40: 20 70 72 65 73 65 6e 74 20 69 6e 20 63 6f 6e 6e   present in conn
2c50: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 22 29 3b  ection string");
2c60: 0d 0a 20 20 20 20 20 20 69 66 20 28 28 62 6f 6f  ..      if ((boo
2c70: 6c 29 76 61 6c 75 65 20 3d 3d 20 66 61 6c 73 65  l)value == false
2c80: 29 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 63 6f  ) throw new Inco
2c90: 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74 69 6f  nclusiveExceptio
2ca0: 6e 28 22 50 6f 6f 6c 69 6e 67 20 6e 6f 74 20 65  n("Pooling not e
2cb0: 6e 61 62 6c 65 64 20 69 6e 20 74 68 65 20 63 6f  nabled in the co
2cc0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 22  nnection string"
2cd0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 73 74 72 69  );....      stri
2ce0: 6e 67 20 73 71 6c 20 3d 20 53 74 72 69 6e 67 2e  ng sql = String.
2cf0: 46 6f 72 6d 61 74 28 22 43 52 45 41 54 45 20 7b  Format("CREATE {
2d00: 30 7d 20 54 41 42 4c 45 20 7b 32 7d 7b 31 7d 28  0} TABLE {2}{1}(
2d10: 69 64 20 69 6e 74 20 70 72 69 6d 61 72 79 20 6b  id int primary k
2d20: 65 79 29 3b 22 2c 20 74 65 6d 70 2c 20 74 61 62  ey);", temp, tab
2d30: 6c 65 2c 20 65 78 69 73 74 73 29 3b 0d 0a 0d 0a  le, exists);....
2d40: 20 20 20 20 20 20 5f 63 6e 6e 2e 47 65 74 54 79        _cnn.GetTy
2d50: 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65  pe().InvokeMembe
2d60: 72 28 22 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73  r("ClearAllPools
2d70: 22 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63  ", System.Reflec
2d80: 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67  tion.BindingFlag
2d90: 73 2e 53 74 61 74 69 63 20 7c 20 53 79 73 74 65  s.Static | Syste
2da0: 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e  m.Reflection.Bin
2db0: 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65  dingFlags.Invoke
2dc0: 4d 65 74 68 6f 64 20 7c 20 53 79 73 74 65 6d 2e  Method | System.
2dd0: 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
2de0: 6e 67 46 6c 61 67 73 2e 50 75 62 6c 69 63 2c 20  ngFlags.Public, 
2df0: 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  null, null, null
2e00: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 44 62 43 6f  );....      DbCo
2e10: 6e 6e 65 63 74 69 6f 6e 5b 5d 20 61 72 72 20 3d  nnection[] arr =
2e20: 20 6e 65 77 20 44 62 43 6f 6e 6e 65 63 74 69 6f   new DbConnectio
2e30: 6e 5b 31 30 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20  n[10];....      
2e40: 74 72 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  try..      {..  
2e50: 20 20 20 20 20 20 2f 2f 20 43 72 65 61 74 65 20        // Create 
2e60: 31 30 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  10 connections a
2e70: 6e 64 20 63 72 65 61 74 65 20 74 65 6d 70 6f 72  nd create tempor
2e80: 61 72 79 20 74 61 62 6c 65 73 20 6f 6e 20 74 68  ary tables on th
2e90: 65 6d 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  em..        for 
2ea0: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
2eb0: 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20  10; n++)..      
2ec0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61    {..          a
2ed0: 72 72 5b 6e 5d 20 3d 20 28 28 49 43 6c 6f 6e 65  rr[n] = ((IClone
2ee0: 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65  able)_cnn).Clone
2ef0: 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69  () as DbConnecti
2f00: 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  on;..          i
2f10: 66 20 28 61 72 72 5b 6e 5d 2e 53 74 61 74 65 20  f (arr[n].State 
2f20: 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61  != ConnectionSta
2f30: 74 65 2e 4f 70 65 6e 29 20 61 72 72 5b 6e 5d 2e  te.Open) arr[n].
2f40: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
2f50: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
2f60: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 61 72 72 5b  mmand cmd = arr[
2f70: 6e 5d 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  n].CreateCommand
2f80: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ())..          {
2f90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
2fa0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
2fb0: 73 71 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  sql;..          
2fc0: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
2fd0: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
2fe0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
2ff0: 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67 2e 46  dText = String.F
3000: 6f 72 6d 61 74 28 22 49 4e 53 45 52 54 20 49 4e  ormat("INSERT IN
3010: 54 4f 20 7b 31 7d 20 28 69 64 29 20 56 41 4c 55  TO {1} (id) VALU
3020: 45 53 28 7b 30 7d 29 22 2c 20 6e 2c 20 74 61 62  ES({0})", n, tab
3030: 6c 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  le);..          
3040: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
3050: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
3060: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3070: 20 20 20 73 77 69 74 63 68 20 28 6e 29 0d 0a 20     switch (n).. 
3080: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3090: 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20          case 2: 
30a0: 2f 2f 20 50 75 74 20 74 68 69 73 20 6f 6e 65 20  // Put this one 
30b0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 70 6f  back into the po
30c0: 6f 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol..            
30d0: 20 20 61 72 72 5b 6e 5d 2e 44 69 73 70 6f 73 65    arr[n].Dispose
30e0: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
30f0: 20 20 20 61 72 72 5b 6e 5d 20 3d 20 6e 75 6c 6c     arr[n] = null
3100: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
3110: 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20   break;..       
3120: 20 20 20 20 20 63 61 73 65 20 34 3a 0d 0a 20 20       case 4:..  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43              // C
3140: 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 70 6f 6f  lear all the poo
3150: 6c 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ls..            
3160: 20 20 5f 63 6e 6e 2e 47 65 74 54 79 70 65 28 29    _cnn.GetType()
3170: 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65 72 28 22 43  .InvokeMember("C
3180: 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73 22 2c 20 53  learAllPools", S
3190: 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
31a0: 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 53 74  .BindingFlags.St
31b0: 61 74 69 63 20 7c 20 53 79 73 74 65 6d 2e 52 65  atic | System.Re
31c0: 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67  flection.Binding
31d0: 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d 65 74 68  Flags.InvokeMeth
31e0: 6f 64 20 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c  od | System.Refl
31f0: 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c  ection.BindingFl
3200: 61 67 73 2e 50 75 62 6c 69 63 2c 20 6e 75 6c 6c  ags.Public, null
3210: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0d 0a  , null, null);..
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3230: 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
3240: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
3250: 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f 77 20 63          // Now c
3260: 6c 6f 73 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  lose all the con
3270: 6e 65 63 74 69 6f 6e 73 2e 20 20 4f 6e 6c 79 20  nections.  Only 
3280: 74 68 65 20 6c 61 73 74 20 35 20 73 68 6f 75 6c  the last 5 shoul
3290: 64 20 67 6f 20 69 6e 74 6f 20 74 68 65 20 70 6f  d go into the po
32a0: 6f 6c 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ol..        for 
32b0: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
32c0: 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20  10; n++)..      
32d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69    {..          i
32e0: 66 20 28 61 72 72 5b 6e 5d 20 21 3d 20 6e 75 6c  f (arr[n] != nul
32f0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  l)..          {.
3300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72 72  .            arr
3310: 5b 6e 5d 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a  [n].Dispose();..
3320: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 72 5b              arr[
3330: 6e 5d 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  n] = null;..    
3340: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3350: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f   }....        //
3360: 20 4f 70 65 6e 20 31 30 20 63 6f 6e 6e 65 63 74   Open 10 connect
3370: 69 6f 6e 73 2e 20 20 54 68 65 79 20 73 68 6f 75  ions.  They shou
3380: 6c 64 20 65 69 74 68 65 72 20 68 61 76 65 20 61  ld either have a
3390: 20 63 6c 65 61 72 70 6f 6f 6c 20 63 6f 6e 74 61   clearpool conta
33a0: 69 6e 69 6e 67 20 61 6e 20 69 64 20 6f 66 20 35  ining an id of 5
33b0: 20 6f 72 20 67 72 65 61 74 65 72 2c 0d 0a 20 20   or greater,..  
33c0: 20 20 20 20 20 20 2f 2f 20 6f 72 20 73 68 6f 75        // or shou
33d0: 6c 64 20 68 61 76 65 20 6e 6f 20 63 6c 65 61 72  ld have no clear
33e0: 70 6f 6f 6c 20 74 61 62 6c 65 20 61 74 20 61 6c  pool table at al
33f0: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  l...        for 
3400: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
3410: 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20  10; n++)..      
3420: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61    {..          a
3430: 72 72 5b 6e 5d 20 3d 20 28 28 49 43 6c 6f 6e 65  rr[n] = ((IClone
3440: 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65  able)_cnn).Clone
3450: 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69  () as DbConnecti
3460: 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  on;..          i
3470: 66 20 28 61 72 72 5b 6e 5d 2e 53 74 61 74 65 20  f (arr[n].State 
3480: 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61  != ConnectionSta
3490: 74 65 2e 4f 70 65 6e 29 20 61 72 72 5b 6e 5d 2e  te.Open) arr[n].
34a0: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
34b0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
34c0: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 61 72 72 5b  mmand cmd = arr[
34d0: 6e 5d 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  n].CreateCommand
34e0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ())..          {
34f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
3500: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
3510: 73 71 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  sql;..          
3520: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
3530: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
3540: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
3550: 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67 2e 46  dText = String.F
3560: 6f 72 6d 61 74 28 22 53 45 4c 45 43 54 20 5b 69  ormat("SELECT [i
3570: 64 5d 20 46 52 4f 4d 20 7b 30 7d 22 2c 20 74 61  d] FROM {0}", ta
3580: 62 6c 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ble);..         
3590: 20 20 20 6f 62 6a 65 63 74 20 6f 20 3d 20 63 6d     object o = cm
35a0: 64 2e 45 78 65 63 75 74 65 53 63 61 6c 61 72 28  d.ExecuteScalar(
35b0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
35c0: 20 20 69 66 20 28 6f 20 3d 3d 20 6e 75 6c 6c 20    if (o == null 
35d0: 7c 7c 20 6f 20 3d 3d 20 44 42 4e 75 6c 6c 2e 56  || o == DBNull.V
35e0: 61 6c 75 65 29 0d 0a 20 20 20 20 20 20 20 20 20  alue)..         
35f0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
3600: 2f 20 4e 6f 20 64 61 74 61 20 69 6e 20 74 68 65  / No data in the
3610: 20 74 61 62 6c 65 20 61 74 20 61 6c 6c 2c 20 77   table at all, w
3620: 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20 6d 75  hich means we mu
3630: 73 74 27 76 65 20 6a 75 73 74 20 63 72 65 61 74  st've just creat
3640: 65 64 20 69 74 20 2d 2d 20 63 6f 6e 6e 65 63 74  ed it -- connect
3650: 69 6f 6e 20 77 61 73 6e 27 74 20 70 61 72 74 20  ion wasn't part 
3660: 6f 66 20 74 68 65 20 70 6f 6f 6c 0d 0a 0d 0a 20  of the pool.... 
3670: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 43             if (C
3680: 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 6f  onvert.ToInt32(o
3690: 29 20 3c 20 35 29 0d 0a 20 20 20 20 20 20 20 20  ) < 5)..        
36a0: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
36b0: 45 78 63 65 70 74 69 6f 6e 28 22 55 6e 65 78 70  Exception("Unexp
36c0: 65 63 74 65 64 20 64 61 74 61 20 72 65 74 75 72  ected data retur
36d0: 6e 65 64 20 66 72 6f 6d 20 74 61 62 6c 65 21 22  ned from table!"
36e0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
36f0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
3700: 20 20 20 20 20 20 2f 2f 20 43 6c 65 61 72 20 61        // Clear a
3710: 6c 6c 20 74 68 65 20 70 6f 6f 6c 73 0d 0a 20 20  ll the pools..  
3720: 20 20 20 20 20 20 5f 63 6e 6e 2e 47 65 74 54 79        _cnn.GetTy
3730: 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65  pe().InvokeMembe
3740: 72 28 22 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73  r("ClearAllPools
3750: 22 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63  ", System.Reflec
3760: 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67  tion.BindingFlag
3770: 73 2e 53 74 61 74 69 63 20 7c 20 53 79 73 74 65  s.Static | Syste
3780: 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e  m.Reflection.Bin
3790: 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65  dingFlags.Invoke
37a0: 4d 65 74 68 6f 64 20 7c 20 53 79 73 74 65 6d 2e  Method | System.
37b0: 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
37c0: 6e 67 46 6c 61 67 73 2e 50 75 62 6c 69 63 2c 20  ngFlags.Public, 
37d0: 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  null, null, null
37e0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  );....      }.. 
37f0: 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20       finally..  
3800: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f      {..        /
3810: 2f 20 43 6c 6f 73 65 20 61 6c 6c 20 74 68 65 20  / Close all the 
3820: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
3830: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
3840: 3d 20 30 3b 20 6e 20 3c 20 31 30 3b 20 6e 2b 2b  = 0; n < 10; n++
3850: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
3860: 20 20 20 20 20 20 20 20 69 66 20 28 61 72 72 5b          if (arr[
3870: 6e 5d 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  n] != null)..   
3880: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3890: 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 44 69 73        arr[n].Dis
38a0: 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  pose();..       
38b0: 20 20 20 20 20 61 72 72 5b 6e 5d 20 3d 20 6e 75       arr[n] = nu
38c0: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ll;..          }
38d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
38e0: 20 20 20 20 20 2f 2f 20 43 6c 65 61 72 20 61 6c       // Clear al
38f0: 6c 20 74 68 65 20 70 6f 6f 6c 73 0d 0a 20 20 20  l the pools..   
3900: 20 20 20 20 20 5f 63 6e 6e 2e 47 65 74 54 79 70       _cnn.GetTyp
3910: 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65 72  e().InvokeMember
3920: 28 22 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73 22  ("ClearAllPools"
3930: 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74  , System.Reflect
3940: 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73  ion.BindingFlags
3950: 2e 53 74 61 74 69 63 20 7c 20 53 79 73 74 65 6d  .Static | System
3960: 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64  .Reflection.Bind
3970: 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d  ingFlags.InvokeM
3980: 65 74 68 6f 64 20 7c 20 53 79 73 74 65 6d 2e 52  ethod | System.R
3990: 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e  eflection.Bindin
39a0: 67 46 6c 61 67 73 2e 50 75 62 6c 69 63 2c 20 6e  gFlags.Public, n
39b0: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29  ull, null, null)
39c0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
39d0: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53  }....    [Test(S
39e0: 65 71 75 65 6e 63 65 20 3d 20 35 30 29 5d 0d 0a  equence = 50)]..
39f0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
3a00: 64 20 43 6f 65 72 73 69 6f 6e 54 65 73 74 28 29  d CoersionTest()
3a10: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75  ..    {..      u
3a20: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
3a30: 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
3a40: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
3a50: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d     {..        cm
3a60: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
3a70: 22 53 45 4c 45 43 54 20 46 69 65 6c 64 31 2c 20  "SELECT Field1, 
3a80: 46 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33  Field2, [Fi..ld3
3a90: 5d 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69  ], [Fi..ld4], Fi
3aa0: 65 6c 64 35 2c 20 27 41 27 2c 20 31 2c 20 31 20  eld5, 'A', 1, 1 
3ab0: 2b 20 31 2c 20 33 2e 31 34 31 35 39 20 46 52 4f  + 1, 3.14159 FRO
3ac0: 4d 20 54 65 73 74 43 61 73 65 22 3b 0d 0a 20 20  M TestCase";..  
3ad0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44        using (DbD
3ae0: 61 74 61 52 65 61 64 65 72 20 72 64 20 3d 20 63  ataReader rd = c
3af0: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
3b00: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
3b10: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 64            if (rd
3b20: 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20 20  .Read())..      
3b30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3b40: 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c 64 31     object Field1
3b50: 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32 28 30   = rd.GetInt32(0
3b60: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
3b70: 6f 62 6a 65 63 74 20 46 69 65 6c 64 32 20 3d 20  object Field2 = 
3b80: 72 64 2e 47 65 74 44 6f 75 62 6c 65 28 31 29 3b  rd.GetDouble(1);
3b90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
3ba0: 6a 65 63 74 20 46 69 65 6c 64 33 20 3d 20 72 64  ject Field3 = rd
3bb0: 2e 47 65 74 53 74 72 69 6e 67 28 32 29 3b 0d 0a  .GetString(2);..
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
3bd0: 63 74 20 46 69 65 6c 64 34 20 3d 20 72 64 2e 47  ct Field4 = rd.G
3be0: 65 74 53 74 72 69 6e 67 28 33 29 2e 54 72 69 6d  etString(3).Trim
3bf0: 45 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  End();..        
3c00: 20 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c 64      object Field
3c10: 35 20 3d 20 72 64 2e 47 65 74 44 61 74 65 54 69  5 = rd.GetDateTi
3c20: 6d 65 28 34 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  me(4);....      
3c30: 20 20 20 20 20 20 2f 2f 20 54 68 65 20 6e 65 78        // The nex
3c40: 74 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 75  t statement shou
3c50: 6c 64 20 63 61 75 73 65 20 61 6e 20 65 78 63 65  ld cause an exce
3c60: 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ption..         
3c70: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20     try..        
3c80: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3c90: 20 20 20 20 20 46 69 65 6c 64 31 20 3d 20 72 64       Field1 = rd
3ca0: 2e 47 65 74 53 74 72 69 6e 67 28 30 29 3b 0d 0a  .GetString(0);..
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
3cc0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
3cd0: 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65 20 66  n("Should have f
3ce0: 61 69 6c 65 64 20 74 79 70 65 20 63 68 65 63 6b  ailed type check
3cf0: 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20 20 20  ing!");..       
3d00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3d10: 20 20 20 20 63 61 74 63 68 20 28 49 6e 76 61 6c      catch (Inval
3d20: 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 29  idCastException)
3d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
3d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
3d50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
3d60: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  y..            {
3d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3d80: 46 69 65 6c 64 32 20 3d 20 72 64 2e 47 65 74 53  Field2 = rd.GetS
3d90: 74 72 69 6e 67 28 31 29 3b 0d 0a 20 20 20 20 20  tring(1);..     
3da0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
3db0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53 68  ew Exception("Sh
3dc0: 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64  ould have failed
3dd0: 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67 21 22   type checking!"
3de0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
3df0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  }..            c
3e00: 61 74 63 68 20 28 49 6e 76 61 6c 69 64 43 61 73  atch (InvalidCas
3e10: 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20  tException)..   
3e20: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3e30: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
3e40: 20 20 20 20 20 20 20 46 69 65 6c 64 33 20 3d 20         Field3 = 
3e50: 72 64 2e 47 65 74 53 74 72 69 6e 67 28 32 29 3b  rd.GetString(2);
3e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ..            Fi
3e70: 65 6c 64 34 20 3d 20 72 64 2e 47 65 74 53 74 72  eld4 = rd.GetStr
3e80: 69 6e 67 28 33 29 3b 0d 0a 0d 0a 20 20 20 20 20  ing(3);....     
3e90: 20 20 20 20 20 20 20 46 69 65 6c 64 31 20 3d 20         Field1 = 
3ea0: 72 64 2e 47 65 74 49 6e 74 33 32 28 30 29 3b 0d  rd.GetInt32(0);.
3eb0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ...            t
3ec0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
3ed0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3ee0: 20 46 69 65 6c 64 32 20 3d 20 72 64 2e 47 65 74   Field2 = rd.Get
3ef0: 49 6e 74 33 32 28 31 29 3b 0d 0a 20 20 20 20 20  Int32(1);..     
3f00: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
3f10: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53 68  ew Exception("Sh
3f20: 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64  ould have failed
3f30: 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67 21 22   type checking!"
3f40: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
3f50: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  }..            c
3f60: 61 74 63 68 20 28 49 6e 76 61 6c 69 64 43 61 73  atch (InvalidCas
3f70: 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20  tException)..   
3f80: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3f90: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
3fa0: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
3fb0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3fc0: 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c 64             Field
3fd0: 33 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32 28  3 = rd.GetInt32(
3fe0: 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2);..           
3ff0: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63     throw new Exc
4000: 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68  eption("Should h
4010: 61 76 65 20 66 61 69 6c 65 64 20 74 79 70 65 20  ave failed type 
4020: 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20  checking!");..  
4030: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
4040: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
4050: 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65 70  InvalidCastExcep
4060: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
4070: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4080: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
4090: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20     try..        
40a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
40b0: 20 20 20 20 20 46 69 65 6c 64 34 20 3d 20 72 64       Field4 = rd
40c0: 2e 47 65 74 49 6e 74 33 32 28 33 29 3b 0d 0a 20  .GetInt32(3);.. 
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
40e0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
40f0: 28 22 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61  ("Should have fa
4100: 69 6c 65 64 20 74 79 70 65 20 63 68 65 63 6b 69  iled type checki
4110: 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ng!");..        
4120: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4130: 20 20 20 63 61 74 63 68 20 28 49 6e 76 61 6c 69     catch (Invali
4140: 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 29 0d  dCastException).
4150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
4160: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
4170: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
4180: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65               Fie
41a0: 6c 64 35 20 3d 20 72 64 2e 47 65 74 49 6e 74 33  ld5 = rd.GetInt3
41b0: 32 28 34 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  2(4);..         
41c0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
41d0: 78 63 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64  xception("Should
41e0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 74 79 70   have failed typ
41f0: 65 20 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a  e checking!");..
4200: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
4210: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
4220: 20 28 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63   (InvalidCastExc
4230: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
4240: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4250: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
4260: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
4270: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4280: 20 20 20 20 20 20 20 46 69 65 6c 64 33 20 3d 20         Field3 = 
4290: 72 64 2e 47 65 74 44 65 63 69 6d 61 6c 28 32 29  rd.GetDecimal(2)
42a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
42b0: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
42c0: 74 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61 76  tion("Should hav
42d0: 65 20 66 61 69 6c 65 64 20 74 79 70 65 20 63 68  e failed type ch
42e0: 65 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20  ecking!");..    
42f0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4300: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 49 6e         catch (In
4310: 76 61 6c 69 64 43 61 73 74 45 78 63 65 70 74 69  validCastExcepti
4320: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on)..           
4330: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4340: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  }..            c
4350: 61 74 63 68 20 28 46 6f 72 6d 61 74 45 78 63 65  atch (FormatExce
4360: 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ption)..        
4370: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4380: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4390: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
43a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
43b0: 20 20 20 20 46 69 65 6c 64 34 20 3d 20 72 64 2e      Field4 = rd.
43c0: 47 65 74 44 65 63 69 6d 61 6c 28 33 29 3b 0d 0a  GetDecimal(3);..
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
43e0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
43f0: 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65 20 66  n("Should have f
4400: 61 69 6c 65 64 20 74 79 70 65 20 63 68 65 63 6b  ailed type check
4410: 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20 20 20  ing!");..       
4420: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4430: 20 20 20 20 63 61 74 63 68 20 28 49 6e 76 61 6c      catch (Inval
4440: 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 29  idCastException)
4450: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
4460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
4470: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
4480: 68 20 28 46 6f 72 6d 61 74 45 78 63 65 70 74 69  h (FormatExcepti
4490: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on)..           
44a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
44b0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
44c0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
44d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
44e0: 20 46 69 65 6c 64 35 20 3d 20 72 64 2e 47 65 74   Field5 = rd.Get
44f0: 44 65 63 69 6d 61 6c 28 34 29 3b 0d 0a 20 20 20  Decimal(4);..   
4500: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
4510: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
4520: 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c  Should have fail
4530: 65 64 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67  ed type checking
4540: 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  !");..          
4550: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4560: 20 63 61 74 63 68 20 28 49 6e 76 61 6c 69 64 43   catch (InvalidC
4570: 61 73 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20  astException).. 
4580: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4590: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
45a0: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
45b0: 46 6f 72 6d 61 74 45 78 63 65 70 74 69 6f 6e 29  FormatException)
45c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
45d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
45e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
45f0: 20 20 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f         else thro
4600: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
4610: 22 4e 6f 20 64 61 74 61 20 69 6e 20 74 61 62 6c  "No data in tabl
4620: 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  e");..        }.
4630: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
4640: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71  ...    [Test(Seq
4650: 75 65 6e 63 65 20 3d 20 31 30 29 5d 0d 0a 20 20  uence = 10)]..  
4660: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
4670: 43 72 65 61 74 65 54 61 62 6c 65 28 29 0d 0a 20  CreateTable().. 
4680: 20 20 20 7b 0d 0a 20 20 20 20 20 20 64 72 6f 70     {..      drop
4690: 74 61 62 6c 65 73 2e 41 64 64 28 22 54 65 73 74  tables.Add("Test
46a0: 43 61 73 65 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  Case");....     
46b0: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
46c0: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
46d0: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
46e0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
46f0: 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70  if (_fact.GetTyp
4700: 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66  e().Name.IndexOf
4710: 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e  ("SQLite", Strin
4720: 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69  gComparison.Ordi
4730: 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d  nalIgnoreCase) =
4740: 3d 20 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 20  = -1)..         
4750: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
4760: 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   = "CREATE TABLE
4770: 20 54 65 73 74 43 61 73 65 20 28 49 44 20 62 69   TestCase (ID bi
4780: 67 69 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79  gint primary key
4790: 20 69 64 65 6e 74 69 74 79 2c 20 46 69 65 6c 64   identity, Field
47a0: 31 20 69 6e 74 65 67 65 72 2c 20 46 69 65 6c 64  1 integer, Field
47b0: 32 20 46 6c 6f 61 74 2c 20 5b 46 69 c3 ab 6c 64  2 Float, [Fi..ld
47c0: 33 5d 20 56 41 52 43 48 41 52 28 35 30 29 2c 20  3] VARCHAR(50), 
47d0: 5b 46 69 c3 a6 6c 64 34 5d 20 43 48 41 52 28 31  [Fi..ld4] CHAR(1
47e0: 30 29 2c 20 46 69 65 6c 64 35 20 44 61 74 65 54  0), Field5 DateT
47f0: 69 6d 65 2c 20 46 69 65 6c 64 36 20 49 6d 61 67  ime, Field6 Imag
4800: 65 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 65 6c  e)";..        el
4810: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d  se..          cm
4820: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
4830: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 54 65  "CREATE TABLE Te
4840: 73 74 43 61 73 65 20 28 49 44 20 69 6e 74 65 67  stCase (ID integ
4850: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61  er primary key a
4860: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 20 46 69  utoincrement, Fi
4870: 65 6c 64 31 20 69 6e 74 2c 20 46 69 65 6c 64 32  eld1 int, Field2
4880: 20 46 6c 6f 61 74 2c 20 5b 46 69 c3 ab 6c 64 33   Float, [Fi..ld3
4890: 5d 20 56 41 52 43 48 41 52 28 35 30 29 2c 20 5b  ] VARCHAR(50), [
48a0: 46 69 c3 a6 6c 64 34 5d 20 43 48 41 52 28 31 30  Fi..ld4] CHAR(10
48b0: 29 2c 20 46 69 65 6c 64 35 20 44 61 74 65 54 69  ), Field5 DateTi
48c0: 6d 65 2c 20 46 69 65 6c 64 36 20 49 6d 61 67 65  me, Field6 Image
48d0: 29 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63  )";....        c
48e0: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
48f0: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ry();..      }..
4900: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
4910: 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20 31 31  st(Sequence = 11
4920: 30 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  00)]..    intern
4930: 61 6c 20 73 74 72 69 6e 67 20 44 61 74 61 41 64  al string DataAd
4940: 61 70 74 65 72 54 65 73 74 28 29 0d 0a 20 20 20  apterTest()..   
4950: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
4960: 20 44 61 74 61 41 64 61 70 74 65 72 28 66 61 6c   DataAdapter(fal
4970: 73 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  se);..    }.... 
4980: 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63     [Test(Sequenc
4990: 65 20 3d 20 31 32 30 30 29 5d 0d 0a 20 20 20 20  e = 1200)]..    
49a0: 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e 67 20  internal string 
49b0: 44 61 74 61 41 64 61 70 74 65 72 57 69 74 68 49  DataAdapterWithI
49c0: 64 65 6e 74 69 74 79 46 65 74 63 68 28 29 0d 0a  dentityFetch()..
49d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
49e0: 75 72 6e 20 44 61 74 61 41 64 61 70 74 65 72 28  urn DataAdapter(
49f0: 74 72 75 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  true);..    }...
4a00: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
4a10: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 55 74 69 6c  y>..    /// Util
4a20: 69 7a 65 73 20 74 68 65 20 53 51 4c 69 74 65 43  izes the SQLiteC
4a30: 6f 6d 6d 61 6e 64 42 75 69 6c 64 65 72 2c 20 0d  ommandBuilder, .
4a40: 0a 20 20 20 20 2f 2f 2f 20 77 68 69 63 68 20 69  .    /// which i
4a50: 6e 20 74 75 72 6e 20 75 74 69 6c 69 7a 65 73 20  n turn utilizes 
4a60: 53 51 4c 69 74 65 44 61 74 61 52 65 61 64 65 72  SQLiteDataReader
4a70: 27 73 20 47 65 74 53 63 68 65 6d 61 54 61 62 6c  's GetSchemaTabl
4a80: 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  e() functionalit
4a90: 79 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20  y..    /// This 
4aa0: 69 6e 73 65 72 74 20 69 73 20 73 6c 6f 77 20 62  insert is slow b
4ab0: 65 63 61 75 73 65 20 69 74 20 6d 75 73 74 20 72  ecause it must r
4ac0: 61 69 73 65 20 63 61 6c 6c 62 61 63 6b 73 20 62  aise callbacks b
4ad0: 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65 72 20  efore and after 
4ae0: 65 76 65 72 79 20 75 70 64 61 74 65 2e 0d 0a 20  every update... 
4af0: 20 20 20 2f 2f 2f 20 46 6f 72 20 61 20 66 61 73     /// For a fas
4b00: 74 20 75 70 64 61 74 65 2c 20 73 65 65 20 74 68  t update, see th
4b10: 65 20 46 61 73 74 49 6e 73 65 72 74 4d 61 6e 79  e FastInsertMany
4b20: 20 66 75 6e 63 74 69 6f 6e 20 62 65 6e 65 61 74   function beneat
4b30: 68 20 74 68 69 73 20 6f 6e 65 0d 0a 20 20 20 20  h this one..    
4b40: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
4b50: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72      internal str
4b60: 69 6e 67 20 44 61 74 61 41 64 61 70 74 65 72 28  ing DataAdapter(
4b70: 62 6f 6f 6c 20 62 57 69 74 68 49 64 65 6e 74 69  bool bWithIdenti
4b80: 74 79 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ty)..    {..    
4b90: 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20    StringBuilder 
4ba0: 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53 74  builder = new St
4bb0: 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0d 0a  ringBuilder();..
4bc0: 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
4bd0: 62 54 72 61 6e 73 61 63 74 69 6f 6e 20 64 62 54  bTransaction dbT
4be0: 72 61 6e 73 20 3d 20 5f 63 6e 6e 2e 42 65 67 69  rans = _cnn.Begi
4bf0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 0d  nTransaction()).
4c00: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
4c10: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 41    using (DbDataA
4c20: 64 61 70 74 65 72 20 61 64 70 20 3d 20 5f 66 61  dapter adp = _fa
4c30: 63 74 2e 43 72 65 61 74 65 44 61 74 61 41 64 61  ct.CreateDataAda
4c40: 70 74 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  pter())..       
4c50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73   {..          us
4c60: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
4c70: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
4c80: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
4c90: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4ca0: 20 20 20 20 20 63 6d 64 2e 54 72 61 6e 73 61 63       cmd.Transac
4cb0: 74 69 6f 6e 20 3d 20 64 62 54 72 61 6e 73 3b 0d  tion = dbTrans;.
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
4cd0: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
4ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 54 65  SELECT * FROM Te
4cf0: 73 74 43 61 73 65 20 57 48 45 52 45 20 31 20 3d  stCase WHERE 1 =
4d00: 20 32 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20   2";..          
4d10: 20 20 61 64 70 2e 53 65 6c 65 63 74 43 6f 6d 6d    adp.SelectComm
4d20: 61 6e 64 20 3d 20 63 6d 64 3b 0d 0a 0d 0a 20 20  and = cmd;....  
4d30: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
4d40: 28 44 62 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65  (DbCommandBuilde
4d50: 72 20 62 6c 64 20 3d 20 5f 66 61 63 74 2e 43 72  r bld = _fact.Cr
4d60: 65 61 74 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64  eateCommandBuild
4d70: 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  er())..         
4d80: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4d90: 20 20 20 20 62 6c 64 2e 44 61 74 61 41 64 61 70      bld.DataAdap
4da0: 74 65 72 20 3d 20 61 64 70 3b 0d 0a 20 20 20 20  ter = adp;..    
4db0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
4dc0: 28 61 64 70 2e 49 6e 73 65 72 74 43 6f 6d 6d 61  (adp.InsertComma
4dd0: 6e 64 20 3d 20 28 44 62 43 6f 6d 6d 61 6e 64 29  nd = (DbCommand)
4de0: 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 62 6c 64  ((ICloneable)bld
4df0: 2e 47 65 74 49 6e 73 65 72 74 43 6f 6d 6d 61 6e  .GetInsertComman
4e00: 64 28 29 29 2e 43 6c 6f 6e 65 28 29 29 0d 0a 20  d()).Clone()).. 
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 69 66 20 28 62 57 69 74 68 49 64 65 6e 74 69 74  if (bWithIdentit
4e40: 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y)..            
4e50: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4e60: 20 20 20 20 20 20 20 20 20 69 66 20 28 5f 66 61           if (_fa
4e70: 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d  ct.GetType().Nam
4e80: 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74  e.IndexOf("SQLit
4e90: 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  e", StringCompar
4ea0: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
4eb0: 72 65 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a  reCase) == -1)..
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 61 64 70 2e 49 6e 73 65 72 74 43 6f      adp.InsertCo
4ee0: 6d 6d 61 6e 64 2e 43 6f 6d 6d 61 6e 64 54 65 78  mmand.CommandTex
4ef0: 74 20 2b 3d 20 22 3b 53 45 4c 45 43 54 20 53 43  t += ";SELECT SC
4f00: 4f 50 45 5f 49 44 45 4e 54 49 54 59 28 29 20 41  OPE_IDENTITY() A
4f10: 53 20 5b 49 44 5d 22 3b 0d 0a 20 20 20 20 20 20  S [ID]";..      
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
4f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4f40: 20 20 20 20 20 20 61 64 70 2e 49 6e 73 65 72 74        adp.Insert
4f50: 43 6f 6d 6d 61 6e 64 2e 43 6f 6d 6d 61 6e 64 54  Command.CommandT
4f60: 65 78 74 20 2b 3d 20 22 3b 53 45 4c 45 43 54 20  ext += ";SELECT 
4f70: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
4f80: 64 28 29 20 41 53 20 5b 49 44 5d 22 3b 0d 0a 20  d() AS [ID]";.. 
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 61 64 70 2e 49 6e 73 65 72 74 43 6f 6d 6d 61   adp.InsertComma
4fb0: 6e 64 2e 55 70 64 61 74 65 64 52 6f 77 53 6f 75  nd.UpdatedRowSou
4fc0: 72 63 65 20 3d 20 55 70 64 61 74 65 52 6f 77 53  rce = UpdateRowS
4fd0: 6f 75 72 63 65 2e 46 69 72 73 74 52 65 74 75 72  ource.FirstRetur
4fe0: 6e 65 64 52 65 63 6f 72 64 3b 0d 0a 20 20 20 20  nedRecord;..    
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
5010: 6c 64 2e 44 61 74 61 41 64 61 70 74 65 72 20 3d  ld.DataAdapter =
5020: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
5030: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
5040: 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c 20 3d  (DataTable tbl =
5050: 20 6e 65 77 20 44 61 74 61 54 61 62 6c 65 28 29   new DataTable()
5060: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
5070: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5080: 20 20 20 20 20 20 20 20 61 64 70 2e 46 69 6c 6c          adp.Fill
5090: 28 74 62 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20  (tbl);..        
50a0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69            for (i
50b0: 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30  nt n = 0; n < 10
50c0: 30 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20  000; n++)..     
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 44 61 74 61 52 6f 77 20 72 6f 77 20      DataRow row 
5100: 3d 20 74 62 6c 2e 4e 65 77 52 6f 77 28 29 3b 0d  = tbl.NewRow();.
5110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5120: 20 20 20 20 20 72 6f 77 5b 31 5d 20 3d 20 6e 20       row[1] = n 
5130: 2b 20 28 35 30 30 30 30 20 2a 20 28 28 62 57 69  + (50000 * ((bWi
5140: 74 68 49 64 65 6e 74 69 74 79 20 3d 3d 20 74 72  thIdentity == tr
5150: 75 65 29 20 3f 20 32 20 3a 20 31 29 29 3b 0d 0a  ue) ? 2 : 1));..
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 74 62 6c 2e 52 6f 77 73 2e 41 64 64      tbl.Rows.Add
5180: 28 72 6f 77 29 3b 0d 0a 20 20 20 20 20 20 20 20  (row);..        
5190: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 2f 2f 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65   //Console.Write
51c0: 4c 69 6e 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d  Line(String.Form
51d0: 61 74 28 22 20 20 20 20 20 20 20 20 20 20 49 6e  at("          In
51e0: 73 65 72 74 69 6e 67 20 75 73 69 6e 67 20 43 6f  serting using Co
51f0: 6d 6d 61 6e 64 42 75 69 6c 64 65 72 20 61 6e 64  mmandBuilder and
5200: 20 44 61 74 61 41 64 61 70 74 65 72 5c 72 5c 6e   DataAdapter\r\n
5210: 20 20 20 20 20 20 20 20 20 20 2d 3e 7b 30 7d 20            ->{0} 
5220: 28 31 30 2c 30 30 30 20 72 6f 77 73 29 20 2e 2e  (10,000 rows) ..
5230: 2e 22 2c 20 28 62 57 69 74 68 49 64 65 6e 74 69  .", (bWithIdenti
5240: 74 79 20 3d 3d 20 74 72 75 65 29 20 3f 20 22 28  ty == true) ? "(
5250: 77 69 74 68 20 69 64 65 6e 74 69 74 79 20 66 65  with identity fe
5260: 74 63 68 29 22 20 3a 20 22 22 29 29 3b 0d 0a 20  tch)" : ""));.. 
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 69 6e 74 20 64 74 53 74 61 72 74 20 3d 20 45   int dtStart = E
5290: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
52a0: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  ount;..         
52b0: 20 20 20 20 20 20 20 20 20 61 64 70 2e 55 70 64           adp.Upd
52c0: 61 74 65 28 74 62 6c 29 3b 0d 0a 20 20 20 20 20  ate(tbl);..     
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
52e0: 20 64 74 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e   dtEnd = Environ
52f0: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d  ment.TickCount;.
5300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5310: 20 20 20 64 74 45 6e 64 20 2d 3d 20 64 74 53 74     dtEnd -= dtSt
5320: 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  art;..          
5330: 20 20 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e          builder.
5340: 41 70 70 65 6e 64 46 6f 72 6d 61 74 28 22 49 6e  AppendFormat("In
5350: 73 65 72 74 20 45 6e 64 73 20 69 6e 20 7b 30 7d  sert Ends in {0}
5360: 20 6d 73 20 2e 2e 2e 20 22 2c 20 28 64 74 45 6e   ms ... ", (dtEn
5370: 64 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d));....        
5380: 20 20 20 20 20 20 20 20 20 20 64 74 53 74 61 72            dtStar
5390: 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e  t = Environment.
53a0: 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20  TickCount;..    
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
53c0: 54 72 61 6e 73 2e 43 6f 6d 6d 69 74 28 29 3b 0d  Trans.Commit();.
53d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
53e0: 20 20 20 64 74 45 6e 64 20 3d 20 45 6e 76 69 72     dtEnd = Envir
53f0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
5400: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
5410: 20 20 20 20 20 64 74 45 6e 64 20 2d 3d 20 64 74       dtEnd -= dt
5420: 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20  Start;..        
5430: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 65            builde
5440: 72 2e 41 70 70 65 6e 64 46 6f 72 6d 61 74 28 22  r.AppendFormat("
5450: 43 6f 6d 6d 69 74 73 20 69 6e 20 7b 30 7d 20 6d  Commits in {0} m
5460: 73 22 2c 20 28 64 74 45 6e 64 29 29 3b 0d 0a 0d  s", (dtEnd));...
5470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5480: 20 20 20 69 66 20 28 62 57 69 74 68 49 64 65 6e     if (bWithIden
5490: 74 69 74 79 29 0d 0a 20 20 20 20 20 20 20 20 20  tity)..         
54a0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 75 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65  using (DataTable
54d0: 20 74 62 6c 32 20 3d 20 6e 65 77 20 44 61 74 61   tbl2 = new Data
54e0: 54 61 62 6c 65 28 29 29 0d 0a 20 20 20 20 20 20  Table())..      
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
5500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5510: 20 20 20 20 20 20 20 61 64 70 2e 53 65 6c 65 63         adp.Selec
5520: 74 43 6f 6d 6d 61 6e 64 2e 43 6f 6d 6d 61 6e 64  tCommand.Command
5530: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 2a  Text = "SELECT *
5540: 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57   FROM TestCase W
5550: 48 45 52 45 20 46 69 65 6c 64 31 20 42 45 54 57  HERE Field1 BETW
5560: 45 45 4e 20 31 30 30 30 30 30 20 41 4e 44 20 31  EEN 100000 AND 1
5570: 39 39 39 39 39 20 4f 52 44 45 52 20 42 59 20 46  99999 ORDER BY F
5580: 69 65 6c 64 31 22 3b 0d 0a 20 20 20 20 20 20 20  ield1";..       
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
55a0: 64 70 2e 46 69 6c 6c 28 74 62 6c 32 29 3b 0d 0a  dp.Fill(tbl2);..
55b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
55c0: 20 20 20 20 20 20 20 20 69 66 20 28 74 62 6c 32          if (tbl2
55d0: 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d 20 74  .Rows.Count != t
55e0: 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 29 20 74  bl.Rows.Count) t
55f0: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
5600: 6f 6e 28 22 53 65 6c 65 63 74 65 64 20 64 61 74  on("Selected dat
5610: 61 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  a doesn't match 
5620: 75 70 64 61 74 65 64 20 64 61 74 61 21 22 29 3b  updated data!");
5630: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5640: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69            for (i
5650: 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 74 62  nt n = 0; n < tb
5660: 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 3b 20 6e 2b  l.Rows.Count; n+
5670: 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +)..            
5680: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 20 20 69 66 20 28 74 62 6c 2e 52 6f 77       if (tbl.Row
56b0: 73 5b 6e 5d 5b 30 5d 2e 45 71 75 61 6c 73 28 74  s[n][0].Equals(t
56c0: 62 6c 32 2e 52 6f 77 73 5b 6e 5d 5b 30 5d 29 20  bl2.Rows[n][0]) 
56d0: 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20 20 20  == false)..     
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
5700: 78 63 65 70 74 69 6f 6e 28 22 46 65 74 63 68 65  xception("Fetche
5710: 64 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 6e  d identity doesn
5720: 27 74 20 6d 61 74 63 68 20 73 65 6c 65 63 74 65  't match selecte
5730: 64 20 69 64 65 6e 74 69 74 79 21 22 29 3b 0d 0a  d identity!");..
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
5790: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
57a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
57b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
57c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
57d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72        }..      r
57e0: 65 74 75 72 6e 20 62 75 69 6c 64 65 72 2e 54 6f  eturn builder.To
57f0: 53 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d  String();..    }
5800: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
5810: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4d  mary>..    /// M
5820: 61 6b 65 20 73 75 72 65 20 61 20 64 61 74 61 72  ake sure a datar
5830: 65 61 64 65 72 20 63 61 6e 20 72 75 6e 20 65 76  eader can run ev
5840: 65 6e 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  en if the parent
5850: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 69 73 70   command is disp
5860: 6f 73 65 64 2c 20 61 6e 64 20 74 68 61 74 20 74  osed, and that t
5870: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
5880: 20 63 6c 6f 73 65 64 0d 0a 20 20 20 20 2f 2f 2f   closed..    ///
5890: 20 62 79 20 74 68 65 20 64 61 74 61 72 65 61 64   by the dataread
58a0: 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
58b0: 6e 69 73 68 65 64 2e 0d 0a 20 20 20 20 2f 2f 2f  nished...    ///
58c0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
58d0: 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74   [Test]..    int
58e0: 65 72 6e 61 6c 20 76 6f 69 64 20 44 61 74 61 52  ernal void DataR
58f0: 65 61 64 65 72 43 6c 65 61 6e 75 70 28 29 0d 0a  eaderCleanup()..
5900: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 44 62 43      {..      DbC
5910: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63 6e 6e  onnection newcnn
5920: 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29   = ((ICloneable)
5930: 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61 73  _cnn).Clone() as
5940: 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0d 0a   DbConnection;..
5950: 20 20 20 20 20 20 44 62 43 6f 6d 6d 61 6e 64 20        DbCommand 
5960: 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e 43 72 65  cmd = newcnn.Cre
5970: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 3b 0d 0a 0d  ateCommand();...
5980: 0a 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20  .      try..    
5990: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20    {..        if 
59a0: 28 6e 65 77 63 6e 6e 2e 53 74 61 74 65 20 21 3d  (newcnn.State !=
59b0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65   ConnectionState
59c0: 2e 4f 70 65 6e 29 0d 0a 20 20 20 20 20 20 20 20  .Open)..        
59d0: 20 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b    newcnn.Open();
59e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
59f0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
5a00: 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 22 3b 0d  ELECT 1, 2, 3";.
5a10: 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28  .        using (
5a20: 44 62 44 61 74 61 52 65 61 64 65 72 20 72 65 61  DbDataReader rea
5a30: 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74  der = cmd.Execut
5a40: 65 52 65 61 64 65 72 28 43 6f 6d 6d 61 6e 64 42  eReader(CommandB
5a50: 65 68 61 76 69 6f 72 2e 43 6c 6f 73 65 43 6f 6e  ehavior.CloseCon
5a60: 6e 65 63 74 69 6f 6e 29 29 0d 0a 20 20 20 20 20  nection))..     
5a70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5a80: 63 6d 64 2e 44 69 73 70 6f 73 65 28 29 3b 20 2f  cmd.Dispose(); /
5a90: 2f 20 44 69 73 70 6f 73 65 20 6f 66 20 74 68 65  / Dispose of the
5aa0: 20 63 6f 6d 6d 61 6e 64 20 77 68 69 6c 65 20 61   command while a
5ab0: 6e 20 6f 70 65 6e 20 72 65 61 64 65 72 20 69 73  n open reader is
5ac0: 20 61 63 74 69 76 65 20 2e 2e 2e 20 73 68 6f 75   active ... shou
5ad0: 6c 64 20 73 74 69 6c 6c 20 62 65 20 61 62 6c 65  ld still be able
5ae0: 20 74 6f 20 72 65 61 64 0d 0a 20 20 20 20 20 20   to read..      
5af0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
5b00: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5b10: 20 20 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b    reader.Read();
5b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
5b30: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a           catch..
5b40: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5b50: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
5b60: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 55 6e  ew Exception("Un
5b70: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  able to read fro
5b80: 6d 20 61 20 44 61 74 61 52 65 61 64 65 72 21 22  m a DataReader!"
5b90: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
5ba0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
5bb0: 28 72 65 61 64 65 72 2e 47 65 74 49 6e 74 33 32  (reader.GetInt32
5bc0: 28 30 29 20 21 3d 20 31 20 7c 7c 20 72 65 61 64  (0) != 1 || read
5bd0: 65 72 2e 47 65 74 49 6e 74 33 32 28 31 29 20 21  er.GetInt32(1) !
5be0: 3d 20 32 20 7c 7c 20 72 65 61 64 65 72 2e 47 65  = 2 || reader.Ge
5bf0: 74 49 6e 74 33 32 28 32 29 20 21 3d 20 33 29 0d  tInt32(2) != 3).
5c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
5c10: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
5c20: 28 22 55 6e 65 78 70 65 63 74 65 64 20 72 65 74  ("Unexpected ret
5c30: 75 72 6e 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  urn values from 
5c40: 72 65 61 64 65 72 21 22 29 3b 0d 0a 0d 0a 20 20  reader!");....  
5c50: 20 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 43          reader.C
5c60: 6c 6f 73 65 28 29 3b 20 2f 2f 20 43 6c 6f 73 65  lose(); // Close
5c70: 20 74 68 65 20 72 65 61 64 65 72 2c 20 61 6e 64   the reader, and
5c80: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   check if the co
5c90: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nnection is clos
5ca0: 65 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ed....          
5cb0: 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61 74 65  if (newcnn.State
5cc0: 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74   != ConnectionSt
5cd0: 61 74 65 2e 43 6c 6f 73 65 64 29 0d 0a 20 20 20  ate.Closed)..   
5ce0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
5cf0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 44 61  ew Exception("Da
5d00: 74 61 52 65 61 64 65 72 20 66 61 69 6c 65 64 20  taReader failed 
5d10: 74 6f 20 63 6c 65 61 6e 75 70 21 22 29 3b 0d 0a  to cleanup!");..
5d20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5d30: 20 7d 0d 0a 20 20 20 20 20 20 66 69 6e 61 6c 6c   }..      finall
5d40: 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  y..      {..    
5d50: 20 20 20 20 63 6d 64 2e 44 69 73 70 6f 73 65 28      cmd.Dispose(
5d60: 29 3b 0d 0a 20 20 20 20 20 20 20 20 6e 65 77 63  );..        newc
5d70: 6e 6e 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20  nn.Dispose();.. 
5d80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
5d90: 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20  .    [Test]..   
5da0: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 44   internal void D
5db0: 61 74 61 54 79 70 65 54 65 73 74 28 29 0d 0a 20  ataTypeTest().. 
5dc0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 44 61 74 65     {..      Date
5dd0: 54 69 6d 65 20 6e 6f 77 20 3d 20 44 61 74 65 54  Time now = DateT
5de0: 69 6d 65 2e 4e 6f 77 3b 0d 0a 0d 0a 20 20 20 20  ime.Now;....    
5df0: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
5e00: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
5e10: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
5e20: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5e30: 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28   droptables.Add(
5e40: 22 64 61 74 61 74 79 70 65 74 65 73 74 22 29 3b  "datatypetest");
5e50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  ....        if (
5e60: 5f 66 61 63 74 2e 47 65 74 54 79 70 65 28 29 2e  _fact.GetType().
5e70: 4e 61 6d 65 2e 49 6e 64 65 78 4f 66 28 22 53 51  Name.IndexOf("SQ
5e80: 4c 69 74 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d  Lite", StringCom
5e90: 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49  parison.OrdinalI
5ea0: 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20 2d 31  gnoreCase) == -1
5eb0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  )..          cmd
5ec0: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
5ed0: 63 72 65 61 74 65 20 74 61 62 6c 65 20 64 61 74  create table dat
5ee0: 61 74 79 70 65 74 65 73 74 28 69 64 20 62 69 67  atypetest(id big
5ef0: 69 6e 74 20 69 64 65 6e 74 69 74 79 20 70 72 69  int identity pri
5f00: 6d 61 72 79 20 6b 65 79 2c 20 6d 79 76 61 6c 75  mary key, myvalu
5f10: 65 20 73 71 6c 5f 76 61 72 69 61 6e 74 2c 20 64  e sql_variant, d
5f20: 61 74 65 74 69 6d 65 76 61 6c 75 65 20 64 61 74  atetimevalue dat
5f30: 65 74 69 6d 65 2c 20 64 65 63 69 6d 61 6c 76 61  etime, decimalva
5f40: 6c 75 65 20 64 65 63 69 6d 61 6c 28 33 38 2c 31  lue decimal(38,1
5f50: 38 29 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 65  8))";..        e
5f60: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 63  lse..          c
5f70: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
5f80: 20 22 63 72 65 61 74 65 20 74 61 62 6c 65 20 64   "create table d
5f90: 61 74 61 74 79 70 65 74 65 73 74 28 69 64 20 69  atatypetest(id i
5fa0: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
5fb0: 65 79 2c 20 6d 79 76 61 6c 75 65 20 73 71 6c 5f  ey, myvalue sql_
5fc0: 76 61 72 69 61 6e 74 2c 20 64 61 74 65 74 69 6d  variant, datetim
5fd0: 65 76 61 6c 75 65 20 64 61 74 65 74 69 6d 65 2c  evalue datetime,
5fe0: 20 64 65 63 69 6d 61 6c 76 61 6c 75 65 20 64 65   decimalvalue de
5ff0: 63 69 6d 61 6c 28 33 38 2c 31 38 29 29 22 3b 0d  cimal(38,18))";.
6000: 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45  ...        cmd.E
6010: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
6020: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 53 79 73  ;....        Sys
6030: 74 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f  tem.Globalizatio
6040: 6e 2e 43 75 6c 74 75 72 65 49 6e 66 6f 20 6f 6c  n.CultureInfo ol
6050: 64 63 75 6c 74 75 72 65 20 3d 20 53 79 73 74 65  dculture = Syste
6060: 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
6070: 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64  ad.CurrentThread
6080: 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 3b  .CurrentCulture;
6090: 0d 0a 20 20 20 20 20 20 20 20 53 79 73 74 65 6d  ..        System
60a0: 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 43  .Globalization.C
60b0: 75 6c 74 75 72 65 49 6e 66 6f 20 6f 6c 64 75 69  ultureInfo oldui
60c0: 63 75 6c 74 75 72 65 20 3d 20 53 79 73 74 65 6d  culture = System
60d0: 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61  .Threading.Threa
60e0: 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e  d.CurrentThread.
60f0: 43 75 72 72 65 6e 74 55 49 43 75 6c 74 75 72 65  CurrentUICulture
6100: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  ;....        // 
6110: 49 6e 73 65 72 74 20 75 73 69 6e 67 20 61 20 64  Insert using a d
6120: 69 66 66 65 72 65 6e 74 20 63 75 72 72 65 6e 74  ifferent current
6130: 20 63 75 6c 74 75 72 65 0d 0a 20 20 20 20 20 20   culture..      
6140: 20 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69    System.Threadi
6150: 6e 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e  ng.Thread.Curren
6160: 74 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 43  tThread.CurrentC
6170: 75 6c 74 75 72 65 20 3d 20 6e 65 77 20 53 79 73  ulture = new Sys
6180: 74 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f  tem.Globalizatio
6190: 6e 2e 43 75 6c 74 75 72 65 49 6e 66 6f 28 22 65  n.CultureInfo("e
61a0: 73 2d 45 53 22 29 3b 0d 0a 20 20 20 20 20 20 20  s-ES");..       
61b0: 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e   System.Threadin
61c0: 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  g.Thread.Current
61d0: 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 55 49  Thread.CurrentUI
61e0: 43 75 6c 74 75 72 65 20 3d 20 53 79 73 74 65 6d  Culture = System
61f0: 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61  .Threading.Threa
6200: 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e  d.CurrentThread.
6210: 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 3b 0d  CurrentCulture;.
6220: 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a  ...        try..
6230: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
6240: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
6250: 54 65 78 74 20 3d 20 22 69 6e 73 65 72 74 20 69  Text = "insert i
6260: 6e 74 6f 20 64 61 74 61 74 79 70 65 74 65 73 74  nto datatypetest
6270: 28 6d 79 76 61 6c 75 65 2c 20 64 61 74 65 74 69  (myvalue, dateti
6280: 6d 65 76 61 6c 75 65 2c 20 64 65 63 69 6d 61 6c  mevalue, decimal
6290: 76 61 6c 75 65 29 20 76 61 6c 75 65 73 28 40 70  value) values(@p
62a0: 31 2c 40 70 32 2c 40 70 33 29 22 3b 0d 0a 20 20  1,@p2,@p3)";..  
62b0: 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65          DbParame
62c0: 74 65 72 20 70 31 20 3d 20 63 6d 64 2e 43 72 65  ter p1 = cmd.Cre
62d0: 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0d  ateParameter();.
62e0: 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 72  .          DbPar
62f0: 61 6d 65 74 65 72 20 70 32 20 3d 20 63 6d 64 2e  ameter p2 = cmd.
6300: 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28  CreateParameter(
6310: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 44 62  );..          Db
6320: 50 61 72 61 6d 65 74 65 72 20 70 33 20 3d 20 63  Parameter p3 = c
6330: 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74  md.CreateParamet
6340: 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  er();....       
6350: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
6360: 73 2e 41 64 64 28 70 31 29 3b 0d 0a 20 20 20 20  s.Add(p1);..    
6370: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
6380: 74 65 72 73 2e 41 64 64 28 70 32 29 3b 0d 0a 20  ters.Add(p2);.. 
6390: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72           cmd.Par
63a0: 61 6d 65 74 65 72 73 2e 41 64 64 28 70 33 29 3b  ameters.Add(p3);
63b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 70 31  ....          p1
63c0: 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d  .ParameterName =
63d0: 20 22 40 70 31 22 3b 0d 0a 20 20 20 20 20 20 20   "@p1";..       
63e0: 20 20 20 70 32 2e 50 61 72 61 6d 65 74 65 72 4e     p2.ParameterN
63f0: 61 6d 65 20 3d 20 22 40 70 32 22 3b 0d 0a 20 20  ame = "@p2";..  
6400: 20 20 20 20 20 20 20 20 70 33 2e 50 61 72 61 6d          p3.Param
6410: 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 33 22  eterName = "@p3"
6420: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 70  ;....          p
6430: 31 2e 56 61 6c 75 65 20 3d 20 28 6c 6f 6e 67 29  1.Value = (long)
6440: 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 32  1;..          p2
6450: 2e 56 61 6c 75 65 20 3d 20 6e 65 77 20 44 61 74  .Value = new Dat
6460: 65 54 69 6d 65 28 31 37 35 33 2c 20 31 2c 20 31  eTime(1753, 1, 1
6470: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 33  );..          p3
6480: 2e 56 61 6c 75 65 20 3d 20 28 44 65 63 69 6d 61  .Value = (Decima
6490: 6c 29 31 2e 30 35 3b 0d 0a 20 20 20 20 20 20 20  l)1.05;..       
64a0: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
64b0: 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20  nQuery();....   
64c0: 20 20 20 20 20 20 20 70 31 2e 52 65 73 65 74 44         p1.ResetD
64d0: 62 54 79 70 65 28 29 3b 0d 0a 20 20 20 20 20 20  bType();..      
64e0: 20 20 20 20 70 32 2e 52 65 73 65 74 44 62 54 79      p2.ResetDbTy
64f0: 70 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  pe();..         
6500: 20 70 33 2e 52 65 73 65 74 44 62 54 79 70 65 28   p3.ResetDbType(
6510: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
6520: 70 31 2e 56 61 6c 75 65 20 3d 20 22 4f 6e 65 22  p1.Value = "One"
6530: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 32 2e  ;..          p2.
6540: 56 61 6c 75 65 20 3d 20 22 32 30 30 31 2d 30 31  Value = "2001-01
6550: 2d 30 31 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  -01";..         
6560: 20 70 33 2e 56 61 6c 75 65 20 3d 20 28 44 65 63   p3.Value = (Dec
6570: 69 6d 61 6c 29 31 2e 30 3b 0d 0a 20 20 20 20 20  imal)1.0;..     
6580: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
6590: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20  NonQuery();.... 
65a0: 20 20 20 20 20 20 20 20 20 70 31 2e 52 65 73 65           p1.Rese
65b0: 74 44 62 54 79 70 65 28 29 3b 0d 0a 20 20 20 20  tDbType();..    
65c0: 20 20 20 20 20 20 70 32 2e 52 65 73 65 74 44 62        p2.ResetDb
65d0: 54 79 70 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  Type();..       
65e0: 20 20 20 70 33 2e 52 65 73 65 74 44 62 54 79 70     p3.ResetDbTyp
65f0: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
6600: 20 20 70 31 2e 56 61 6c 75 65 20 3d 20 31 2e 30    p1.Value = 1.0
6610: 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 32  1;..          p2
6620: 2e 56 61 6c 75 65 20 3d 20 6e 6f 77 3b 0d 0a 20  .Value = now;.. 
6630: 20 20 20 20 20 20 20 20 20 70 33 2e 56 61 6c 75           p3.Valu
6640: 65 20 3d 20 28 44 65 63 69 6d 61 6c 29 39 2e 39  e = (Decimal)9.9
6650: 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d  1;..          cm
6660: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
6670: 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y();....        
6680: 20 20 2f 2f 20 52 65 61 64 20 75 73 69 6e 67 20    // Read using 
6690: 61 20 64 69 66 66 65 72 65 6e 74 20 63 75 72 72  a different curr
66a0: 65 6e 74 20 63 75 6c 74 75 72 65 0d 0a 20 20 20  ent culture..   
66b0: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54 68         System.Th
66c0: 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e 43  reading.Thread.C
66d0: 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43 75 72  urrentThread.Cur
66e0: 72 65 6e 74 43 75 6c 74 75 72 65 20 3d 20 6e 65  rentCulture = ne
66f0: 77 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c 69  w System.Globali
6700: 7a 61 74 69 6f 6e 2e 43 75 6c 74 75 72 65 49 6e  zation.CultureIn
6710: 66 6f 28 22 65 6e 2d 55 53 22 29 3b 0d 0a 20 20  fo("en-US");..  
6720: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54          System.T
6730: 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e  hreading.Thread.
6740: 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43 75  CurrentThread.Cu
6750: 72 72 65 6e 74 55 49 43 75 6c 74 75 72 65 20 3d  rrentUICulture =
6760: 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e   System.Threadin
6770: 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  g.Thread.Current
6780: 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 43 75  Thread.CurrentCu
6790: 6c 74 75 72 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  lture;....      
67a0: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
67b0: 65 78 74 20 3d 20 22 73 65 6c 65 63 74 20 6d 79  ext = "select my
67c0: 76 61 6c 75 65 2c 20 64 61 74 65 74 69 6d 65 76  value, datetimev
67d0: 61 6c 75 65 2c 20 64 65 63 69 6d 61 6c 76 61 6c  alue, decimalval
67e0: 75 65 20 66 72 6f 6d 20 64 61 74 61 74 79 70 65  ue from datatype
67f0: 74 65 73 74 22 3b 0d 0a 20 20 20 20 20 20 20 20  test";..        
6800: 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73    cmd.Parameters
6810: 2e 43 6c 65 61 72 28 29 3b 0d 0a 20 20 20 20 20  .Clear();..     
6820: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
6830: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
6840: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
6850: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
6860: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
6870: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
6880: 20 6e 20 3c 20 33 3b 20 6e 2b 2b 29 0d 0a 20 20   n < 3; n++)..  
6890: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
68a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65             reade
68b0: 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20  r.Read();..     
68c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
68d0: 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29 2e  der.GetValue(1).
68e0: 47 65 74 54 79 70 65 28 29 20 21 3d 20 72 65 61  GetType() != rea
68f0: 64 65 72 2e 47 65 74 44 61 74 65 54 69 6d 65 28  der.GetDateTime(
6900: 31 29 2e 47 65 74 54 79 70 65 28 29 29 20 74 68  1).GetType()) th
6910: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
6920: 6e 28 22 44 61 74 65 54 69 6d 65 20 74 79 70 65  n("DateTime type
6930: 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 20   non-match");.. 
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6950: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
6960: 28 32 29 2e 47 65 74 54 79 70 65 28 29 20 21 3d  (2).GetType() !=
6970: 20 72 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d   reader.GetDecim
6980: 61 6c 28 32 29 2e 47 65 74 54 79 70 65 28 29 29  al(2).GetType())
6990: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
69a0: 74 69 6f 6e 28 22 44 65 63 69 6d 61 6c 20 74 79  tion("Decimal ty
69b0: 70 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d  pe non-match");.
69c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
69d0: 20 73 77 69 74 63 68 20 28 6e 29 0d 0a 20 20 20   switch (n)..   
69e0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
6a00: 73 65 20 30 3a 0d 0a 20 20 20 20 20 20 20 20 20  se 0:..         
6a10: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
6a20: 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30 29 2e  der.GetValue(0).
6a30: 47 65 74 54 79 70 65 28 29 20 21 3d 20 74 79 70  GetType() != typ
6a40: 65 6f 66 28 6c 6f 6e 67 29 29 20 74 68 72 6f 77  eof(long)) throw
6a50: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
6a60: 6c 6f 6e 67 20 74 79 70 65 20 6e 6f 6e 2d 6d 61  long type non-ma
6a70: 74 63 68 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  tch");....      
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
6a90: 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28  reader.GetValue(
6aa0: 30 29 2e 45 71 75 61 6c 73 28 28 6c 6f 6e 67 29  0).Equals((long)
6ab0: 31 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72  1) == false) thr
6ac0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
6ad0: 28 22 6c 6f 6e 67 20 76 61 6c 75 65 20 6e 6f 6e  ("long value non
6ae0: 2d 6d 61 74 63 68 22 29 3b 0d 0a 20 20 20 20 20  -match");..     
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6b00: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
6b10: 28 31 29 2e 45 71 75 61 6c 73 28 6e 65 77 20 44  (1).Equals(new D
6b20: 61 74 65 54 69 6d 65 28 31 37 35 33 2c 20 31 2c  ateTime(1753, 1,
6b30: 20 31 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74   1)) == false) t
6b40: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
6b50: 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  on(String.Format
6b60: 28 22 44 61 74 65 54 69 6d 65 20 76 61 6c 75 65  ("DateTime value
6b70: 20 6e 6f 6e 2d 6d 61 74 63 68 20 65 78 70 65 63   non-match expec
6b80: 74 65 64 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22  ted {0} got {1}"
6b90: 2c 20 6e 65 77 20 44 61 74 65 54 69 6d 65 28 31  , new DateTime(1
6ba0: 37 35 33 2c 20 31 2c 20 31 29 2c 20 72 65 61 64  753, 1, 1), read
6bb0: 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29 29 29  er.GetValue(1)))
6bc0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
6bd0: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
6be0: 47 65 74 56 61 6c 75 65 28 32 29 2e 45 71 75 61  GetValue(2).Equa
6bf0: 6c 73 28 28 44 65 63 69 6d 61 6c 29 31 2e 30 35  ls((Decimal)1.05
6c00: 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f  ) == false) thro
6c10: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
6c20: 22 44 65 63 69 6d 61 6c 20 76 61 6c 75 65 20 6e  "Decimal value n
6c30: 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 0d 0a 20  on-match");.... 
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56   if (reader.GetV
6c60: 61 6c 75 65 28 30 29 2e 45 71 75 61 6c 73 28 72  alue(0).Equals(r
6c70: 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34 28 30  eader.GetInt64(0
6c80: 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72  )) == false) thr
6c90: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
6ca0: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
6cb0: 6c 6f 6e 67 20 76 61 6c 75 65 20 66 61 69 6c 65  long value faile
6cc0: 64 20 74 6f 20 6d 61 74 63 68 20 69 74 73 65 6c  d to match itsel
6cd0: 66 2c 20 7b 30 7d 20 61 6e 64 20 7b 31 7d 22 2c  f, {0} and {1}",
6ce0: 20 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65   reader.GetValue
6cf0: 28 30 29 2c 20 72 65 61 64 65 72 2e 47 65 74 49  (0), reader.GetI
6d00: 6e 74 36 34 28 30 29 29 29 3b 0d 0a 20 20 20 20  nt64(0)));..    
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6d20: 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75   (reader.GetValu
6d30: 65 28 31 29 2e 45 71 75 61 6c 73 28 72 65 61 64  e(1).Equals(read
6d40: 65 72 2e 47 65 74 44 61 74 65 54 69 6d 65 28 31  er.GetDateTime(1
6d50: 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72  )) == false) thr
6d60: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
6d70: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
6d80: 44 61 74 65 54 69 6d 65 20 66 61 69 6c 65 64 20  DateTime failed 
6d90: 74 6f 20 6d 61 74 63 68 20 69 74 73 65 6c 66 20  to match itself 
6da0: 7b 30 7d 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65  {0} and {1}", re
6db0: 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29  ader.GetValue(1)
6dc0: 2c 20 72 65 61 64 65 72 2e 47 65 74 44 61 74 65  , reader.GetDate
6dd0: 54 69 6d 65 28 31 29 29 29 3b 0d 0a 20 20 20 20  Time(1)));..    
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6df0: 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75   (reader.GetValu
6e00: 65 28 32 29 2e 45 71 75 61 6c 73 28 72 65 61 64  e(2).Equals(read
6e10: 65 72 2e 47 65 74 44 65 63 69 6d 61 6c 28 32 29  er.GetDecimal(2)
6e20: 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f  ) == false) thro
6e30: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
6e40: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44  String.Format("D
6e50: 65 63 69 6d 61 6c 20 66 61 69 6c 65 64 20 74 6f  ecimal failed to
6e60: 20 6d 61 74 63 68 20 69 74 73 65 6c 66 20 7b 30   match itself {0
6e70: 7d 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65 61 64  } and {1}", read
6e80: 65 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2c 20  er.GetValue(2), 
6e90: 72 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61  reader.GetDecima
6ea0: 6c 28 32 29 29 29 3b 0d 0a 20 20 20 20 20 20 20  l(2)));..       
6eb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
6ec0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
6ed0: 20 20 20 63 61 73 65 20 31 3a 0d 0a 20 20 20 20     case 1:..    
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6ef0: 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75   (reader.GetValu
6f00: 65 28 30 29 2e 47 65 74 54 79 70 65 28 29 20 21  e(0).GetType() !
6f10: 3d 20 74 79 70 65 6f 66 28 73 74 72 69 6e 67 29  = typeof(string)
6f20: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
6f30: 70 74 69 6f 6e 28 22 53 74 72 69 6e 67 20 74 79  ption("String ty
6f40: 70 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d  pe non-match");.
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6f60: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65     if (reader.Ge
6f70: 74 56 61 6c 75 65 28 30 29 2e 45 71 75 61 6c 73  tValue(0).Equals
6f80: 28 22 4f 6e 65 22 29 20 3d 3d 20 66 61 6c 73 65  ("One") == false
6f90: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
6fa0: 70 74 69 6f 6e 28 22 53 74 72 69 6e 67 20 76 61  ption("String va
6fb0: 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b  lue non-match");
6fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6fd0: 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47      if (reader.G
6fe0: 65 74 56 61 6c 75 65 28 31 29 2e 45 71 75 61 6c  etValue(1).Equal
6ff0: 73 28 6e 65 77 20 44 61 74 65 54 69 6d 65 28 32  s(new DateTime(2
7000: 30 30 31 2c 20 31 2c 20 31 29 29 20 3d 3d 20 66  001, 1, 1)) == f
7010: 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20  alse) throw new 
7020: 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
7030: 2e 46 6f 72 6d 61 74 28 22 44 61 74 65 54 69 6d  .Format("DateTim
7040: 65 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  e value non-matc
7050: 68 20 65 78 70 65 63 74 65 64 20 7b 30 7d 20 67  h expected {0} g
7060: 6f 74 20 7b 31 7d 22 2c 20 6e 65 77 20 44 61 74  ot {1}", new Dat
7070: 65 54 69 6d 65 28 32 30 30 31 2c 20 31 2c 20 31  eTime(2001, 1, 1
7080: 29 2c 20 72 65 61 64 65 72 2e 47 65 74 56 61 6c  ), reader.GetVal
7090: 75 65 28 31 29 29 29 3b 0d 0a 20 20 20 20 20 20  ue(1)));..      
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
70b0: 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28  reader.GetValue(
70c0: 32 29 2e 45 71 75 61 6c 73 28 28 44 65 63 69 6d  2).Equals((Decim
70d0: 61 6c 29 31 2e 30 29 20 3d 3d 20 66 61 6c 73 65  al)1.0) == false
70e0: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
70f0: 70 74 69 6f 6e 28 22 44 65 63 69 6d 61 6c 20 76  ption("Decimal v
7100: 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29  alue non-match")
7110: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
7120: 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65         if (reade
7130: 72 2e 47 65 74 53 74 72 69 6e 67 28 30 29 20 21  r.GetString(0) !
7140: 3d 20 22 4f 6e 65 22 29 20 74 68 72 6f 77 20 6e  = "One") throw n
7150: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53 74  ew Exception("St
7160: 72 69 6e 67 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d  ring value non-m
7170: 61 74 63 68 22 29 3b 0d 0a 20 20 20 20 20 20 20  atch");..       
7180: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
7190: 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31  eader.GetValue(1
71a0: 29 2e 45 71 75 61 6c 73 28 72 65 61 64 65 72 2e  ).Equals(reader.
71b0: 47 65 74 44 61 74 65 54 69 6d 65 28 31 29 29 20  GetDateTime(1)) 
71c0: 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20  == false) throw 
71d0: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74  new Exception(St
71e0: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44 61 74  ring.Format("Dat
71f0: 65 54 69 6d 65 20 66 61 69 6c 65 64 20 74 6f 20  eTime failed to 
7200: 6d 61 74 63 68 20 69 74 73 65 6c 66 20 7b 30 7d  match itself {0}
7210: 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65 61 64 65   and {1}", reade
7220: 72 2e 47 65 74 56 61 6c 75 65 28 31 29 2c 20 72  r.GetValue(1), r
7230: 65 61 64 65 72 2e 47 65 74 44 61 74 65 54 69 6d  eader.GetDateTim
7240: 65 28 31 29 29 29 3b 0d 0a 20 20 20 20 20 20 20  e(1)));..       
7250: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
7260: 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 32  eader.GetValue(2
7270: 29 2e 45 71 75 61 6c 73 28 72 65 61 64 65 72 2e  ).Equals(reader.
7280: 47 65 74 44 65 63 69 6d 61 6c 28 32 29 29 20 3d  GetDecimal(2)) =
7290: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
72a0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72  ew Exception(Str
72b0: 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44 65 63 69  ing.Format("Deci
72c0: 6d 61 6c 20 66 61 69 6c 65 64 20 74 6f 20 6d 61  mal failed to ma
72d0: 74 63 68 20 69 74 73 65 6c 66 20 7b 30 7d 20 61  tch itself {0} a
72e0: 6e 64 20 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e  nd {1}", reader.
72f0: 47 65 74 56 61 6c 75 65 28 32 29 2c 20 72 65 61  GetValue(2), rea
7300: 64 65 72 2e 47 65 74 44 65 63 69 6d 61 6c 28 32  der.GetDecimal(2
7310: 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  )));..          
7320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 63 61 73 65 20 32 3a 0d 0a 20 20 20 20 20 20 20  case 2:..       
7350: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
7360: 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30  eader.GetValue(0
7370: 29 2e 47 65 74 54 79 70 65 28 29 20 21 3d 20 74  ).GetType() != t
7380: 79 70 65 6f 66 28 64 6f 75 62 6c 65 29 29 20 74  ypeof(double)) t
7390: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
73a0: 6f 6e 28 22 44 6f 75 62 6c 65 20 74 79 70 65 20  on("Double type 
73b0: 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 20 20  non-match");..  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
73e0: 6c 75 65 28 30 29 2e 45 71 75 61 6c 73 28 31 2e  lue(0).Equals(1.
73f0: 30 31 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68  01) == false) th
7400: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
7410: 6e 28 22 44 6f 75 62 6c 65 20 76 61 6c 75 65 20  n("Double value 
7420: 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 20 20  non-match");..  
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
7450: 6c 75 65 28 31 29 2e 54 6f 53 74 72 69 6e 67 28  lue(1).ToString(
7460: 29 20 21 3d 20 6e 6f 77 2e 54 6f 53 74 72 69 6e  ) != now.ToStrin
7470: 67 28 29 29 20 74 68 72 6f 77 20 6e 65 77 20 45  g()) throw new E
7480: 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e  xception(String.
7490: 46 6f 72 6d 61 74 28 22 44 61 74 65 54 69 6d 65  Format("DateTime
74a0: 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68   value non-match
74b0: 2c 20 65 78 70 65 63 74 65 64 20 7b 30 7d 20 67  , expected {0} g
74c0: 6f 74 20 7b 31 7d 22 2c 20 6e 6f 77 2c 20 72 65  ot {1}", now, re
74d0: 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29  ader.GetValue(1)
74e0: 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ));..           
74f0: 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65         if (reade
7500: 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2e 45 71  r.GetValue(2).Eq
7510: 75 61 6c 73 28 28 44 65 63 69 6d 61 6c 29 39 2e  uals((Decimal)9.
7520: 39 31 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68  91) == false) th
7530: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
7540: 6e 28 22 44 65 63 69 6d 61 6c 20 76 61 6c 75 65  n("Decimal value
7550: 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 0d   non-match");...
7560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7570: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65     if (reader.Ge
7580: 74 44 6f 75 62 6c 65 28 30 29 20 21 3d 20 31 2e  tDouble(0) != 1.
7590: 30 31 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  01) throw new Ex
75a0: 63 65 70 74 69 6f 6e 28 22 44 6f 75 62 6c 65 20  ception("Double 
75b0: 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22  value non-match"
75c0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
75d0: 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72        if (reader
75e0: 2e 47 65 74 56 61 6c 75 65 28 31 29 2e 45 71 75  .GetValue(1).Equ
75f0: 61 6c 73 28 72 65 61 64 65 72 2e 47 65 74 44 61  als(reader.GetDa
7600: 74 65 54 69 6d 65 28 31 29 29 20 3d 3d 20 66 61  teTime(1)) == fa
7610: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
7620: 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e  xception(String.
7630: 46 6f 72 6d 61 74 28 22 44 61 74 65 54 69 6d 65  Format("DateTime
7640: 20 66 61 69 6c 65 64 20 74 6f 20 6d 61 74 63 68   failed to match
7650: 20 69 74 73 65 6c 66 20 7b 30 7d 20 61 6e 64 20   itself {0} and 
7660: 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e 47 65 74  {1}", reader.Get
7670: 56 61 6c 75 65 28 31 29 2c 20 72 65 61 64 65 72  Value(1), reader
7680: 2e 47 65 74 44 61 74 65 54 69 6d 65 28 31 29 29  .GetDateTime(1))
7690: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
76a0: 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72        if (reader
76b0: 2e 47 65 74 56 61 6c 75 65 28 32 29 2e 45 71 75  .GetValue(2).Equ
76c0: 61 6c 73 28 72 65 61 64 65 72 2e 47 65 74 44 65  als(reader.GetDe
76d0: 63 69 6d 61 6c 28 32 29 29 20 3d 3d 20 66 61 6c  cimal(2)) == fal
76e0: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
76f0: 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46  ception(String.F
7700: 6f 72 6d 61 74 28 22 44 65 63 69 6d 61 6c 20 66  ormat("Decimal f
7710: 61 69 6c 65 64 20 74 6f 20 6d 61 74 63 68 20 69  ailed to match i
7720: 74 73 65 6c 66 20 7b 30 7d 20 61 6e 64 20 7b 31  tself {0} and {1
7730: 7d 22 2c 20 72 65 61 64 65 72 2e 47 65 74 56 61  }", reader.GetVa
7740: 6c 75 65 28 32 29 2c 20 72 65 61 64 65 72 2e 47  lue(2), reader.G
7750: 65 74 44 65 63 69 6d 61 6c 28 32 29 29 29 3b 0d  etDecimal(2)));.
7760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7770: 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
7780: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7790: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
77a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
77b0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  }..        final
77c0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ly..        {.. 
77d0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
77e0: 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64  Threading.Thread
77f0: 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43  .CurrentThread.C
7800: 75 72 72 65 6e 74 43 75 6c 74 75 72 65 20 3d 20  urrentCulture = 
7810: 6f 6c 64 63 75 6c 74 75 72 65 3b 0d 0a 20 20 20  oldculture;..   
7820: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54 68         System.Th
7830: 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e 43  reading.Thread.C
7840: 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43 75 72  urrentThread.Cur
7850: 72 65 6e 74 55 49 43 75 6c 74 75 72 65 20 3d 20  rentUICulture = 
7860: 6f 6c 64 75 69 63 75 6c 74 75 72 65 3b 0d 0a 20  olduiculture;.. 
7870: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7880: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
7890: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
78a0: 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61     /// This is a
78b0: 6e 20 6d 65 61 6e 20 75 67 6c 79 20 74 65 73 74  n mean ugly test
78c0: 20 74 68 61 74 20 6c 65 61 76 65 73 20 61 20 6c   that leaves a l
78d0: 6f 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 72  ot of open datar
78e0: 65 61 64 65 72 73 20 6f 75 74 20 6f 6e 20 6d 61  eaders out on ma
78f0: 6e 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a  ny connections..
7900: 20 20 20 20 2f 2f 2f 20 74 6f 20 73 65 65 20 69      /// to see i
7910: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
7920: 61 6e 20 73 75 72 76 69 76 65 20 62 65 69 6e 67  an survive being
7930: 20 63 6c 6f 6e 65 64 20 61 20 6c 6f 74 20 61 6e   cloned a lot an
7940: 64 20 64 69 73 70 6f 73 65 64 20 77 68 69 6c 65  d disposed while
7950: 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73 20   active readers 
7960: 61 72 65 20 75 70 2e 0d 0a 20 20 20 20 2f 2f 2f  are up...    ///
7970: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
7980: 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20   [Test(Sequence 
7990: 3d 20 34 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65  = 40)]..    inte
79a0: 72 6e 61 6c 20 76 6f 69 64 20 4c 65 61 6b 79 44  rnal void LeakyD
79b0: 61 74 61 52 65 61 64 65 72 73 28 29 0d 0a 20 20  ataReaders()..  
79c0: 20 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 0d 0a    {..      try..
79d0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
79e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 44 62   {..          Db
79f0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63 6e  Connection newcn
7a00: 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  n = null;..     
7a10: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
7a20: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7a30: 20 20 20 66 6f 72 20 28 69 6e 74 20 78 20 3d 20     for (int x = 
7a40: 30 3b 20 78 20 3c 20 31 30 30 30 30 3b 20 78 2b  0; x < 10000; x+
7a50: 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +)..            
7a60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
7a70: 20 69 66 20 28 6e 65 77 63 6e 6e 20 3d 3d 20 6e   if (newcnn == n
7a80: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
7a90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7aa0: 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 20 3d 20         newcnn = 
7ab0: 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e  ((ICloneable)_cn
7ac0: 6e 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62  n).Clone() as Db
7ad0: 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0d 0a 20 20 20  Connection;..   
7ae0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7b00: 20 28 6e 65 77 63 6e 6e 2e 53 74 61 74 65 20 21   (newcnn.State !
7b10: 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74  = ConnectionStat
7b20: 65 2e 4f 70 65 6e 29 0d 0a 20 20 20 20 20 20 20  e.Open)..       
7b30: 20 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e           newcnn.
7b40: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
7b50: 20 20 20 20 20 20 20 20 20 44 62 43 6f 6d 6d 61           DbComma
7b60: 6e 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e  nd cmd = newcnn.
7b70: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 3b  CreateCommand();
7b80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7b90: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
7ba0: 3d 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  = "SELECT * FROM
7bb0: 20 54 65 73 74 43 61 73 65 22 3b 0d 0a 20 20 20   TestCase";..   
7bc0: 20 20 20 20 20 20 20 20 20 20 20 44 62 44 61 74             DbDat
7bd0: 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d  aReader reader =
7be0: 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64   cmd.ExecuteRead
7bf0: 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  er();..         
7c00: 20 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64       reader.Read
7c10: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
7c20: 20 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20 3d 20     object obj = 
7c30: 72 65 61 64 65 72 5b 30 5d 3b 0d 0a 0d 0a 20 20  reader[0];....  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
7c50: 78 20 25 20 35 30 30 20 3d 3d 20 30 29 0d 0a 20  x % 500 == 0).. 
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c80: 6e 65 77 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d  newcnn.Close();.
7c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ca0: 20 6e 65 77 63 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d   newcnn = null;.
7cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
7cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
7cd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
7ce0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d          finally.
7cf0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
7d00: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 65            if (ne
7d10: 77 63 6e 6e 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  wcnn != null).. 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
7d30: 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a 0d 0a  cnn.Close();....
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 63              newc
7d50: 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  nn = null;..    
7d60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
7d70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 43 68 65 63   }..        Chec
7d80: 6b 4c 6f 63 6b 65 64 28 29 3b 0d 0a 20 20 20 20  kLocked();..    
7d90: 20 20 7d 0d 0a 20 20 20 20 20 20 63 61 74 63 68    }..      catch
7da0: 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a   (Exception e)..
7db0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
7dc0: 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
7dd0: 69 63 73 2e 44 65 62 75 67 2e 57 72 69 74 65 4c  ics.Debug.WriteL
7de0: 69 6e 65 28 65 2e 4d 65 73 73 61 67 65 29 3b 0d  ine(e.Message);.
7df0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
7e00: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71  ...    [Test(Seq
7e10: 75 65 6e 63 65 20 3d 20 69 6e 74 2e 4d 61 78 56  uence = int.MaxV
7e20: 61 6c 75 65 29 5d 0d 0a 20 20 20 20 69 6e 74 65  alue)]..    inte
7e30: 72 6e 61 6c 20 76 6f 69 64 20 44 72 6f 70 54 61  rnal void DropTa
7e40: 62 6c 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ble()..    {..  
7e50: 20 20 20 20 44 72 6f 70 54 61 62 6c 65 73 28 74      DropTables(t
7e60: 72 75 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  rue);..    }....
7e70: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
7e80: 64 20 44 72 6f 70 54 61 62 6c 65 73 28 62 6f 6f  d DropTables(boo
7e90: 6c 20 74 68 72 6f 77 45 72 72 6f 72 29 0d 0a 20  l throwError).. 
7ea0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 73 74     {..      //st
7eb0: 72 69 6e 67 5b 5d 20 61 72 72 20 3d 20 6e 65 77  ring[] arr = new
7ec0: 20 73 74 72 69 6e 67 5b 5d 20 7b 20 22 54 65 73   string[] { "Tes
7ed0: 74 43 61 73 65 22 2c 20 22 64 61 74 61 74 79 70  tCase", "datatyp
7ee0: 65 74 65 73 74 22 2c 20 22 4d 75 6c 74 69 54 68  etest", "MultiTh
7ef0: 72 65 61 64 65 64 54 65 73 74 22 2c 20 22 66 75  readedTest", "fu
7f00: 6c 6c 74 65 78 74 22 2c 20 22 67 75 69 64 74 65  lltext", "guidte
7f10: 73 74 22 2c 20 22 6b 65 79 69 6e 66 6f 74 65 73  st", "keyinfotes
7f20: 74 22 2c 20 22 73 74 65 70 72 65 61 64 65 72 22  t", "stepreader"
7f30: 2c 20 22 6e 6f 6e 65 78 69 73 74 65 6e 74 22 20  , "nonexistent" 
7f40: 7d 3b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67  };..      string
7f50: 20 65 72 72 6f 72 73 20 3d 20 53 74 72 69 6e 67   errors = String
7f60: 2e 45 6d 70 74 79 3b 0d 0a 0d 0a 20 20 20 20 20  .Empty;....     
7f70: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
7f80: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
7f90: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
7fa0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7fb0: 66 6f 72 65 61 63 68 28 73 74 72 69 6e 67 20 74  foreach(string t
7fc0: 61 62 6c 65 20 69 6e 20 64 72 6f 70 74 61 62 6c  able in droptabl
7fd0: 65 73 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  es)..        {..
7fe0: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
7ff0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
8000: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
8010: 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67  andText = String
8020: 2e 46 6f 72 6d 61 74 28 22 44 52 4f 50 20 54 41  .Format("DROP TA
8030: 42 4c 45 7b 31 7d 20 5b 7b 30 7d 5d 22 2c 20 74  BLE{1} [{0}]", t
8040: 61 62 6c 65 2c 20 28 74 68 72 6f 77 45 72 72 6f  able, (throwErro
8050: 72 20 3d 3d 20 66 61 6c 73 65 29 20 3f 20 22 20  r == false) ? " 
8060: 49 46 20 45 58 49 53 54 53 22 20 3a 20 22 22 29  IF EXISTS" : "")
8070: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ;..            c
8080: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
8090: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
80a0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   }..          ca
80b0: 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65  tch (Exception e
80c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
80e0: 74 68 72 6f 77 45 72 72 6f 72 20 3d 3d 20 74 72  throwError == tr
80f0: 75 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue)..           
8100: 20 20 20 65 72 72 6f 72 73 20 2b 3d 20 53 74 72     errors += Str
8110: 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b 30 7d 5c  ing.Format("{0}\
8120: 72 5c 6e 22 2c 20 65 2e 4d 65 73 73 61 67 65 29  r\n", e.Message)
8130: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
8140: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
8150: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 73 74       foreach (st
8160: 72 69 6e 67 20 74 61 62 6c 65 20 69 6e 20 6d 61  ring table in ma
8170: 79 64 72 6f 70 74 61 62 6c 65 29 0d 0a 20 20 20  ydroptable)..   
8180: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
8190: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
81a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
81b0: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
81c0: 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
81d0: 22 44 52 4f 50 20 54 41 42 4c 45 7b 31 7d 20 5b  "DROP TABLE{1} [
81e0: 7b 30 7d 5d 22 2c 20 74 61 62 6c 65 2c 20 28 74  {0}]", table, (t
81f0: 68 72 6f 77 45 72 72 6f 72 20 3d 3d 20 66 61 6c  hrowError == fal
8200: 73 65 29 20 3f 20 22 20 49 46 20 45 58 49 53 54  se) ? " IF EXIST
8210: 53 22 20 3a 20 22 22 29 3b 0d 0a 20 20 20 20 20  S" : "");..     
8220: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
8230: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20  teNonQuery();.. 
8240: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8250: 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63        catch (Exc
8260: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
8270: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8280: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
8290: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
82a0: 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c  f (String.IsNull
82b0: 4f 72 45 6d 70 74 79 28 65 72 72 6f 72 73 29 20  OrEmpty(errors) 
82c0: 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20 20 20  == false)..     
82d0: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63     throw new Exc
82e0: 65 70 74 69 6f 6e 28 65 72 72 6f 72 73 29 3b 0d  eption(errors);.
82f0: 0a 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ...    }....    
8300: 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d  [Test(Sequence =
8310: 20 31 30 30 30 29 5d 0d 0a 20 20 20 20 69 6e 74   1000)]..    int
8320: 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 46 61 73  ernal string Fas
8330: 74 49 6e 73 65 72 74 4d 61 6e 79 28 29 0d 0a 20  tInsertMany().. 
8340: 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 74 72 69     {..      Stri
8350: 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65  ngBuilder builde
8360: 72 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75  r = new StringBu
8370: 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20  ilder();..      
8380: 75 73 69 6e 67 20 28 44 62 54 72 61 6e 73 61 63  using (DbTransac
8390: 74 69 6f 6e 20 64 62 54 72 61 6e 73 20 3d 20 5f  tion dbTrans = _
83a0: 63 6e 6e 2e 42 65 67 69 6e 54 72 61 6e 73 61 63  cnn.BeginTransac
83b0: 74 69 6f 6e 28 29 29 0d 0a 20 20 20 20 20 20 7b  tion())..      {
83c0: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 74  ..        int dt
83d0: 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20  Start;..        
83e0: 69 6e 74 20 64 74 45 6e 64 3b 0d 0a 0d 0a 20 20  int dtEnd;....  
83f0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
8400: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
8410: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
8420: 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ))..        {.. 
8430: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 54 72 61           cmd.Tra
8440: 6e 73 61 63 74 69 6f 6e 20 3d 20 64 62 54 72 61  nsaction = dbTra
8450: 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ns;..          c
8460: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
8470: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 54 65   "INSERT INTO Te
8480: 73 74 43 61 73 65 28 46 69 65 6c 64 31 29 20 56  stCase(Field1) V
8490: 41 4c 55 45 53 28 40 70 31 29 22 3b 0d 0a 20 20  ALUES(@p1)";..  
84a0: 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65          DbParame
84b0: 74 65 72 20 46 69 65 6c 64 31 20 3d 20 63 6d 64  ter Field1 = cmd
84c0: 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72  .CreateParameter
84d0: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
84e0: 20 46 69 65 6c 64 31 2e 50 61 72 61 6d 65 74 65   Field1.Paramete
84f0: 72 4e 61 6d 65 20 3d 20 22 40 70 31 22 3b 0d 0a  rName = "@p1";..
8500: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61            cmd.Pa
8510: 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65  rameters.Add(Fie
8520: 6c 64 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ld1);....       
8530: 20 20 20 2f 2f 43 6f 6e 73 6f 6c 65 2e 57 72 69     //Console.Wri
8540: 74 65 4c 69 6e 65 28 53 74 72 69 6e 67 2e 46 6f  teLine(String.Fo
8550: 72 6d 61 74 28 22 20 20 20 20 20 20 20 20 20 20  rmat("          
8560: 46 61 73 74 20 69 6e 73 65 72 74 20 75 73 69 6e  Fast insert usin
8570: 67 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64  g parameters and
8580: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8590: 65 6e 74 5c 72 5c 6e 20 20 20 20 20 20 20 20 20  ent\r\n         
85a0: 20 2d 3e 20 28 31 30 30 2c 30 30 30 20 72 6f 77   -> (100,000 row
85b0: 73 29 20 42 65 67 69 6e 73 20 2e 2e 2e 20 22 29  s) Begins ... ")
85c0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64 74  );..          dt
85d0: 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d  Start = Environm
85e0: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a  ent.TickCount;..
85f0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69            for (i
8600: 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30  nt n = 0; n < 10
8610: 30 30 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  0000; n++)..    
8620: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8630: 20 20 20 20 20 46 69 65 6c 64 31 2e 56 61 6c 75       Field1.Valu
8640: 65 20 3d 20 6e 20 2b 20 32 30 30 30 30 30 3b 0d  e = n + 200000;.
8650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
8660: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
8670: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ();..          }
8680: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 64 74  ....          dt
8690: 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  End = Environmen
86a0: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
86b0: 20 20 20 20 20 20 20 20 64 74 45 6e 64 20 2d 3d          dtEnd -=
86c0: 20 64 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20   dtStart;..     
86d0: 20 20 20 20 20 62 75 69 6c 64 65 72 2e 41 70 70       builder.App
86e0: 65 6e 64 46 6f 72 6d 61 74 28 22 45 6e 64 73 20  endFormat("Ends 
86f0: 69 6e 20 7b 30 7d 20 6d 73 20 2e 2e 2e 20 22 2c  in {0} ms ... ",
8700: 20 28 64 74 45 6e 64 29 29 3b 0d 0a 20 20 20 20   (dtEnd));..    
8710: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8720: 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72   dtStart = Envir
8730: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
8740: 3b 0d 0a 20 20 20 20 20 20 20 20 64 62 54 72 61  ;..        dbTra
8750: 6e 73 2e 43 6f 6d 6d 69 74 28 29 3b 0d 0a 20 20  ns.Commit();..  
8760: 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45 6e        dtEnd = En
8770: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
8780: 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 64 74  unt;..        dt
8790: 45 6e 64 20 2d 3d 20 64 74 53 74 61 72 74 3b 0d  End -= dtStart;.
87a0: 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 65 72  .        builder
87b0: 2e 41 70 70 65 6e 64 46 6f 72 6d 61 74 28 22 43  .AppendFormat("C
87c0: 6f 6d 6d 69 74 73 20 69 6e 20 7b 30 7d 20 6d 73  ommits in {0} ms
87d0: 22 2c 20 28 64 74 45 6e 64 29 29 3b 0d 0a 20 20  ", (dtEnd));..  
87e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74      }..      ret
87f0: 75 72 6e 20 62 75 69 6c 64 65 72 2e 54 6f 53 74  urn builder.ToSt
8800: 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ring();..    }..
8810: 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20  ..    [Test]..  
8820: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
8830: 46 75 6c 6c 54 65 78 74 54 65 73 74 28 29 0d 0a  FullTextTest()..
8840: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65      {..      Che
8850: 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 0d 0a 20  ckSQLite();.... 
8860: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
8870: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
8880: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
8890: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
88a0: 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e 41      droptables.A
88b0: 64 64 28 22 46 75 6c 6c 54 65 78 74 22 29 3b 0d  dd("FullText");.
88c0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
88d0: 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41  mandText = "CREA
88e0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
88f0: 20 46 75 6c 6c 54 65 78 74 20 55 53 49 4e 47 20   FullText USING 
8900: 46 54 53 33 28 6e 61 6d 65 2c 20 69 6e 67 72 65  FTS3(name, ingre
8910: 64 69 65 6e 74 73 29 3b 22 3b 0d 0a 20 20 20 20  dients);";..    
8920: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
8930: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20  onQuery();....  
8940: 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d 20 6e        string[] n
8950: 61 6d 65 73 20 3d 20 7b 20 22 62 72 6f 63 63 6f  ames = { "brocco
8960: 6c 69 20 73 74 65 77 22 2c 20 22 70 75 6d 70 6b  li stew", "pumpk
8970: 69 6e 20 73 74 65 77 22 2c 20 22 62 72 6f 63 63  in stew", "brocc
8980: 6f 6c 69 20 70 69 65 22 2c 20 22 70 75 6d 70 6b  oli pie", "pumpk
8990: 69 6e 20 70 69 65 22 20 7d 3b 0d 0a 20 20 20 20  in pie" };..    
89a0: 20 20 20 20 73 74 72 69 6e 67 5b 5d 20 69 6e 67      string[] ing
89b0: 72 65 64 69 65 6e 74 73 20 3d 20 7b 20 22 62 72  redients = { "br
89c0: 6f 63 63 6f 6c 69 20 70 65 70 70 65 72 73 20 63  occoli peppers c
89d0: 68 65 65 73 65 20 74 6f 6d 61 74 6f 65 73 22 2c  heese tomatoes",
89e0: 20 22 70 75 6d 70 6b 69 6e 20 6f 6e 69 6f 6e 73   "pumpkin onions
89f0: 20 67 61 72 6c 69 63 20 63 65 6c 65 72 79 22 2c   garlic celery",
8a00: 20 22 62 72 6f 63 63 6f 6c 69 20 63 68 65 65 73   "broccoli chees
8a10: 65 20 6f 6e 69 6f 6e 73 20 66 6c 6f 75 72 22 2c  e onions flour",
8a20: 20 22 70 75 6d 70 6b 69 6e 20 73 75 67 61 72 20   "pumpkin sugar 
8a30: 66 6c 6f 75 72 20 62 75 74 74 65 72 22 20 7d 3b  flour butter" };
8a40: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  ..        int n;
8a50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
8a60: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 69  CommandText = "i
8a70: 6e 73 65 72 74 20 69 6e 74 6f 20 46 75 6c 6c 54  nsert into FullT
8a80: 65 78 74 20 28 6e 61 6d 65 2c 20 69 6e 67 72 65  ext (name, ingre
8a90: 64 69 65 6e 74 73 29 20 76 61 6c 75 65 73 20 28  dients) values (
8aa0: 40 6e 61 6d 65 2c 20 40 69 6e 67 72 65 64 69 65  @name, @ingredie
8ab0: 6e 74 29 3b 22 3b 0d 0a 20 20 20 20 20 20 20 20  nt);";..        
8ac0: 44 62 50 61 72 61 6d 65 74 65 72 20 6e 61 6d 65  DbParameter name
8ad0: 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72   = cmd.CreatePar
8ae0: 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20  ameter();..     
8af0: 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 69     DbParameter i
8b00: 6e 67 72 65 64 69 65 6e 74 20 3d 20 63 6d 64 2e  ngredient = cmd.
8b10: 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28  CreateParameter(
8b20: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6e 61  );....        na
8b30: 6d 65 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65  me.ParameterName
8b40: 20 3d 20 22 40 6e 61 6d 65 22 3b 0d 0a 20 20 20   = "@name";..   
8b50: 20 20 20 20 20 69 6e 67 72 65 64 69 65 6e 74 2e       ingredient.
8b60: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
8b70: 22 40 69 6e 67 72 65 64 69 65 6e 74 22 3b 0d 0a  "@ingredient";..
8b80: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61  ..        cmd.Pa
8b90: 72 61 6d 65 74 65 72 73 2e 41 64 64 28 6e 61 6d  rameters.Add(nam
8ba0: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  e);..        cmd
8bb0: 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28  .Parameters.Add(
8bc0: 69 6e 67 72 65 64 69 65 6e 74 29 3b 0d 0a 0d 0a  ingredient);....
8bd0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6e 20 3d          for (n =
8be0: 20 30 3b 20 6e 20 3c 20 6e 61 6d 65 73 2e 4c 65   0; n < names.Le
8bf0: 6e 67 74 68 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  ngth; n++)..    
8c00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8c10: 20 6e 61 6d 65 2e 56 61 6c 75 65 20 3d 20 6e 61   name.Value = na
8c20: 6d 65 73 5b 6e 5d 3b 0d 0a 20 20 20 20 20 20 20  mes[n];..       
8c30: 20 20 20 69 6e 67 72 65 64 69 65 6e 74 2e 56 61     ingredient.Va
8c40: 6c 75 65 20 3d 20 69 6e 67 72 65 64 69 65 6e 74  lue = ingredient
8c50: 73 5b 6e 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  s[n];....       
8c60: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
8c70: 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
8c80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
8c90: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
8ca0: 3d 20 22 73 65 6c 65 63 74 20 72 6f 77 69 64 2c  = "select rowid,
8cb0: 20 6e 61 6d 65 2c 20 69 6e 67 72 65 64 69 65 6e   name, ingredien
8cc0: 74 73 20 66 72 6f 6d 20 46 75 6c 6c 54 65 78 74  ts from FullText
8cd0: 20 77 68 65 72 65 20 6e 61 6d 65 20 6d 61 74 63   where name matc
8ce0: 68 20 27 70 69 65 27 3b 22 3b 0d 0a 20 20 20 20  h 'pie';";..    
8cf0: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
8d00: 72 73 2e 43 6c 65 61 72 28 29 3b 0d 0a 0d 0a 20  rs.Clear();.... 
8d10: 20 20 20 20 20 20 20 69 6e 74 5b 5d 20 72 6f 77         int[] row
8d20: 69 64 73 20 3d 20 7b 20 33 2c 20 34 20 7d 3b 0d  ids = { 3, 4 };.
8d30: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0d  .        n = 0;.
8d40: 0a 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ...        using
8d50: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
8d60: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
8d70: 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20  uteReader())..  
8d80: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8d90: 20 20 20 77 68 69 6c 65 20 28 72 65 61 64 65 72     while (reader
8da0: 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20 20  .Read())..      
8db0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8dc0: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65     if (reader.Ge
8dd0: 74 49 6e 74 36 34 28 30 29 20 21 3d 20 72 6f 77  tInt64(0) != row
8de0: 69 64 73 5b 6e 2b 2b 5d 29 0d 0a 20 20 20 20 20  ids[n++])..     
8df0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
8e00: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 55 6e  ew Exception("Un
8e10: 65 78 70 65 63 74 65 64 20 72 6f 77 69 64 20 72  expected rowid r
8e20: 65 74 75 72 6e 65 64 22 29 3b 0d 0a 0d 0a 20 20  eturned");....  
8e30: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 20            if (n 
8e40: 3e 20 72 6f 77 69 64 73 2e 4c 65 6e 67 74 68 29  > rowids.Length)
8e50: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
8e60: 74 69 6f 6e 28 22 54 6f 6f 20 6d 61 6e 79 20 72  tion("Too many r
8e70: 6f 77 73 20 72 65 74 75 72 6e 65 64 22 29 3b 0d  ows returned");.
8e80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8e90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
8ea0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b  ..    }....    [
8eb0: 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72  Test]..    inter
8ec0: 6e 61 6c 20 76 6f 69 64 20 47 75 69 64 54 65 73  nal void GuidTes
8ed0: 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  t()..    {..    
8ee0: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
8ef0: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
8f00: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
8f10: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8f20: 20 47 75 69 64 20 67 75 69 64 20 3d 20 47 75 69   Guid guid = Gui
8f30: 64 2e 4e 65 77 47 75 69 64 28 29 3b 0d 0a 0d 0a  d.NewGuid();....
8f40: 20 20 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c          droptabl
8f50: 65 73 2e 41 64 64 28 22 47 75 69 64 54 65 73 74  es.Add("GuidTest
8f60: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63  ");....        c
8f70: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
8f80: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 47   "CREATE TABLE G
8f90: 75 69 64 54 65 73 74 28 4d 79 47 75 69 64 20 75  uidTest(MyGuid u
8fa0: 6e 69 71 75 65 69 64 65 6e 74 69 66 69 65 72 29  niqueidentifier)
8fb0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ";..        cmd.
8fc0: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
8fd0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  );....        //
8fe0: 20 49 6e 73 65 72 74 20 61 20 67 75 69 64 20 61   Insert a guid a
8ff0: 73 20 61 20 64 65 66 61 75 6c 74 20 62 69 6e 61  s a default bina
9000: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
9010: 6e 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  n..        cmd.C
9020: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49 4e  ommandText = "IN
9030: 53 45 52 54 20 49 4e 54 4f 20 47 75 69 64 54 65  SERT INTO GuidTe
9040: 73 74 28 4d 79 47 75 69 64 29 20 56 41 4c 55 45  st(MyGuid) VALUE
9050: 53 28 40 62 29 22 3b 0d 0a 20 20 20 20 20 20 20  S(@b)";..       
9060: 20 44 62 50 61 72 61 6d 65 74 65 72 20 70 61 72   DbParameter par
9070: 6d 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61  m = cmd.CreatePa
9080: 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20  rameter();..    
9090: 20 20 20 20 70 61 72 6d 2e 50 61 72 61 6d 65 74      parm.Paramet
90a0: 65 72 4e 61 6d 65 20 3d 20 22 40 62 22 3b 0d 0a  erName = "@b";..
90b0: 20 20 20 20 20 20 20 20 70 61 72 6d 2e 56 61 6c          parm.Val
90c0: 75 65 20 3d 20 67 75 69 64 3b 0d 0a 20 20 20 20  ue = guid;..    
90d0: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
90e0: 72 73 2e 41 64 64 28 70 61 72 6d 29 3b 0d 0a 20  rs.Add(parm);.. 
90f0: 20 20 20 20 20 20 20 2f 2f 28 28 53 51 4c 69 74         //((SQLit
9100: 65 50 61 72 61 6d 65 74 65 72 43 6f 6c 6c 65 63  eParameterCollec
9110: 74 69 6f 6e 29 63 6d 64 2e 50 61 72 61 6d 65 74  tion)cmd.Paramet
9120: 65 72 73 29 2e 41 64 64 57 69 74 68 56 61 6c 75  ers).AddWithValu
9130: 65 28 22 40 62 22 2c 20 67 75 69 64 29 3b 0d 0a  e("@b", guid);..
9140: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 6e 73  ..        // Ins
9150: 65 72 74 20 61 20 67 75 69 64 20 61 73 20 74 65  ert a guid as te
9160: 78 74 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  xt..        cmd.
9170: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
9180: 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  );..        cmd.
9190: 50 61 72 61 6d 65 74 65 72 73 5b 30 5d 2e 56 61  Parameters[0].Va
91a0: 6c 75 65 20 3d 20 67 75 69 64 2e 54 6f 53 74 72  lue = guid.ToStr
91b0: 69 6e 67 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ing();..        
91c0: 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 5b 30  cmd.Parameters[0
91d0: 5d 2e 44 62 54 79 70 65 20 3d 20 44 62 54 79 70  ].DbType = DbTyp
91e0: 65 2e 53 74 72 69 6e 67 3b 0d 0a 20 20 20 20 20  e.String;..     
91f0: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
9200: 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20  nQuery();....   
9210: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
9220: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 4d  Text = "SELECT M
9230: 79 47 75 69 64 20 46 52 4f 4d 20 47 75 69 64 54  yGuid FROM GuidT
9240: 65 73 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 63  est";..        c
9250: 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 43 6c  md.Parameters.Cl
9260: 65 61 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ear();....      
9270: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
9280: 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20 63  eader reader = c
9290: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
92a0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
92b0: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65 72            reader
92c0: 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20 20  .Read();..      
92d0: 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47      if (reader.G
92e0: 65 74 46 69 65 6c 64 54 79 70 65 28 30 29 20 21  etFieldType(0) !
92f0: 3d 20 74 79 70 65 6f 66 28 47 75 69 64 29 29 20  = typeof(Guid)) 
9300: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
9310: 69 6f 6e 28 22 43 6f 6c 75 6d 6e 20 69 73 20 6e  ion("Column is n
9320: 6f 74 20 61 20 47 75 69 64 22 29 3b 0d 0a 20 20  ot a Guid");..  
9330: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
9340: 65 72 2e 47 65 74 47 75 69 64 28 30 29 20 21 3d  er.GetGuid(0) !=
9350: 20 67 75 69 64 29 20 74 68 72 6f 77 20 6e 65 77   guid) throw new
9360: 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
9370: 67 2e 46 6f 72 6d 61 74 28 22 47 6f 74 20 67 75  g.Format("Got gu
9380: 69 64 20 7b 30 7d 2c 20 65 78 70 65 63 74 65 64  id {0}, expected
9390: 20 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e 47 65   {1}", reader.Ge
93a0: 74 47 75 69 64 28 30 29 2c 20 67 75 69 64 29 29  tGuid(0), guid))
93b0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ;....          r
93c0: 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20  eader.Read();.. 
93d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
93e0: 64 65 72 2e 47 65 74 46 69 65 6c 64 54 79 70 65  der.GetFieldType
93f0: 28 30 29 20 21 3d 20 74 79 70 65 6f 66 28 47 75  (0) != typeof(Gu
9400: 69 64 29 29 20 74 68 72 6f 77 20 6e 65 77 20 45  id)) throw new E
9410: 78 63 65 70 74 69 6f 6e 28 22 43 6f 6c 75 6d 6e  xception("Column
9420: 20 69 73 20 6e 6f 74 20 61 20 47 75 69 64 22 29   is not a Guid")
9430: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ;..          if 
9440: 28 72 65 61 64 65 72 2e 47 65 74 47 75 69 64 28  (reader.GetGuid(
9450: 30 29 20 21 3d 20 67 75 69 64 29 20 74 68 72 6f  0) != guid) thro
9460: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
9470: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 47  String.Format("G
9480: 6f 74 20 67 75 69 64 20 7b 30 7d 2c 20 65 78 70  ot guid {0}, exp
9490: 65 63 74 65 64 20 7b 31 7d 22 2c 20 72 65 61 64  ected {1}", read
94a0: 65 72 2e 47 65 74 47 75 69 64 28 30 29 2c 20 67  er.GetGuid(0), g
94b0: 75 69 64 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  uid));..        
94c0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
94d0: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53  }....    [Test(S
94e0: 65 71 75 65 6e 63 65 20 3d 20 32 30 29 5d 0d 0a  equence = 20)]..
94f0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
9500: 64 20 49 6e 73 65 72 74 54 61 62 6c 65 28 29 0d  d InsertTable().
9510: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73  .    {..      us
9520: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
9530: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
9540: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
9550: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64    {..        cmd
9560: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
9570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 54 65 73 74  INSERT INTO Test
9580: 43 61 73 65 28 46 69 65 6c 64 31 2c 20 46 69 65  Case(Field1, Fie
9590: 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d 2c 20  ld2, [Fi..ld3], 
95a0: 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65 6c 64  [Fi..ld4], Field
95b0: 35 29 20 56 41 4c 55 45 53 28 31 2c 20 33 2e 31  5) VALUES(1, 3.1
95c0: 34 31 35 39 2c 20 27 46 69 c3 ab 6c 64 33 27 2c  4159, 'Fi..ld3',
95d0: 20 27 46 69 c3 a6 6c 64 34 27 2c 20 27 32 30 30   'Fi..ld4', '200
95e0: 35 2d 30 31 2d 30 31 20 31 33 3a 34 39 3a 30 30  5-01-01 13:49:00
95f0: 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  ')";..        cm
9600: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
9610: 79 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  y();..      }.. 
9620: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
9630: 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
9640: 20 73 74 72 69 6e 67 20 49 74 65 72 61 74 69 6f   string Iteratio
9650: 6e 54 65 73 74 31 28 29 0d 0a 20 20 20 20 7b 0d  nTest1()..    {.
9660: 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69  .      CheckSQLi
9670: 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69  te();..      usi
9680: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
9690: 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
96a0: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
96b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20   {..        int 
96c0: 64 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20  dtStart;..      
96d0: 20 20 69 6e 74 20 64 74 45 6e 64 3b 0d 0a 20 20    int dtEnd;..  
96e0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 75 6e 74        int nCount
96f0: 3b 0d 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20  ;..        long 
9700: 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d  n;....        cm
9710: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
9720: 22 53 45 4c 45 43 54 20 46 6f 6f 28 49 44 2c 20  "SELECT Foo(ID, 
9730: 49 44 29 20 46 52 4f 4d 20 54 65 73 74 43 61 73  ID) FROM TestCas
9740: 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  e";..        cmd
9750: 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a 20 20 20  .Prepare();..   
9760: 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45       dtStart = E
9770: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
9780: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 6e  ount;..        n
9790: 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20  Count = 0;..    
97a0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
97b0: 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64  aReader rd = cmd
97c0: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29  .ExecuteReader()
97d0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
97e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 72          while (r
97f0: 64 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20  d.Read())..     
9800: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9810: 20 20 20 20 6e 20 3d 20 72 64 2e 47 65 74 49 6e      n = rd.GetIn
9820: 74 36 34 28 30 29 3b 0d 0a 20 20 20 20 20 20 20  t64(0);..       
9830: 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b 0d 0a       nCount++;..
9840: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9850: 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45         dtEnd = E
9860: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
9870: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d  ount;..        }
9880: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9890: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
98a0: 55 73 65 72 20 46 75 6e 63 74 69 6f 6e 20 69 74  User Function it
98b0: 65 72 61 74 69 6f 6e 20 6f 66 20 7b 30 7d 20 72  eration of {0} r
98c0: 65 63 6f 72 64 73 20 69 6e 20 7b 31 7d 20 6d 73  ecords in {1} ms
98d0: 22 2c 20 6e 43 6f 75 6e 74 2c 20 28 64 74 45 6e  ", nCount, (dtEn
98e0: 64 20 2d 20 64 74 53 74 61 72 74 29 29 3b 0d 0a  d - dtStart));..
98f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9900: 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20  ..    [Test]..  
9910: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e    internal strin
9920: 67 20 49 74 65 72 61 74 69 6f 6e 54 65 73 74 32  g IterationTest2
9930: 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
9940: 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 62   StringBuilder b
9950: 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53 74 72  uilder = new Str
9960: 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20  ingBuilder();.. 
9970: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
9980: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
9990: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
99a0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
99b0: 20 20 20 20 69 6e 74 20 64 74 53 74 61 72 74 3b      int dtStart;
99c0: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 74  ..        int dt
99d0: 45 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e  End;..        in
99e0: 74 20 6e 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20  t nCount;..     
99f0: 20 20 20 6c 6f 6e 67 20 6e 3b 0d 0a 0d 0a 20 20     long n;....  
9a00: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
9a10: 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20  dText = "SELECT 
9a20: 49 44 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65  ID FROM TestCase
9a30: 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ";..        cmd.
9a40: 50 72 65 70 61 72 65 28 29 3b 0d 0a 20 20 20 20  Prepare();..    
9a50: 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e      dtStart = En
9a60: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
9a70: 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 6e 43  unt;..        nC
9a80: 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20  ount = 0;..     
9a90: 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61     using (DbData
9aa0: 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64 2e  Reader rd = cmd.
9ab0: 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29 29  ExecuteReader())
9ac0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
9ad0: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 72 64         while (rd
9ae0: 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20 20  .Read())..      
9af0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9b00: 20 20 20 6e 20 3d 20 72 64 2e 47 65 74 49 6e 74     n = rd.GetInt
9b10: 36 34 28 30 29 3b 0d 0a 20 20 20 20 20 20 20 20  64(0);..        
9b20: 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b 0d 0a 20      nCount++;.. 
9b30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9b40: 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45 6e        dtEnd = En
9b50: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
9b60: 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  unt;..        }.
9b70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9b80: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 52  String.Format("R
9b90: 61 77 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  aw iteration of 
9ba0: 7b 30 7d 20 72 65 63 6f 72 64 73 20 69 6e 20 7b  {0} records in {
9bb0: 31 7d 20 6d 73 22 2c 20 6e 43 6f 75 6e 74 2c 20  1} ms", nCount, 
9bc0: 28 64 74 45 6e 64 20 2d 20 64 74 53 74 61 72 74  (dtEnd - dtStart
9bd0: 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ));..      }..  
9be0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
9bf0: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
9c00: 73 74 72 69 6e 67 20 49 74 65 72 61 74 69 6f 6e  string Iteration
9c10: 54 65 73 74 33 28 29 0d 0a 20 20 20 20 7b 0d 0a  Test3()..    {..
9c20: 20 20 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c        StringBuil
9c30: 64 65 72 20 62 75 69 6c 64 65 72 20 3d 20 6e 65  der builder = ne
9c40: 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28  w StringBuilder(
9c50: 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  );..      using 
9c60: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
9c70: 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d   _cnn.CreateComm
9c80: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d  and())..      {.
9c90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 53  .        int dtS
9ca0: 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20 69  tart;..        i
9cb0: 6e 74 20 64 74 45 6e 64 3b 0d 0a 20 20 20 20 20  nt dtEnd;..     
9cc0: 20 20 20 69 6e 74 20 6e 43 6f 75 6e 74 3b 0d 0a     int nCount;..
9cd0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6e 3b 0d          long n;.
9ce0: 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ...        cmd.C
9cf0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
9d00: 4c 45 43 54 20 41 42 53 28 49 44 29 20 46 52 4f  LECT ABS(ID) FRO
9d10: 4d 20 54 65 73 74 43 61 73 65 22 3b 0d 0a 20 20  M TestCase";..  
9d20: 20 20 20 20 20 20 63 6d 64 2e 50 72 65 70 61 72        cmd.Prepar
9d30: 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 64 74  e();..        dt
9d40: 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d  Start = Environm
9d50: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a  ent.TickCount;..
9d60: 20 20 20 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d          nCount =
9d70: 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69   0;..        usi
9d80: 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72  ng (DbDataReader
9d90: 20 72 64 20 3d 20 63 6d 64 2e 45 78 65 63 75 74   rd = cmd.Execut
9da0: 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20  eReader())..    
9db0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9dc0: 20 77 68 69 6c 65 20 28 72 64 2e 52 65 61 64 28   while (rd.Read(
9dd0: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
9df0: 20 72 64 2e 47 65 74 49 6e 74 36 34 28 30 29 3b   rd.GetInt64(0);
9e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ..            nC
9e10: 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 20 20 20 20 20  ount++;..       
9e20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
9e30: 64 74 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d  dtEnd = Environm
9e40: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a  ent.TickCount;..
9e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
9e60: 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
9e70: 2e 46 6f 72 6d 61 74 28 22 49 6e 74 72 69 6e 73  .Format("Intrins
9e80: 69 63 20 46 75 6e 63 74 69 6f 6e 20 69 74 65 72  ic Function iter
9e90: 61 74 69 6f 6e 20 6f 66 20 7b 30 7d 20 72 65 63  ation of {0} rec
9ea0: 6f 72 64 73 20 69 6e 20 7b 31 7d 20 6d 73 22 2c  ords in {1} ms",
9eb0: 20 6e 43 6f 75 6e 74 2c 20 28 64 74 45 6e 64 20   nCount, (dtEnd 
9ec0: 2d 20 64 74 53 74 61 72 74 29 29 3b 0d 0a 20 20  - dtStart));..  
9ed0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
9ee0: 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e      [Test(Sequen
9ef0: 63 65 3d 32 31 29 5d 0d 0a 20 20 20 20 69 6e 74  ce=21)]..    int
9f00: 65 72 6e 61 6c 20 76 6f 69 64 20 4b 65 79 49 6e  ernal void KeyIn
9f10: 66 6f 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  foTest()..    {.
9f20: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
9f30: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
9f40: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
9f50: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
9f60: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
9f70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
9f80: 2f 2f 20 46 69 72 73 74 20 74 65 73 74 20 61 67  // First test ag
9f90: 61 69 6e 73 74 20 69 6e 74 65 67 65 72 20 70 72  ainst integer pr
9fa0: 69 6d 61 72 79 20 6b 65 79 20 28 6f 70 74 69 6d  imary key (optim
9fb0: 69 7a 65 64 29 20 6b 65 79 69 6e 66 6f 20 66 65  ized) keyinfo fe
9fc0: 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 64  tch..          d
9fd0: 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28 22 6b  roptables.Add("k
9fe0: 65 79 69 6e 66 6f 74 65 73 74 22 29 3b 0d 0a 20  eyinfotest");.. 
9ff0: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d           cmd.Com
a000: 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 72 65 61  mandText = "Crea
a010: 74 65 20 74 61 62 6c 65 20 6b 65 79 69 6e 66 6f  te table keyinfo
a020: 74 65 73 74 20 28 69 64 20 69 6e 74 65 67 65 72  test (id integer
a030: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 6d 79   primary key, my
a040: 75 6e 69 71 75 65 76 61 6c 75 65 20 69 6e 74 65  uniquevalue inte
a050: 67 65 72 20 75 6e 69 71 75 65 20 6e 6f 74 20 6e  ger unique not n
a060: 75 6c 6c 2c 20 6d 79 76 61 6c 75 65 20 76 61 72  ull, myvalue var
a070: 63 68 61 72 28 35 30 29 29 22 3b 0d 0a 20 20 20  char(50))";..   
a080: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
a090: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d  teNonQuery();...
a0a0: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43  .          cmd.C
a0b0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 65  ommandText = "Se
a0c0: 6c 65 63 74 20 2a 20 66 72 6f 6d 20 6b 65 79 69  lect * from keyi
a0d0: 6e 66 6f 74 65 73 74 22 3b 0d 0a 20 20 20 20 20  nfotest";..     
a0e0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
a0f0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
a100: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
a110: 64 65 72 28 43 6f 6d 6d 61 6e 64 42 65 68 61 76  der(CommandBehav
a120: 69 6f 72 2e 4b 65 79 49 6e 66 6f 20 7c 20 43 6f  ior.KeyInfo | Co
a130: 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63  mmandBehavior.Sc
a140: 68 65 6d 61 4f 6e 6c 79 29 29 0d 0a 20 20 20 20  hemaOnly))..    
a150: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
a160: 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74 61       using (Data
a170: 54 61 62 6c 65 20 74 62 6c 20 3d 20 72 65 61 64  Table tbl = read
a180: 65 72 2e 47 65 74 53 63 68 65 6d 61 54 61 62 6c  er.GetSchemaTabl
a190: 65 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  e())..          
a1a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
a1b0: 20 20 20 69 66 20 28 74 62 6c 2e 52 6f 77 73 2e     if (tbl.Rows.
a1c0: 43 6f 75 6e 74 20 21 3d 20 33 29 20 74 68 72 6f  Count != 3) thro
a1d0: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
a1e0: 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "Wrong number of
a1f0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
a200: 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  d");..          
a210: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
a220: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d  ....          cm
a230: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
a240: 22 53 45 4c 45 43 54 20 4d 79 56 61 6c 75 65 20  "SELECT MyValue 
a250: 46 52 4f 4d 20 6b 65 79 69 6e 66 6f 74 65 73 74  FROM keyinfotest
a260: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73  ";..          us
a270: 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65  ing (DbDataReade
a280: 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45  r reader = cmd.E
a290: 78 65 63 75 74 65 52 65 61 64 65 72 28 43 6f 6d  xecuteReader(Com
a2a0: 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65 79  mandBehavior.Key
a2b0: 49 6e 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64 42 65  Info | CommandBe
a2c0: 68 61 76 69 6f 72 2e 53 63 68 65 6d 61 4f 6e 6c  havior.SchemaOnl
a2d0: 79 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  y))..          {
a2e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
a2f0: 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20 74  ing (DataTable t
a300: 62 6c 20 3d 20 72 65 61 64 65 72 2e 47 65 74 53  bl = reader.GetS
a310: 63 68 65 6d 61 54 61 62 6c 65 28 29 29 0d 0a 20  chemaTable()).. 
a320: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
a330: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a340: 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21  tbl.Rows.Count !
a350: 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77 20 45  = 2) throw new E
a360: 78 63 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20  xception("Wrong 
a370: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
a380: 73 20 72 65 74 75 72 6e 65 64 22 29 3b 0d 0a 20  s returned");.. 
a390: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
a3a0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a3b0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
a3c0: 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 7b  nally..        {
a3d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
a3e0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
a3f0: 6e 64 54 65 78 74 20 3d 20 22 44 52 4f 50 20 54  ndText = "DROP T
a400: 41 42 4c 45 20 6b 65 79 69 6e 66 6f 74 65 73 74  ABLE keyinfotest
a410: 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ";..        cmd.
a420: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
a430: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 72  );....        dr
a440: 6f 70 74 61 62 6c 65 73 2e 52 65 6d 6f 76 65 28  optables.Remove(
a450: 22 6b 65 79 69 6e 66 6f 74 65 73 74 22 29 3b 0d  "keyinfotest");.
a460: 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a  ...        try..
a470: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
a480: 20 20 20 20 20 2f 2f 20 4e 6f 77 20 74 65 73 74       // Now test
a490: 20 61 67 61 69 6e 73 74 20 6e 6f 6e 2d 69 6e 74   against non-int
a4a0: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
a4b0: 20 28 75 6e 6f 70 74 69 6d 69 7a 65 64 29 20 73   (unoptimized) s
a4c0: 75 62 71 75 65 72 79 20 6b 65 79 69 6e 66 6f 20  ubquery keyinfo 
a4d0: 66 65 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  fetch..         
a4e0: 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28   droptables.Add(
a4f0: 22 6b 65 79 69 6e 66 6f 74 65 73 74 22 29 3b 0d  "keyinfotest");.
a500: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43  .          cmd.C
a510: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 72  ommandText = "Cr
a520: 65 61 74 65 20 74 61 62 6c 65 20 6b 65 79 69 6e  eate table keyin
a530: 66 6f 74 65 73 74 20 28 69 64 20 63 68 61 72 20  fotest (id char 
a540: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 6d 79 75  primary key, myu
a550: 6e 69 71 75 65 76 61 6c 75 65 20 69 6e 74 65 67  niquevalue integ
a560: 65 72 20 75 6e 69 71 75 65 20 6e 6f 74 20 6e 75  er unique not nu
a570: 6c 6c 2c 20 6d 79 76 61 6c 75 65 20 76 61 72 63  ll, myvalue varc
a580: 68 61 72 28 35 30 29 29 22 3b 0d 0a 20 20 20 20  har(50))";..    
a590: 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74        cmd.Execut
a5a0: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a  eNonQuery();....
a5b0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
a5c0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
a5d0: 45 43 54 20 4d 79 56 61 6c 75 65 20 46 52 4f 4d  ECT MyValue FROM
a5e0: 20 6b 65 79 69 6e 66 6f 74 65 73 74 22 3b 0d 0a   keyinfotest";..
a5f0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
a600: 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 65  (DbDataReader re
a610: 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75  ader = cmd.Execu
a620: 74 65 52 65 61 64 65 72 28 43 6f 6d 6d 61 6e 64  teReader(Command
a630: 42 65 68 61 76 69 6f 72 2e 4b 65 79 49 6e 66 6f  Behavior.KeyInfo
a640: 20 7c 20 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69   | CommandBehavi
a650: 6f 72 2e 53 63 68 65 6d 61 4f 6e 6c 79 29 29 0d  or.SchemaOnly)).
a660: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
a670: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
a680: 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c 20 3d  (DataTable tbl =
a690: 20 72 65 61 64 65 72 2e 47 65 74 53 63 68 65 6d   reader.GetSchem
a6a0: 61 54 61 62 6c 65 28 29 29 0d 0a 20 20 20 20 20  aTable())..     
a6b0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
a6c0: 20 20 20 20 20 20 20 20 69 66 20 28 74 62 6c 2e          if (tbl.
a6d0: 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d 20 32 29  Rows.Count != 2)
a6e0: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
a6f0: 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e 75 6d 62  tion("Wrong numb
a700: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
a710: 74 75 72 6e 65 64 22 29 3b 0d 0a 20 20 20 20 20  turned");..     
a720: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a730: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a740: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
a750: 78 74 20 3d 20 22 53 65 6c 65 63 74 20 2a 20 66  xt = "Select * f
a760: 72 6f 6d 20 6b 65 79 69 6e 66 6f 74 65 73 74 22  rom keyinfotest"
a770: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69  ;..          usi
a780: 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72  ng (DbDataReader
a790: 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78   reader = cmd.Ex
a7a0: 65 63 75 74 65 52 65 61 64 65 72 28 43 6f 6d 6d  ecuteReader(Comm
a7b0: 61 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65 79 49  andBehavior.KeyI
a7c0: 6e 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64 42 65 68  nfo | CommandBeh
a7d0: 61 76 69 6f 72 2e 53 63 68 65 6d 61 4f 6e 6c 79  avior.SchemaOnly
a7e0: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
a7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69  .            usi
a800: 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62  ng (DataTable tb
a810: 6c 20 3d 20 72 65 61 64 65 72 2e 47 65 74 53 63  l = reader.GetSc
a820: 68 65 6d 61 54 61 62 6c 65 28 29 29 0d 0a 20 20  hemaTable())..  
a830: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
a840: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74             if (t
a850: 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d  bl.Rows.Count !=
a860: 20 33 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78   3) throw new Ex
a870: 63 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e  ception("Wrong n
a880: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a890: 20 72 65 74 75 72 6e 65 64 22 29 3b 0d 0a 20 20   returned");..  
a8a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a8b0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
a8c0: 20 20 20 20 20 20 2f 2f 20 4d 61 6b 65 20 73 75        // Make su
a8d0: 72 65 20 63 6f 6d 6d 61 6e 64 62 75 69 6c 64 65  re commandbuilde
a8e0: 72 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20 61  r can generate a
a8f0: 6e 20 75 70 64 61 74 65 20 63 6f 6d 6d 61 6e 64  n update command
a900: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
a910: 74 20 70 61 72 61 6d 65 74 65 72 20 63 6f 75 6e  t parameter coun
a920: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69  t..          usi
a930: 6e 67 20 28 44 62 44 61 74 61 41 64 61 70 74 65  ng (DbDataAdapte
a940: 72 20 61 64 70 20 3d 20 5f 66 61 63 74 2e 43 72  r adp = _fact.Cr
a950: 65 61 74 65 44 61 74 61 41 64 61 70 74 65 72 28  eateDataAdapter(
a960: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73  ))..          us
a970: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 42 75  ing (DbCommandBu
a980: 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20 3d 20  ilder builder = 
a990: 5f 66 61 63 74 2e 43 72 65 61 74 65 43 6f 6d 6d  _fact.CreateComm
a9a0: 61 6e 64 42 75 69 6c 64 65 72 28 29 29 0d 0a 20  andBuilder()).. 
a9b0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
a9c0: 20 20 20 20 20 20 20 20 61 64 70 2e 53 65 6c 65          adp.Sele
a9d0: 63 74 43 6f 6d 6d 61 6e 64 20 3d 20 63 6d 64 3b  ctCommand = cmd;
a9e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75  ..            bu
a9f0: 69 6c 64 65 72 2e 44 61 74 61 41 64 61 70 74 65  ilder.DataAdapte
aa00: 72 20 3d 20 61 64 70 3b 0d 0a 20 20 20 20 20 20  r = adp;..      
aa10: 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e 43 6f        builder.Co
aa20: 6e 66 6c 69 63 74 4f 70 74 69 6f 6e 20 3d 20 43  nflictOption = C
aa30: 6f 6e 66 6c 69 63 74 4f 70 74 69 6f 6e 2e 4f 76  onflictOption.Ov
aa40: 65 72 77 72 69 74 65 43 68 61 6e 67 65 73 3b 0d  erwriteChanges;.
aa50: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
aa60: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
aa70: 2f 20 4e 4f 54 45 3a 20 2a 4d 4f 4e 4f 2a 20 54  / NOTE: *MONO* T
aa80: 68 69 73 20 74 65 73 74 20 66 61 69 6c 73 20 6f  his test fails o
aa90: 6e 20 61 6c 6c 20 72 65 63 65 6e 74 20 76 65 72  n all recent ver
aaa0: 73 69 6f 6e 73 20 6f 66 20 4d 6f 6e 6f 20 28 65  sions of Mono (e
aab0: 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .g...           
aac0: 20 2f 2f 20 20 20 20 20 20 20 32 2e 31 30 2c 20   //       2.10, 
aad0: 32 2e 31 31 29 20 66 6f 72 20 72 65 61 73 6f 6e  2.11) for reason
aae0: 73 20 74 68 61 74 20 61 72 65 20 70 72 65 73 65  s that are prese
aaf0: 6e 74 6c 79 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  ntly unknown... 
ab00: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
ab10: 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
ab20: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 75 70 64 61   (DbCommand upda
ab30: 74 65 63 6d 64 20 3d 20 62 75 69 6c 64 65 72 2e  tecmd = builder.
ab40: 47 65 74 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  GetUpdateCommand
ab50: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ())..           
ab60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ab70: 20 20 69 66 20 28 75 70 64 61 74 65 63 6d 64 2e    if (updatecmd.
ab80: 50 61 72 61 6d 65 74 65 72 73 2e 43 6f 75 6e 74  Parameters.Count
ab90: 20 21 3d 20 34 29 0d 0a 20 20 20 20 20 20 20 20   != 4)..        
aba0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
abb0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 57 72 6f  w Exception("Wro
abc0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72  ng number of par
abd0: 61 6d 65 74 65 72 73 20 69 6e 20 75 70 64 61 74  ameters in updat
abe0: 65 20 63 6f 6d 6d 61 6e 64 21 22 29 3b 0d 0a 20  e command!");.. 
abf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
ac00: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
ac10: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
ac20: 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 7b  nally..        {
ac30: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
ac40: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
ac50: 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69     [Test]..    i
ac60: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 43 6f 6e  nternal void Con
ac70: 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 42 75 69  nectionStringBui
ac80: 6c 64 65 72 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  lder()..    {.. 
ac90: 20 20 20 20 20 44 62 43 6f 6e 6e 65 63 74 69 6f       DbConnectio
aca0: 6e 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 62  nStringBuilder b
acb0: 75 69 6c 64 65 72 20 3d 20 5f 66 61 63 74 2e 43  uilder = _fact.C
acc0: 72 65 61 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 53  reateConnectionS
acd0: 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0d  tringBuilder();.
ace0: 0a 20 20 20 20 20 20 69 66 20 28 62 75 69 6c 64  .      if (build
acf0: 65 72 20 69 73 20 53 51 4c 69 74 65 43 6f 6e 6e  er is SQLiteConn
ad00: 65 63 74 69 6f 6e 53 74 72 69 6e 67 42 75 69 6c  ectionStringBuil
ad10: 64 65 72 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  der)..      {.. 
ad20: 20 20 20 20 20 20 20 62 6f 6f 6c 20 70 6f 6f 6c         bool pool
ad30: 20 3d 20 28 28 53 51 4c 69 74 65 43 6f 6e 6e 65   = ((SQLiteConne
ad40: 63 74 69 6f 6e 53 74 72 69 6e 67 42 75 69 6c 64  ctionStringBuild
ad50: 65 72 29 62 75 69 6c 64 65 72 29 2e 50 6f 6f 6c  er)builder).Pool
ad60: 69 6e 67 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ing;..      }.. 
ad70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
ad80: 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
ad90: 20 76 6f 69 64 20 4c 65 61 6b 79 43 6f 6d 6d 61   void LeakyComma
ada0: 6e 64 73 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  nds()..    {..  
adb0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d      for (int n =
adc0: 20 30 3b 20 6e 20 3c 20 31 30 30 30 30 30 3b 20   0; n < 100000; 
add0: 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  n++)..      {.. 
ade0: 20 20 20 20 20 20 20 44 62 43 6f 6d 6d 61 6e 64         DbCommand
adf0: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
ae00: 74 65 43 6f 6d 6d 61 6e 64 28 29 3b 0d 0a 20 20  teCommand();..  
ae10: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
ae20: 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20  dText = "SELECT 
ae30: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
ae40: 73 74 65 72 22 3b 0d 0a 20 20 20 20 20 20 20 20  ster";..        
ae50: 63 6d 64 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a  cmd.Prepare();..
ae60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 43        }..      C
ae70: 68 65 63 6b 4c 6f 63 6b 65 64 28 29 3b 0d 0a 20  heckLocked();.. 
ae80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
ae90: 74 28 53 65 71 75 65 6e 63 65 20 3d 20 36 30 29  t(Sequence = 60)
aea0: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
aeb0: 76 6f 69 64 20 4c 6f 63 6b 54 65 73 74 28 29 0d  void LockTest().
aec0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68  .    {..      Ch
aed0: 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 0d 0a  eckSQLite();....
aee0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
aef0: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
af00: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
af10: 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
af20: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
af30: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 46  Text = "SELECT F
af40: 69 65 6c 64 36 20 46 52 4f 4d 20 54 65 73 74 43  ield6 FROM TestC
af50: 61 73 65 20 57 48 45 52 45 20 46 69 65 6c 64 36  ase WHERE Field6
af60: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 3b 0d 0a   IS NOT NULL";..
af70: 20 20 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62          byte[] b
af80: 20 3d 20 6e 65 77 20 62 79 74 65 5b 34 30 30 30   = new byte[4000
af90: 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 73  ];....        us
afa0: 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65  ing (DbDataReade
afb0: 72 20 72 64 20 3d 20 63 6d 64 2e 45 78 65 63 75  r rd = cmd.Execu
afc0: 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20  teReader())..   
afd0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
afe0: 20 20 69 66 20 28 72 64 2e 52 65 61 64 28 29 20    if (rd.Read() 
aff0: 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20  == false) throw 
b000: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4e  new Exception("N
b010: 6f 20 64 61 74 61 20 74 6f 20 72 65 61 64 21 22  o data to read!"
b020: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
b030: 72 64 2e 47 65 74 42 79 74 65 73 28 30 2c 20 30  rd.GetBytes(0, 0
b040: 2c 20 62 2c 20 30 2c 20 34 30 30 30 29 3b 0d 0a  , b, 0, 4000);..
b050: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
b060: 62 5b 30 5d 20 21 3d 20 31 29 20 74 68 72 6f 77  b[0] != 1) throw
b070: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
b080: 42 69 6e 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e  Binary value non
b090: 2d 6d 61 74 63 68 20 62 79 74 65 20 30 22 29 3b  -match byte 0");
b0a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
b0b0: 62 5b 31 30 30 5d 20 21 3d 20 32 29 20 74 68 72  b[100] != 2) thr
b0c0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
b0d0: 28 22 42 69 6e 61 72 79 20 76 61 6c 75 65 20 6e  ("Binary value n
b0e0: 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65 20 31 30  on-match byte 10
b0f0: 30 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  0");..          
b100: 69 66 20 28 62 5b 31 30 30 30 5d 20 21 3d 20 33  if (b[1000] != 3
b110: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
b120: 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61  ption("Binary va
b130: 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79  lue non-match by
b140: 74 65 20 31 30 30 30 22 29 3b 0d 0a 20 20 20 20  te 1000");..    
b150: 20 20 20 20 20 20 69 66 20 28 62 5b 32 30 30 30        if (b[2000
b160: 5d 20 21 3d 20 34 29 20 74 68 72 6f 77 20 6e 65  ] != 4) throw ne
b170: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e  w Exception("Bin
b180: 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61  ary value non-ma
b190: 74 63 68 20 62 79 74 65 20 32 30 30 30 22 29 3b  tch byte 2000");
b1a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
b1b0: 62 5b 33 30 30 30 5d 20 21 3d 20 35 29 20 74 68  b[3000] != 5) th
b1c0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
b1d0: 6e 28 22 42 69 6e 61 72 79 20 76 61 6c 75 65 20  n("Binary value 
b1e0: 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65 20 33  non-match byte 3
b1f0: 30 30 30 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  000");....      
b200: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6e      using (DbCon
b210: 6e 65 63 74 69 6f 6e 20 63 6c 6f 6e 65 20 3d 20  nection clone = 
b220: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29 28 28  (DbConnection)((
b230: 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e 6e 29  ICloneable)_cnn)
b240: 2e 43 6c 6f 6e 65 28 29 29 0d 0a 20 20 20 20 20  .Clone())..     
b250: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
b260: 20 20 20 20 69 66 20 28 63 6c 6f 6e 65 2e 53 74      if (clone.St
b270: 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f  ate != Connectio
b280: 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 63 6c 6f  nState.Open) clo
b290: 6e 65 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20  ne.Open();..    
b2a0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
b2b0: 62 43 6f 6d 6d 61 6e 64 20 6e 65 77 63 6d 64 20  bCommand newcmd 
b2c0: 3d 20 63 6c 6f 6e 65 2e 43 72 65 61 74 65 43 6f  = clone.CreateCo
b2d0: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
b2e0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
b2f0: 20 20 20 20 20 20 20 6e 65 77 63 6d 64 2e 43 6f         newcmd.Co
b300: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 44 45 4c  mmandText = "DEL
b310: 45 54 45 20 46 52 4f 4d 20 54 65 73 74 43 61 73  ETE FROM TestCas
b320: 65 20 57 48 45 52 45 20 46 69 65 6c 64 36 20 49  e WHERE Field6 I
b330: 53 20 4e 55 4c 4c 22 3b 0d 0a 20 20 20 20 20 20  S NULL";..      
b340: 20 20 20 20 20 20 20 20 6e 65 77 63 6d 64 2e 43          newcmd.C
b350: 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74 20 3d 20  ommandTimeout = 
b360: 32 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
b370: 20 20 69 6e 74 20 63 6d 64 53 74 61 72 74 20 3d    int cmdStart =
b380: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
b390: 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20  kCount;..       
b3a0: 20 20 20 20 20 20 20 69 6e 74 20 63 6d 64 45 6e         int cmdEn
b3b0: 64 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  d;....          
b3c0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
b3d0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
b3e0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 63 6d 64            newcmd
b3f0: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
b400: 28 29 3b 20 2f 2f 20 73 68 6f 75 6c 64 20 66 61  (); // should fa
b410: 69 6c 20 62 65 63 61 75 73 65 20 74 68 65 72 65  il because there
b420: 27 73 20 61 20 72 65 61 64 65 72 20 6f 6e 20 74  's a reader on t
b430: 68 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  he database..   
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
b450: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45  ow new ArgumentE
b460: 78 63 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64  xception("Should
b470: 20 6e 6f 74 20 68 61 76 65 20 61 6c 6c 6f 77 65   not have allowe
b480: 64 20 61 6e 20 65 78 65 63 75 74 65 20 77 69 74  d an execute wit
b490: 68 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 65 72  h an open reader
b4a0: 22 29 3b 20 2f 2f 20 49 66 20 77 65 20 67 6f 74  "); // If we got
b4b0: 20 68 65 72 65 2c 20 74 68 65 20 74 65 73 74 20   here, the test 
b4c0: 66 61 69 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  failed..        
b4d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b4e0: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78         catch (Ex
b4f0: 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ception e)..    
b500: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
b520: 28 65 20 69 73 20 41 72 67 75 6d 65 6e 74 45 78  (e is ArgumentEx
b530: 63 65 70 74 69 6f 6e 29 20 74 68 72 6f 77 20 6e  ception) throw n
b540: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 65 2e 4d  ew Exception(e.M
b550: 65 73 73 61 67 65 29 3b 0d 0a 0d 0a 20 20 20 20  essage);....    
b560: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 45              cmdE
b570: 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  nd = Environment
b580: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
b5a0: 28 63 6d 64 45 6e 64 20 2d 20 63 6d 64 53 74 61  (cmdEnd - cmdSta
b5b0: 72 74 20 3c 20 32 30 30 30 20 7c 7c 20 63 6d 64  rt < 2000 || cmd
b5c0: 45 6e 64 20 2d 20 63 6d 64 53 74 61 72 74 20 3e  End - cmdStart >
b5d0: 20 33 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20   3000)..        
b5e0: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
b5f0: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 44  new Exception("D
b600: 69 64 20 6e 6f 74 20 67 69 76 65 20 75 70 20 74  id not give up t
b610: 68 65 20 6c 6f 63 6b 20 61 74 20 74 68 65 20 72  he lock at the r
b620: 69 67 68 74 20 74 69 6d 65 21 22 29 3b 20 2f 2f  ight time!"); //
b630: 20 44 69 64 6e 27 74 20 77 61 69 74 20 74 68 65   Didn't wait the
b640: 20 72 69 67 68 74 20 61 6d 6f 75 6e 74 20 6f 66   right amount of
b650: 20 74 69 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20   time....       
b660: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
b670: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b680: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
b690: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b6a0: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
b6b0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 45 78  ary>..    /// Ex
b6c0: 65 63 75 74 65 20 6d 75 6c 74 69 70 6c 65 20 73  ecute multiple s
b6d0: 74 65 70 73 20 69 6e 20 61 20 63 6f 6d 6d 61 6e  teps in a comman
b6e0: 64 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65  d and verify the
b6f0: 20 72 65 73 75 6c 74 73 2e 20 20 4d 61 6b 65 73   results.  Makes
b700: 20 73 75 72 65 20 74 68 61 74 20 63 6f 6d 6d 61   sure that comma
b710: 6e 64 73 20 61 66 74 65 72 20 61 20 73 65 6c 65  nds after a sele
b720: 63 74 20 73 74 69 6c 6c 0d 0a 20 20 20 20 2f 2f  ct still..    //
b730: 2f 20 67 65 74 20 65 78 65 63 75 74 65 64 20 65  / get executed e
b740: 76 65 6e 20 69 66 20 4d 6f 76 65 4e 65 78 74 28  ven if MoveNext(
b750: 29 20 69 73 6e 27 74 20 63 61 6c 6c 65 64 20 65  ) isn't called e
b760: 78 70 6c 69 63 69 74 6c 79 20 74 6f 20 6d 6f 76  xplicitly to mov
b770: 65 20 74 68 69 6e 67 73 20 61 6c 6f 6e 67 2e 0d  e things along..
b780: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
b790: 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  ry>..    [Test].
b7a0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
b7b0: 69 64 20 4d 75 6c 74 69 53 74 65 70 52 65 61 64  id MultiStepRead
b7c0: 65 72 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  erTest()..    {.
b7d0: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
b7e0: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
b7f0: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
b800: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
b810: 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
b820: 2e 41 64 64 28 22 73 74 65 70 72 65 61 64 65 72  .Add("stepreader
b830: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ");..        cmd
b840: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
b850: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 65  CREATE TABLE ste
b860: 70 72 65 61 64 65 72 20 28 69 64 20 69 6e 74 20  preader (id int 
b870: 70 72 69 6d 61 72 79 20 6b 65 79 29 3b 49 4e 53  primary key);INS
b880: 45 52 54 20 49 4e 54 4f 20 73 74 65 70 72 65 61  ERT INTO steprea
b890: 64 65 72 20 76 61 6c 75 65 73 28 31 29 3b 53 45  der values(1);SE
b8a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 74 65 70  LECT * FROM step
b8b0: 72 65 61 64 65 72 3b 55 50 44 41 54 45 20 73 74  reader;UPDATE st
b8c0: 65 70 72 65 61 64 65 72 20 73 65 74 20 69 64 20  epreader set id 
b8d0: 3d 20 69 64 20 2b 20 31 3b 22 3b 0d 0a 20 20 20  = id + 1;";..   
b8e0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
b8f0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
b900: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
b910: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
b920: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
b930: 28 72 65 61 64 65 72 2e 52 65 61 64 28 29 20 3d  (reader.Read() =
b940: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
b950: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 46 61  ew Exception("Fa
b960: 69 6c 65 64 20 74 6f 20 72 65 61 64 20 66 72 6f  iled to read fro
b970: 6d 20 74 68 65 20 74 61 62 6c 65 22 29 3b 0d 0a  m the table");..
b980: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65            if (re
b990: 61 64 65 72 2e 47 65 74 49 6e 74 33 32 28 30 29  ader.GetInt32(0)
b9a0: 20 21 3d 20 31 29 20 74 68 72 6f 77 20 6e 65 77   != 1) throw new
b9b0: 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
b9c0: 67 2e 46 6f 72 6d 61 74 28 22 45 78 70 65 63 74  g.Format("Expect
b9d0: 65 64 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22 2c  ed {0} got {1}",
b9e0: 20 31 2c 20 72 65 61 64 65 72 2e 47 65 74 49 6e   1, reader.GetIn
b9f0: 74 33 32 28 30 29 29 29 3b 0d 0a 20 20 20 20 20  t32(0)));..     
ba00: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 6d     }..        cm
ba10: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
ba20: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
ba30: 74 65 70 72 65 61 64 65 72 22 3b 0d 0a 20 20 20  tepreader";..   
ba40: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
ba50: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
ba60: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
ba70: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
ba80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
ba90: 28 72 65 61 64 65 72 2e 52 65 61 64 28 29 20 3d  (reader.Read() =
baa0: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
bab0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 46 61  ew Exception("Fa
bac0: 69 6c 65 64 20 74 6f 20 72 65 61 64 20 66 72 6f  iled to read fro
bad0: 6d 20 74 68 65 20 74 61 62 6c 65 22 29 3b 0d 0a  m the table");..
bae0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65            if (re
baf0: 61 64 65 72 2e 47 65 74 49 6e 74 33 32 28 30 29  ader.GetInt32(0)
bb00: 20 21 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77   != 2) throw new
bb10: 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
bb20: 67 2e 46 6f 72 6d 61 74 28 22 45 78 70 65 63 74  g.Format("Expect
bb30: 65 64 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22 2c  ed {0} got {1}",
bb40: 20 32 2c 20 72 65 61 64 65 72 2e 47 65 74 49 6e   2, reader.GetIn
bb50: 74 33 32 28 30 29 29 29 3b 0d 0a 20 20 20 20 20  t32(0)));..     
bb60: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
bb70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65     }....    inte
bb80: 72 6e 61 6c 20 63 6c 61 73 73 20 4d 54 54 65 73  rnal class MTTes
bb90: 74 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  t..    {..      
bba0: 69 6e 74 65 72 6e 61 6c 20 44 62 43 6f 6e 6e 65  internal DbConne
bbb0: 63 74 69 6f 6e 20 63 6e 6e 3b 0d 0a 20 20 20 20  ction cnn;..    
bbc0: 20 20 69 6e 74 65 72 6e 61 6c 20 45 78 63 65 70    internal Excep
bbd0: 74 69 6f 6e 20 65 3b 0d 0a 20 20 20 20 20 20 69  tion e;..      i
bbe0: 6e 74 65 72 6e 61 6c 20 53 79 73 74 65 6d 2e 54  nternal System.T
bbf0: 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 20  hreading.Thread 
bc00: 74 3b 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6e  t;..      intern
bc10: 61 6c 20 69 6e 74 20 76 61 6c 75 65 3b 0d 0a 20  al int value;.. 
bc20: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 79       internal Sy
bc30: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 4d  stem.Threading.M
bc40: 61 6e 75 61 6c 52 65 73 65 74 45 76 65 6e 74 20  anualResetEvent 
bc50: 65 76 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ev;..    }....  
bc60: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
bc70: 3d 31 31 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72  =11)]..    inter
bc80: 6e 61 6c 20 76 6f 69 64 20 4d 75 6c 74 69 74 68  nal void Multith
bc90: 72 65 61 64 69 6e 67 54 65 73 74 28 29 0d 0a 20  readingTest().. 
bca0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e     {..      usin
bcb0: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
bcc0: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
bcd0: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
bce0: 7b 0d 0a 20 20 20 20 20 20 20 20 64 72 6f 70 74  {..        dropt
bcf0: 61 62 6c 65 73 2e 41 64 64 28 22 4d 75 6c 74 69  ables.Add("Multi
bd00: 54 68 72 65 61 64 65 64 54 65 73 74 22 29 3b 0d  ThreadedTest");.
bd10: 0a 20 20 20 20 20 20 20 20 69 66 20 28 5f 66 61  .        if (_fa
bd20: 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d  ct.GetType().Nam
bd30: 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74  e.IndexOf("SQLit
bd40: 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  e", StringCompar
bd50: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
bd60: 72 65 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a  reCase) == -1)..
bd70: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
bd80: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45  mmandText = "CRE
bd90: 41 54 45 20 54 41 42 4c 45 20 4d 75 6c 74 69 54  ATE TABLE MultiT
bda0: 68 72 65 61 64 65 64 54 65 73 74 28 49 44 20 69  hreadedTest(ID i
bdb0: 6e 74 65 67 65 72 20 69 64 65 6e 74 69 74 79 20  nteger identity 
bdc0: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 54 68 72  primary key, Thr
bdd0: 65 61 64 49 64 20 69 6e 74 65 67 65 72 2c 20 4d  eadId integer, M
bde0: 79 56 61 6c 75 65 20 69 6e 74 65 67 65 72 29 22  yValue integer)"
bdf0: 3b 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d  ;..        else.
be00: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43  .          cmd.C
be10: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52  ommandText = "CR
be20: 45 41 54 45 20 54 41 42 4c 45 20 4d 75 6c 74 69  EATE TABLE Multi
be30: 54 68 72 65 61 64 65 64 54 65 73 74 28 49 44 20  ThreadedTest(ID 
be40: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
be50: 6b 65 79 2c 20 54 68 72 65 61 64 49 64 20 69 6e  key, ThreadId in
be60: 74 65 67 65 72 2c 20 4d 79 56 61 6c 75 65 20 69  teger, MyValue i
be70: 6e 74 65 67 65 72 29 22 3b 0d 0a 0d 0a 20 20 20  nteger)";....   
be80: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
be90: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
bea0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 53 79     }....      Sy
beb0: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 4d  stem.Threading.M
bec0: 61 6e 75 61 6c 52 65 73 65 74 45 76 65 6e 74 5b  anualResetEvent[
bed0: 5d 20 65 76 65 6e 74 73 20 3d 20 6e 65 77 20 53  ] events = new S
bee0: 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e  ystem.Threading.
bef0: 4d 61 6e 75 61 6c 52 65 73 65 74 45 76 65 6e 74  ManualResetEvent
bf00: 5b 4e 75 6d 54 68 72 65 61 64 73 5d 3b 0d 0a 20  [NumThreads];.. 
bf10: 20 20 20 20 20 4d 54 54 65 73 74 5b 5d 20 61 72       MTTest[] ar
bf20: 72 20 3d 20 6e 65 77 20 4d 54 54 65 73 74 5b 4e  r = new MTTest[N
bf30: 75 6d 54 68 72 65 61 64 73 5d 3b 0d 0a 0d 0a 20  umThreads];.... 
bf40: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
bf50: 3d 20 30 3b 20 6e 20 3c 20 61 72 72 2e 4c 65 6e  = 0; n < arr.Len
bf60: 67 74 68 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20  gth; n++)..     
bf70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b   {..        arr[
bf80: 6e 5d 20 3d 20 6e 65 77 20 4d 54 54 65 73 74 28  n] = new MTTest(
bf90: 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b  );..        arr[
bfa0: 6e 5d 2e 74 20 3d 20 6e 65 77 20 53 79 73 74 65  n].t = new Syste
bfb0: 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
bfc0: 61 64 28 6e 65 77 20 53 79 73 74 65 6d 2e 54 68  ad(new System.Th
bfd0: 72 65 61 64 69 6e 67 2e 50 61 72 61 6d 65 74 65  reading.Paramete
bfe0: 72 69 7a 65 64 54 68 72 65 61 64 53 74 61 72 74  rizedThreadStart
bff0: 28 4d 75 6c 74 69 74 68 72 65 61 64 65 64 54 65  (MultithreadedTe
c000: 73 74 54 68 72 65 61 64 29 29 3b 0d 0a 20 20 20  stThread));..   
c010: 20 20 20 20 20 61 72 72 5b 6e 5d 2e 74 2e 49 73       arr[n].t.Is
c020: 42 61 63 6b 67 72 6f 75 6e 64 20 3d 20 74 72 75  Background = tru
c030: 65 3b 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b  e;..        arr[
c040: 6e 5d 2e 63 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e  n].cnn = ((IClon
c050: 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e  eable)_cnn).Clon
c060: 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74  e() as DbConnect
c070: 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 61 72  ion;..        ar
c080: 72 5b 6e 5d 2e 65 76 20 3d 20 65 76 65 6e 74 73  r[n].ev = events
c090: 5b 6e 5d 20 3d 20 6e 65 77 20 53 79 73 74 65 6d  [n] = new System
c0a0: 2e 54 68 72 65 61 64 69 6e 67 2e 4d 61 6e 75 61  .Threading.Manua
c0b0: 6c 52 65 73 65 74 45 76 65 6e 74 28 66 61 6c 73  lResetEvent(fals
c0c0: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 72 72  e);..        arr
c0d0: 5b 6e 5d 2e 74 2e 53 74 61 72 74 28 61 72 72 5b  [n].t.Start(arr[
c0e0: 6e 5d 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  n]);..      }...
c0f0: 0a 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54 68  .      System.Th
c100: 72 65 61 64 69 6e 67 2e 57 61 69 74 48 61 6e 64  reading.WaitHand
c110: 6c 65 2e 57 61 69 74 41 6c 6c 28 65 76 65 6e 74  le.WaitAll(event
c120: 73 2c 20 54 68 72 65 61 64 54 69 6d 65 6f 75 74  s, ThreadTimeout
c130: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 62 6f 6f 6c  );....      bool
c140: 20 66 61 69 6c 65 64 20 3d 20 66 61 6c 73 65 3b   failed = false;
c150: 0d 0a 20 20 20 20 20 20 45 78 63 65 70 74 69 6f  ..      Exceptio
c160: 6e 20 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  n e = null;.... 
c170: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
c180: 3d 20 30 3b 20 6e 20 3c 20 61 72 72 2e 4c 65 6e  = 0; n < arr.Len
c190: 67 74 68 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20  gth; n++)..     
c1a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28   {..        if (
c1b0: 61 72 72 5b 6e 5d 2e 74 2e 4a 6f 69 6e 28 30 29  arr[n].t.Join(0)
c1c0: 20 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20 20   == false)..    
c1d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c1e0: 20 66 61 69 6c 65 64 20 3d 20 74 72 75 65 3b 0d   failed = true;.
c1f0: 0a 20 20 20 20 20 20 20 20 20 20 61 72 72 5b 6e  .          arr[n
c200: 5d 2e 74 2e 41 62 6f 72 74 28 29 3b 0d 0a 20 20  ].t.Abort();..  
c210: 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 74          arr[n].t
c220: 2e 4a 6f 69 6e 28 29 3b 0d 0a 20 20 20 20 20 20  .Join();..      
c230: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 20    }..        if 
c240: 28 61 72 72 5b 6e 5d 2e 65 20 21 3d 20 6e 75 6c  (arr[n].e != nul
c250: 6c 29 20 65 20 3d 20 61 72 72 5b 6e 5d 2e 65 3b  l) e = arr[n].e;
c260: 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d  ..        arr[n]
c270: 2e 63 6e 6e 2e 44 69 73 70 6f 73 65 28 29 3b 0d  .cnn.Dispose();.
c280: 0a 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e  .        arr[n].
c290: 65 76 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20 20 20  ev.Close();..   
c2a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 69 66 20 28     }..      if (
c2b0: 66 61 69 6c 65 64 29 20 74 68 72 6f 77 20 6e 65  failed) throw ne
c2c0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4f 6e 65  w Exception("One
c2d0: 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73   or more threads
c2e0: 20 64 65 61 64 6c 6f 63 6b 65 64 22 29 3b 0d 0a   deadlocked");..
c2f0: 20 20 20 20 20 20 69 66 20 28 65 20 21 3d 20 6e        if (e != n
c300: 75 6c 6c 29 20 0d 0a 20 20 20 20 20 20 20 20 74  ull) ..        t
c310: 68 72 6f 77 20 65 3b 0d 0a 20 20 20 20 7d 0d 0a  hrow e;..    }..
c320: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
c330: 6f 69 64 20 4d 75 6c 74 69 74 68 72 65 61 64 65  oid Multithreade
c340: 64 54 65 73 74 54 68 72 65 61 64 28 6f 62 6a 65  dTestThread(obje
c350: 63 74 20 6f 62 6a 29 0d 0a 20 20 20 20 7b 0d 0a  ct obj)..    {..
c360: 20 20 20 20 20 20 4d 54 54 65 73 74 20 74 65 73        MTTest tes
c370: 74 20 3d 20 6f 62 6a 20 61 73 20 4d 54 54 65 73  t = obj as MTTes
c380: 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28  t;....      if (
c390: 74 65 73 74 2e 63 6e 6e 2e 53 74 61 74 65 20 21  test.cnn.State !
c3a0: 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74  = ConnectionStat
c3b0: 65 2e 4f 70 65 6e 29 0d 0a 20 20 20 20 20 20 20  e.Open)..       
c3c0: 20 74 65 73 74 2e 63 6e 6e 2e 4f 70 65 6e 28 29   test.cnn.Open()
c3d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 6e 74 20 73  ;....      int s
c3e0: 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65  tart = Environme
c3f0: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20  nt.TickCount;.. 
c400: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
c410: 7b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  {..        using
c420: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
c430: 3d 20 74 65 73 74 2e 63 6e 6e 2e 43 72 65 61 74  = test.cnn.Creat
c440: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
c450: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
c460: 20 20 62 6f 6f 6c 20 6f 6e 63 65 20 3d 20 66 61    bool once = fa
c470: 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
c480: 77 68 69 6c 65 20 28 21 6f 6e 63 65 20 7c 7c 20  while (!once || 
c490: 28 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  ((Environment.Ti
c4a0: 63 6b 43 6f 75 6e 74 20 2d 20 73 74 61 72 74 29  ckCount - start)
c4b0: 20 3c 20 32 30 30 30 29 29 0d 0a 20 20 20 20 20   < 2000))..     
c4c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
c4d0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 54 72 61      using (DbTra
c4e0: 6e 73 61 63 74 69 6f 6e 20 74 72 61 6e 73 20 3d  nsaction trans =
c4f0: 20 74 65 73 74 2e 63 6e 6e 2e 42 65 67 69 6e 54   test.cnn.BeginT
c500: 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 0d 0a 20  ransaction()).. 
c510: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
c520: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
c530: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53 74  CommandText = St
c540: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 53 45 4c  ring.Format("SEL
c550: 45 43 54 20 2a 20 46 52 4f 4d 20 4d 75 6c 74 69  ECT * FROM Multi
c560: 54 68 72 65 61 64 65 64 54 65 73 74 20 57 48 45  ThreadedTest WHE
c570: 52 45 20 54 68 72 65 61 64 49 64 20 3d 20 7b 30  RE ThreadId = {0
c580: 7d 22 2c 20 74 65 73 74 2e 74 2e 4d 61 6e 61 67  }", test.t.Manag
c590: 65 64 54 68 72 65 61 64 49 64 29 3b 0d 0a 20 20  edThreadId);..  
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
c5b0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 74 72  Transaction = tr
c5c0: 61 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ans;..          
c5d0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
c5e0: 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d  aReader reader =
c5f0: 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64   cmd.ExecuteRead
c600: 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  er())..         
c610: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
c620: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 72          while (r
c630: 65 61 64 65 72 2e 52 65 61 64 28 29 29 0d 0a 20  eader.Read()).. 
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
c650: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c660: 20 20 20 20 74 65 73 74 2e 76 61 6c 75 65 20 2b      test.value +
c670: 3d 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33  = Convert.ToInt3
c680: 32 28 72 65 61 64 65 72 5b 32 5d 29 3b 0d 0a 20  2(reader[2]);.. 
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
c6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c6b0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
c6c0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
c6d0: 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
c6e0: 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 4d 75  ("INSERT INTO Mu
c6f0: 6c 74 69 54 68 72 65 61 64 65 64 54 65 73 74 28  ltiThreadedTest(
c700: 54 68 72 65 61 64 49 64 2c 20 4d 79 56 61 6c 75  ThreadId, MyValu
c710: 65 29 20 56 41 4c 55 45 53 28 7b 30 7d 2c 20 7b  e) VALUES({0}, {
c720: 31 7d 29 22 2c 20 74 65 73 74 2e 74 2e 4d 61 6e  1})", test.t.Man
c730: 61 67 65 64 54 68 72 65 61 64 49 64 2c 20 45 6e  agedThreadId, En
c740: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
c750: 75 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  unt);..         
c760: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
c770: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20  NonQuery();.... 
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
c790: 6e 73 2e 43 6f 6d 6d 69 74 28 29 3b 0d 0a 20 20  ns.Commit();..  
c7a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
c7b0: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20             once 
c7c0: 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20  = true;..       
c7d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
c7e0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
c7f0: 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e  catch (Exception
c800: 20 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20   e)..      {..  
c810: 20 20 20 20 20 20 74 65 73 74 2e 65 20 3d 20 65        test.e = e
c820: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
c830: 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20    finally..     
c840: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 65 73 74   {..        test
c850: 2e 65 76 2e 53 65 74 28 29 3b 0d 0a 20 20 20 20  .ev.Set();..    
c860: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
c870: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
c880: 74 65 72 6e 61 6c 20 76 6f 69 64 20 50 61 72 61  ternal void Para
c890: 6d 65 74 65 72 69 7a 65 64 49 6e 73 65 72 74 28  meterizedInsert(
c8a0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
c8b0: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
c8c0: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
c8d0: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
c8e0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
c8f0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
c900: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 54 65   "INSERT INTO Te
c910: 73 74 43 61 73 65 28 46 69 65 6c 64 31 2c 20 46  stCase(Field1, F
c920: 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d  ield2, [Fi..ld3]
c930: 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65  , [Fi..ld4], Fie
c940: 6c 64 35 29 20 56 41 4c 55 45 53 28 40 70 31 2c  ld5) VALUES(@p1,
c950: 40 70 32 2c 40 70 33 2c 40 70 34 2c 40 70 35 29  @p2,@p3,@p4,@p5)
c960: 22 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61  ";..        DbPa
c970: 72 61 6d 65 74 65 72 20 46 69 65 6c 64 31 20 3d  rameter Field1 =
c980: 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d   cmd.CreateParam
c990: 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  eter();..       
c9a0: 20 44 62 50 61 72 61 6d 65 74 65 72 20 46 69 65   DbParameter Fie
c9b0: 6c 64 32 20 3d 20 63 6d 64 2e 43 72 65 61 74 65  ld2 = cmd.Create
c9c0: 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20  Parameter();..  
c9d0: 20 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65        DbParamete
c9e0: 72 20 46 69 65 6c 64 33 20 3d 20 63 6d 64 2e 43  r Field3 = cmd.C
c9f0: 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29  reateParameter()
ca00: 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61 72  ;..        DbPar
ca10: 61 6d 65 74 65 72 20 46 69 65 6c 64 34 20 3d 20  ameter Field4 = 
ca20: 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65  cmd.CreateParame
ca30: 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ter();..        
ca40: 44 62 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c  DbParameter Fiel
ca50: 64 35 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50  d5 = cmd.CreateP
ca60: 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20  arameter();.... 
ca70: 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e 50 61         Field1.Pa
ca80: 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40  rameterName = "@
ca90: 70 31 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  p1";..        Fi
caa0: 65 6c 64 32 2e 50 61 72 61 6d 65 74 65 72 4e 61  eld2.ParameterNa
cab0: 6d 65 20 3d 20 22 40 70 32 22 3b 0d 0a 20 20 20  me = "@p2";..   
cac0: 20 20 20 20 20 46 69 65 6c 64 33 2e 50 61 72 61       Field3.Para
cad0: 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 33  meterName = "@p3
cae0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c  ";..        Fiel
caf0: 64 34 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65  d4.ParameterName
cb00: 20 3d 20 22 40 70 34 22 3b 0d 0a 20 20 20 20 20   = "@p4";..     
cb10: 20 20 20 46 69 65 6c 64 35 2e 50 61 72 61 6d 65     Field5.Parame
cb20: 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 35 22 3b  terName = "@p5";
cb30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c  ....        Fiel
cb40: 64 31 2e 56 61 6c 75 65 20 3d 20 32 3b 0d 0a 20  d1.Value = 2;.. 
cb50: 20 20 20 20 20 20 20 46 69 65 6c 64 32 2e 56 61         Field2.Va
cb60: 6c 75 65 20 3d 20 33 2e 31 34 31 35 39 3b 0d 0a  lue = 3.14159;..
cb70: 20 20 20 20 20 20 20 20 46 69 65 6c 64 33 2e 56          Field3.V
cb80: 61 6c 75 65 20 3d 20 22 50 61 72 61 6d 20 46 69  alue = "Param Fi
cb90: 65 6c 64 33 22 3b 0d 0a 20 20 20 20 20 20 20 20  eld3";..        
cba0: 46 69 65 6c 64 34 2e 56 61 6c 75 65 20 3d 20 22  Field4.Value = "
cbb0: 46 69 65 6c 64 34 20 50 61 72 22 3b 0d 0a 20 20  Field4 Par";..  
cbc0: 20 20 20 20 20 20 46 69 65 6c 64 35 2e 56 61 6c        Field5.Val
cbd0: 75 65 20 3d 20 44 61 74 65 54 69 6d 65 2e 4e 6f  ue = DateTime.No
cbe0: 77 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d  w;....        cm
cbf0: 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64  d.Parameters.Add
cc00: 28 46 69 65 6c 64 31 29 3b 0d 0a 20 20 20 20 20  (Field1);..     
cc10: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
cc20: 73 2e 41 64 64 28 46 69 65 6c 64 32 29 3b 0d 0a  s.Add(Field2);..
cc30: 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61          cmd.Para
cc40: 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c 64  meters.Add(Field
cc50: 33 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  3);..        cmd
cc60: 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28  .Parameters.Add(
cc70: 46 69 65 6c 64 34 29 3b 0d 0a 20 20 20 20 20 20  Field4);..      
cc80: 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73    cmd.Parameters
cc90: 2e 41 64 64 28 46 69 65 6c 64 35 29 3b 0d 0a 0d  .Add(Field5);...
cca0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
ccb0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
ccc0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
ccd0: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20  ...    [Test].. 
cce0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
ccf0: 20 50 61 72 61 6d 65 74 65 72 69 7a 65 64 49 6e   ParameterizedIn
cd00: 73 65 72 74 4d 69 73 73 69 6e 67 50 61 72 61 6d  sertMissingParam
cd10: 73 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  s()..    {..    
cd20: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
cd30: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
cd40: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
cd50: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
cd60: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
cd70: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
cd80: 54 65 73 74 43 61 73 65 28 46 69 65 6c 64 31 2c  TestCase(Field1,
cd90: 20 46 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64   Field2, [Fi..ld
cda0: 33 5d 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46  3], [Fi..ld4], F
cdb0: 69 65 6c 64 35 29 20 56 41 4c 55 45 53 28 40 70  ield5) VALUES(@p
cdc0: 31 2c 40 70 32 2c 40 70 33 2c 40 70 34 2c 40 70  1,@p2,@p3,@p4,@p
cdd0: 35 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 44 62  5)";..        Db
cde0: 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 31  Parameter Field1
cdf0: 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72   = cmd.CreatePar
ce00: 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20  ameter();..     
ce10: 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 46     DbParameter F
ce20: 69 65 6c 64 32 20 3d 20 63 6d 64 2e 43 72 65 61  ield2 = cmd.Crea
ce30: 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a  teParameter();..
ce40: 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65          DbParame
ce50: 74 65 72 20 46 69 65 6c 64 33 20 3d 20 63 6d 64  ter Field3 = cmd
ce60: 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72  .CreateParameter
ce70: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50  ();..        DbP
ce80: 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 34 20  arameter Field4 
ce90: 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61  = cmd.CreatePara
cea0: 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20  meter();..      
ceb0: 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 46 69    DbParameter Fi
cec0: 65 6c 64 35 20 3d 20 63 6d 64 2e 43 72 65 61 74  eld5 = cmd.Creat
ced0: 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d  eParameter();...
cee0: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e  .        Field1.
cef0: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
cf00: 22 40 70 31 22 3b 0d 0a 20 20 20 20 20 20 20 20  "@p1";..        
cf10: 46 69 65 6c 64 32 2e 50 61 72 61 6d 65 74 65 72  Field2.Parameter
cf20: 4e 61 6d 65 20 3d 20 22 40 70 32 22 3b 0d 0a 20  Name = "@p2";.. 
cf30: 20 20 20 20 20 20 20 46 69 65 6c 64 33 2e 50 61         Field3.Pa
cf40: 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40  rameterName = "@
cf50: 70 33 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  p3";..        Fi
cf60: 65 6c 64 34 2e 50 61 72 61 6d 65 74 65 72 4e 61  eld4.ParameterNa
cf70: 6d 65 20 3d 20 22 40 70 34 22 3b 0d 0a 20 20 20  me = "@p4";..   
cf80: 20 20 20 20 20 46 69 65 6c 64 35 2e 50 61 72 61       Field5.Para
cf90: 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 35  meterName = "@p5
cfa0: 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 46 69  ";....        Fi
cfb0: 65 6c 64 31 2e 44 62 54 79 70 65 20 3d 20 53 79  eld1.DbType = Sy
cfc0: 73 74 65 6d 2e 44 61 74 61 2e 44 62 54 79 70 65  stem.Data.DbType
cfd0: 2e 49 6e 74 33 32 3b 0d 0a 0d 0a 20 20 20 20 20  .Int32;....     
cfe0: 20 20 20 46 69 65 6c 64 31 2e 56 61 6c 75 65 20     Field1.Value 
cff0: 3d 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  = 2;..        Fi
d000: 65 6c 64 32 2e 56 61 6c 75 65 20 3d 20 33 2e 31  eld2.Value = 3.1
d010: 34 31 35 39 3b 0d 0a 20 20 20 20 20 20 20 20 46  4159;..        F
d020: 69 65 6c 64 33 2e 56 61 6c 75 65 20 3d 20 22 46  ield3.Value = "F
d030: 69 65 6c 64 33 20 50 61 72 61 6d 22 3b 0d 0a 20  ield3 Param";.. 
d040: 20 20 20 20 20 20 20 46 69 65 6c 64 34 2e 56 61         Field4.Va
d050: 6c 75 65 20 3d 20 22 46 69 65 6c 64 34 20 50 61  lue = "Field4 Pa
d060: 72 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65  r";..        Fie
d070: 6c 64 35 2e 56 61 6c 75 65 20 3d 20 44 61 74 65  ld5.Value = Date
d080: 54 69 6d 65 2e 4e 6f 77 3b 0d 0a 0d 0a 20 20 20  Time.Now;....   
d090: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
d0a0: 65 72 73 2e 41 64 64 28 46 69 65 6c 64 31 29 3b  ers.Add(Field1);
d0b0: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61  ..        cmd.Pa
d0c0: 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65  rameters.Add(Fie
d0d0: 6c 64 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 63  ld2);..        c
d0e0: 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64  md.Parameters.Ad
d0f0: 64 28 46 69 65 6c 64 33 29 3b 0d 0a 20 20 20 20  d(Field3);..    
d100: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
d110: 72 73 2e 41 64 64 28 46 69 65 6c 64 34 29 3b 0d  rs.Add(Field4);.
d120: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 41 73  ...        // As
d130: 73 65 72 74 69 6f 6e 20 68 65 72 65 2c 20 6e 6f  sertion here, no
d140: 74 20 65 6e 6f 75 67 68 20 70 61 72 61 6d 65 74  t enough paramet
d150: 65 72 73 0d 0a 20 20 20 20 20 20 20 20 74 72 79  ers..        try
d160: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
d170: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
d180: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20  teNonQuery();.. 
d190: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
d1a0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 45 78  ew Exception("Ex
d1b0: 65 63 75 74 65 64 20 77 69 74 68 20 61 20 6d 69  ecuted with a mi
d1c0: 73 73 69 6e 67 20 70 61 72 61 6d 65 74 65 72 22  ssing parameter"
d1d0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
d1e0: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78         catch (Ex
d1f0: 63 65 70 74 69 6f 6e 29 20 2f 2f 20 45 78 70 65  ception) // Expe
d200: 63 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7b 0d  cted..        {.
d210: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
d220: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
d230: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
d240: 0a 20 20 20 20 2f 2f 2f 20 43 61 6c 6c 20 50 72  .    /// Call Pr
d250: 65 70 61 72 65 28 29 20 6f 6e 20 61 20 6d 75 6c  epare() on a mul
d260: 74 69 2d 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  ti-statement com
d270: 6d 61 6e 64 20 74 65 78 74 20 77 68 65 72 65 20  mand text where 
d280: 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61  the second comma
d290: 6e 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  nd depends on th
d2a0: 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 74  e existence of t
d2b0: 68 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 2f  he first...    /
d2c0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
d2d0: 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69     [Test]..    i
d2e0: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 50 72 65  nternal void Pre
d2f0: 70 61 72 65 54 65 73 74 28 29 0d 0a 20 20 20 20  pareTest()..    
d300: 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  {..      using (
d310: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
d320: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
d330: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
d340: 20 20 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c          droptabl
d350: 65 73 2e 41 64 64 28 22 6e 6f 6e 65 78 69 73 74  es.Add("nonexist
d360: 65 6e 74 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ent");..        
d370: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
d380: 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  = "CREATE TABLE 
d390: 6e 6f 6e 65 78 69 73 74 65 6e 74 28 69 64 20 69  nonexistent(id i
d3a0: 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79 29 3b  nt primary key);
d3b0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 6e  SELECT id FROM n
d3c0: 6f 6e 65 78 69 73 74 65 6e 74 20 55 4e 49 4f 4e  onexistent UNION
d3d0: 20 53 45 4c 45 43 54 20 31 22 3b 0d 0a 20 20 20   SELECT 1";..   
d3e0: 20 20 20 20 20 63 6d 64 2e 50 72 65 70 61 72 65       cmd.Prepare
d3f0: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  ();..        obj
d400: 65 63 74 20 6f 62 20 3d 20 63 6d 64 2e 45 78 65  ect ob = cmd.Exe
d410: 63 75 74 65 53 63 61 6c 61 72 28 29 3b 0d 0a 0d  cuteScalar();...
d420: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6f 62 20  .        if (ob 
d430: 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 6f 62 20 3d 3d  == null || ob ==
d440: 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 29 20 74   DBNull.Value) t
d450: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
d460: 6f 6e 28 22 4d 75 6c 74 69 70 6c 65 20 73 74 61  on("Multiple sta
d470: 74 65 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  tements may not 
d480: 62 65 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0d  be supported");.
d490: 0a 20 20 20 20 20 20 20 20 69 66 20 28 43 6f 6e  .        if (Con
d4a0: 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 6f 62 29  vert.ToInt32(ob)
d4b0: 20 21 3d 20 31 29 20 74 68 72 6f 77 20 6e 65 77   != 1) throw new
d4c0: 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
d4d0: 67 2e 46 6f 72 6d 61 74 28 22 45 78 70 65 63 74  g.Format("Expect
d4e0: 65 64 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22 2c  ed {0} got {1}",
d4f0: 20 31 2c 20 6f 62 29 29 3b 0d 0a 20 20 20 20 20   1, ob));..     
d500: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
d510: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
d520: 20 20 20 20 2f 2f 2f 20 43 68 65 63 6b 73 20 74      /// Checks t
d530: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 72 61 6e  o make sure tran
d540: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 72 6f 6c  sactions are rol
d550: 6c 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20  led back before 
d560: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 67 6f 65  a connection goe
d570: 73 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20  s back onto the 
d580: 70 6f 6f 6c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  pool..    /// </
d590: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54  summary>..    [T
d5a0: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
d5b0: 61 6c 20 76 6f 69 64 20 50 6f 6f 6c 69 6e 67 57  al void PoolingW
d5c0: 69 74 68 53 74 65 61 6c 74 68 54 72 61 6e 73 61  ithStealthTransa
d5d0: 63 74 69 6f 6e 54 65 73 74 28 29 0d 0a 20 20 20  ctionTest()..   
d5e0: 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74   {..      object
d5f0: 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 69   value;..      i
d600: 66 20 28 5f 63 6e 6e 73 74 72 69 6e 67 2e 54 72  f (_cnnstring.Tr
d610: 79 47 65 74 56 61 6c 75 65 28 22 50 6f 6f 6c 69  yGetValue("Pooli
d620: 6e 67 22 2c 20 6f 75 74 20 76 61 6c 75 65 29 20  ng", out value) 
d630: 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20  == false) throw 
d640: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 50  new Exception("P
d650: 6f 6f 6c 69 6e 67 20 6e 6f 74 20 70 72 65 73 65  ooling not prese
d660: 6e 74 20 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  nt in connection
d670: 20 73 74 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20   string");..    
d680: 20 20 69 66 20 28 28 62 6f 6f 6c 29 76 61 6c 75    if ((bool)valu
d690: 65 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f  e == false) thro
d6a0: 77 20 6e 65 77 20 49 6e 63 6f 6e 63 6c 75 73 69  w new Inconclusi
d6b0: 76 65 45 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f  veException("Poo
d6c0: 6c 69 6e 67 20 6e 6f 74 20 65 6e 61 62 6c 65 64  ling not enabled
d6d0: 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   in the connecti
d6e0: 6f 6e 20 73 74 72 69 6e 67 22 29 3b 0d 0a 0d 0a  on string");....
d6f0: 20 20 20 20 20 20 6d 61 79 64 72 6f 70 74 61 62        maydroptab
d700: 6c 65 2e 41 64 64 28 22 50 6f 6f 6c 54 65 73 74  le.Add("PoolTest
d710: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  ");....      for
d720: 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c   (int n = 0; n <
d730: 20 31 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20   100; n++)..    
d740: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 73 69    {..        usi
d750: 6e 67 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  ng (DbConnection
d760: 20 6e 65 77 63 6e 6e 20 3d 20 28 28 49 43 6c 6f   newcnn = ((IClo
d770: 6e 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f  neable)_cnn).Clo
d780: 6e 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63  ne() as DbConnec
d790: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b  tion)..        {
d7a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
d7b0: 6e 65 77 63 6e 6e 2e 53 74 61 74 65 20 21 3d 20  newcnn.State != 
d7c0: 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e  ConnectionState.
d7d0: 4f 70 65 6e 29 20 6e 65 77 63 6e 6e 2e 4f 70 65  Open) newcnn.Ope
d7e0: 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n();..          
d7f0: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
d800: 20 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e 43 72   cmd = newcnn.Cr
d810: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
d820: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
d830: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d           cmd.Com
d840: 6d 61 6e 64 54 65 78 74 20 3d 20 22 42 45 47 49  mandText = "BEGI
d850: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 0d  N TRANSACTION";.
d860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
d870: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
d880: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
d890: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
d8a0: 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41 42  xt = "CREATE TAB
d8b0: 4c 45 20 50 6f 6f 6c 54 65 73 74 28 49 44 20 69  LE PoolTest(ID i
d8c0: 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79 29 22  nt primary key)"
d8d0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ;..            c
d8e0: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
d8f0: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
d900: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
d910: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
d920: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
d930: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 68 65 63  y>..    /// Chec
d940: 6b 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ks to make sure 
d950: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
d960: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 65 66   rolled back bef
d970: 6f 72 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ore a connection
d980: 20 67 6f 65 73 20 62 61 63 6b 20 6f 6e 74 6f 20   goes back onto 
d990: 74 68 65 20 70 6f 6f 6c 0d 0a 20 20 20 20 2f 2f  the pool..    //
d9a0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
d9b0: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
d9c0: 74 65 72 6e 61 6c 20 76 6f 69 64 20 50 6f 6f 6c  ternal void Pool
d9d0: 69 6e 67 57 69 74 68 54 72 61 6e 73 61 63 74 69  ingWithTransacti
d9e0: 6f 6e 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  onTest()..    {.
d9f0: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61  .      object va
da00: 6c 75 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  lue;..      if (
da10: 5f 63 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47 65  _cnnstring.TryGe
da20: 74 56 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67 22  tValue("Pooling"
da30: 2c 20 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d 20  , out value) == 
da40: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
da50: 20 45 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c   Exception("Pool
da60: 69 6e 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20  ing not present 
da70: 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  in connection st
da80: 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 69  ring");..      i
da90: 66 20 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20 3d  f ((bool)value =
daa0: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
dab0: 65 77 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45  ew InconclusiveE
dac0: 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e  xception("Poolin
dad0: 67 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69 6e  g not enabled in
dae0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
daf0: 73 74 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20 20  string");....   
db00: 20 20 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e     maydroptable.
db10: 41 64 64 28 22 50 6f 6f 6c 54 65 73 74 22 29 3b  Add("PoolTest");
db20: 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74  ..      for (int
db30: 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30 30 3b   n = 0; n < 100;
db40: 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a   n++)..      {..
db50: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
db60: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63  bConnection newc
db70: 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c  nn = ((ICloneabl
db80: 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20  e)_cnn).Clone() 
db90: 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29  as DbConnection)
dba0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
dbb0: 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e         if (newcn
dbc0: 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65  n.State != Conne
dbd0: 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29  ctionState.Open)
dbe0: 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d   newcnn.Open();.
dbf0: 0a 20 20 20 20 20 20 20 20 20 20 44 62 54 72 61  .          DbTra
dc00: 6e 73 61 63 74 69 6f 6e 20 74 72 61 6e 73 20 3d  nsaction trans =
dc10: 20 6e 65 77 63 6e 6e 2e 42 65 67 69 6e 54 72 61   newcnn.BeginTra
dc20: 6e 73 61 63 74 69 6f 6e 28 29 3b 0d 0a 20 20 20  nsaction();..   
dc30: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
dc40: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65  Command cmd = ne
dc50: 77 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  wcnn.CreateComma
dc60: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  nd())..         
dc70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
dc80: 63 6d 64 2e 54 72 61 6e 73 61 63 74 69 6f 6e 20  cmd.Transaction 
dc90: 3d 20 74 72 61 6e 73 3b 0d 0a 20 20 20 20 20 20  = trans;..      
dca0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
dcb0: 64 54 65 78 74 20 3d 20 22 43 52 45 41 54 45 20  dText = "CREATE 
dcc0: 54 41 42 4c 45 20 50 6f 6f 6c 54 65 73 74 28 49  TABLE PoolTest(I
dcd0: 44 20 69 6e 74 20 70 72 69 6d 61 72 79 20 6b 65  D int primary ke
dce0: 79 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  y)";..          
dcf0: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
dd00: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
dd10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
dd20: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
dd30: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
dd40: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43  mary>..    /// C
dd50: 68 65 63 6b 73 20 74 6f 20 6d 61 6b 65 20 73 75  hecks to make su
dd60: 72 65 20 77 65 20 63 61 6e 20 6f 70 65 6e 20 44  re we can open D
dd70: 42 20 72 65 61 64 20 6f 6e 6c 79 2e 0d 0a 20 20  B read only...  
dd80: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
dd90: 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20  ..    [Test]..  
dda0: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
ddb0: 52 65 61 64 4f 6e 6c 79 54 65 73 74 28 29 0d 0a  ReadOnlyTest()..
ddc0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 73 74 72      {..      str
ddd0: 69 6e 67 20 52 4f 5f 63 6f 6e 6e 65 63 74 69 6f  ing RO_connectio
dde0: 6e 53 74 72 69 6e 67 20 3d 20 5f 63 6e 6e 73 74  nString = _cnnst
ddf0: 72 69 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53  ring.ConnectionS
de00: 74 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20 6f 62  tring;..      ob
de10: 6a 65 63 74 20 76 61 6c 75 65 3b 0d 0a 20 20 20  ject value;..   
de20: 20 20 20 69 66 20 28 5f 63 6e 6e 73 74 72 69 6e     if (_cnnstrin
de30: 67 2e 54 72 79 47 65 74 56 61 6c 75 65 28 22 52  g.TryGetValue("R
de40: 65 61 64 20 4f 6e 6c 79 22 2c 20 6f 75 74 20 76  ead Only", out v
de50: 61 6c 75 65 29 20 3d 3d 20 66 61 6c 73 65 29 0d  alue) == false).
de60: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
de70: 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65    throw new Exce
de80: 70 74 69 6f 6e 28 22 52 65 61 64 20 4f 6e 6c 79  ption("Read Only
de90: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   not supported b
dea0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  y connection str
deb0: 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ing");..      }.
dec0: 0a 20 20 20 20 20 20 69 66 20 28 28 62 6f 6f 6c  .      if ((bool
ded0: 29 76 61 6c 75 65 20 3d 3d 20 66 61 6c 73 65 29  )value == false)
dee0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
def0: 20 20 20 2f 2f 20 22 52 65 61 64 20 4f 6e 6c 79     // "Read Only
df00: 22 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  " not present in
df10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
df20: 6e 67 20 2d 20 61 64 64 20 69 74 0d 0a 20 20 20  ng - add it..   
df30: 20 20 20 20 20 52 4f 5f 63 6f 6e 6e 65 63 74 69       RO_connecti
df40: 6f 6e 53 74 72 69 6e 67 20 2b 3d 20 22 3b 52 65  onString += ";Re
df50: 61 64 20 4f 6e 6c 79 3d 74 72 75 65 22 3b 0d 0a  ad Only=true";..
df60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
df70: 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64   maydroptable.Ad
df80: 64 28 22 52 65 61 64 4f 6e 6c 79 54 65 73 74 22  d("ReadOnlyTest"
df90: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e  );....      usin
dfa0: 67 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  g (DbConnection 
dfb0: 6e 65 77 63 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e  newcnn = ((IClon
dfc0: 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e  eable)_cnn).Clon
dfd0: 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74  e() as DbConnect
dfe0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ion)..      {.. 
dff0: 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e         if (newcn
e000: 6e 2e 53 74 61 74 65 20 3d 3d 20 43 6f 6e 6e 65  n.State == Conne
e010: 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29  ctionState.Open)
e020: 20 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20   ..        {..  
e030: 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e 43          newcnn.C
e040: 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  lose();..       
e050: 20 7d 0d 0a 20 20 20 20 20 20 20 20 6e 65 77 63   }..        newc
e060: 6e 6e 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72  nn.ConnectionStr
e070: 69 6e 67 20 3d 20 52 4f 5f 63 6f 6e 6e 65 63 74  ing = RO_connect
e080: 69 6f 6e 53 74 72 69 6e 67 3b 0d 0a 20 20 20 20  ionString;..    
e090: 20 20 20 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28      newcnn.Open(
e0a0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 6e 65 77 63  );..        newc
e0b0: 6e 6e 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20  nn.Dispose();.. 
e0c0: 20 20 20 20 20 7d 20 0d 0a 20 20 20 20 7d 0d 0a       } ..    }..
e0d0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
e0e0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 68 65  ry>..    /// Che
e0f0: 63 6b 73 20 74 6f 20 65 78 74 65 6e 64 65 64 20  cks to extended 
e100: 65 72 72 6f 72 20 63 6f 64 65 20 72 65 73 75 6c  error code resul
e110: 74 20 73 75 70 70 6f 72 74 2e 0d 0a 20 20 20 20  t support...    
e120: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
e130: 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20      [Test]..    
e140: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 45 78  internal void Ex
e150: 74 65 6e 64 65 64 52 65 73 75 6c 74 43 6f 64 65  tendedResultCode
e160: 73 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a  sTest()..    {..
e170: 20 20 20 20 20 20 69 66 20 28 5f 66 61 63 74 2e        if (_fact.
e180: 47 65 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e 49  GetType().Name.I
e190: 6e 64 65 78 4f 66 28 22 53 51 4c 69 74 65 22 2c  ndexOf("SQLite",
e1a0: 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f   StringCompariso
e1b0: 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43  n.OrdinalIgnoreC
e1c0: 61 73 65 29 20 3e 20 2d 31 29 0d 0a 20 20 20 20  ase) > -1)..    
e1d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 51 4c    {..        SQL
e1e0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e  iteConnection cn
e1f0: 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f  n = new SQLiteCo
e200: 6e 6e 65 63 74 69 6f 6e 28 5f 63 6e 6e 73 74 72  nnection(_cnnstr
e210: 69 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74  ing.ConnectionSt
e220: 72 69 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ring);....      
e230: 20 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d    cnn.Open();...
e240: 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 75 72 6e  .        // Turn
e250: 20 6f 6e 20 65 78 74 65 6e 64 65 64 20 72 65 73   on extended res
e260: 75 6c 74 20 63 6f 64 65 73 0d 0a 20 20 20 20 20  ult codes..     
e270: 20 20 20 63 6e 6e 2e 53 65 74 45 78 74 65 6e 64     cnn.SetExtend
e280: 65 64 52 65 73 75 6c 74 43 6f 64 65 73 28 74 72  edResultCodes(tr
e290: 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ue);....        
e2a0: 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20  SQLiteErrorCode 
e2b0: 72 63 20 3d 20 63 6e 6e 2e 52 65 73 75 6c 74 43  rc = cnn.ResultC
e2c0: 6f 64 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ode();..        
e2d0: 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 20  SQLiteErrorCode 
e2e0: 78 72 63 20 3d 20 63 6e 6e 2e 45 78 74 65 6e 64  xrc = cnn.Extend
e2f0: 65 64 52 65 73 75 6c 74 43 6f 64 65 28 29 3b 0d  edResultCode();.
e300: 0a 0d 0a 20 20 20 20 20 20 20 20 63 6e 6e 2e 43  ...        cnn.C
e310: 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 7d  lose();..      }
e320: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 23 69 66 20 21  ..    }....#if !
e330: 49 4e 54 45 52 4f 50 5f 4c 4f 47 0d 0a 20 20 20  INTEROP_LOG..   
e340: 20 2f 2f 4c 6f 67 67 69 6e 67 20 45 76 65 6e 74   //Logging Event
e350: 48 61 6e 64 6c 65 72 0d 0a 20 20 20 20 70 75 62  Handler..    pub
e360: 6c 69 63 20 76 6f 69 64 20 4f 6e 4c 6f 67 45 76  lic void OnLogEv
e370: 65 6e 74 28 6f 62 6a 65 63 74 20 73 65 6e 64 65  ent(object sende
e380: 72 2c 20 4c 6f 67 45 76 65 6e 74 41 72 67 73 20  r, LogEventArgs 
e390: 6c 6f 67 45 76 65 6e 74 29 0d 0a 20 20 20 20 7b  logEvent)..    {
e3a0: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
e3b0: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 6c 6f 67   errorCode = log
e3c0: 45 76 65 6e 74 2e 45 72 72 6f 72 43 6f 64 65 3b  Event.ErrorCode;
e3d0: 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ..        string
e3e0: 20 65 72 72 5f 6d 73 67 20 3d 20 6c 6f 67 45 76   err_msg = logEv
e3f0: 65 6e 74 2e 4d 65 73 73 61 67 65 3b 0d 0a 20 20  ent.Message;..  
e400: 20 20 20 20 20 20 6c 6f 67 65 76 65 6e 74 73 2b        logevents+
e410: 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  +;..    }....   
e420: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
e430: 20 20 20 20 2f 2f 2f 20 54 65 73 74 73 20 53 51      /// Tests SQ
e440: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 20  LITE_CONFIG_LOG 
e450: 73 75 70 70 6f 72 74 2e 0d 0a 20 20 20 20 2f 2f  support...    //
e460: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
e470: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
e480: 74 65 72 6e 61 6c 20 76 6f 69 64 20 53 65 74 4c  ternal void SetL
e490: 6f 67 43 61 6c 6c 62 61 63 6b 54 65 73 74 28 29  ogCallbackTest()
e4a0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
e4b0: 20 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79   if (_fact.GetTy
e4c0: 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f  pe().Name.IndexO
e4d0: 66 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69  f("SQLite", Stri
e4e0: 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64  ngComparison.Ord
e4f0: 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20  inalIgnoreCase) 
e500: 3e 20 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 7b  > -1)..        {
e510: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ..            SQ
e520: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  LiteConnection c
e530: 6e 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43  nn = new SQLiteC
e540: 6f 6e 6e 65 63 74 69 6f 6e 28 5f 63 6e 6e 73 74  onnection(_cnnst
e550: 72 69 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53  ring.ConnectionS
e560: 74 72 69 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20  tring);....     
e570: 20 20 20 20 20 20 20 2f 2f 20 63 72 65 61 74 65         // create
e580: 20 61 6e 64 20 61 64 64 20 61 20 6c 6f 67 20 65   and add a log e
e590: 76 65 6e 74 20 68 61 6e 64 6c 65 72 0d 0a 20 20  vent handler..  
e5a0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
e5b0: 4c 6f 67 45 76 65 6e 74 48 61 6e 64 6c 65 72 20  LogEventHandler 
e5c0: 6c 6f 67 48 61 6e 64 6c 65 72 20 3d 20 6e 65 77  logHandler = new
e5d0: 20 53 51 4c 69 74 65 4c 6f 67 45 76 65 6e 74 48   SQLiteLogEventH
e5e0: 61 6e 64 6c 65 72 28 4f 6e 4c 6f 67 45 76 65 6e  andler(OnLogEven
e5f0: 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
e600: 20 53 51 4c 69 74 65 46 61 63 74 6f 72 79 20 73   SQLiteFactory s
e610: 71 6c 69 74 65 5f 66 61 63 74 20 3d 20 28 53 51  qlite_fact = (SQ
e620: 4c 69 74 65 46 61 63 74 6f 72 79 29 5f 66 61 63  LiteFactory)_fac
e630: 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t;....          
e640: 20 20 73 71 6c 69 74 65 5f 66 61 63 74 2e 4c 6f    sqlite_fact.Lo
e650: 67 20 2b 3d 20 6c 6f 67 48 61 6e 64 6c 65 72 3b  g += logHandler;
e660: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e670: 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  cnn.Open();.... 
e680: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 65 76             logev
e690: 65 6e 74 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20  ents = 0;....   
e6a0: 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 4c 6f 67           cnn.Log
e6b0: 4d 65 73 73 61 67 65 28 53 51 4c 69 74 65 45 72  Message(SQLiteEr
e6c0: 72 6f 72 43 6f 64 65 2e 45 72 72 6f 72 2c 20 22  rorCode.Error, "
e6d0: 74 65 73 74 20 6c 6f 67 20 65 76 65 6e 74 22 29  test log event")
e6e0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
e6f0: 20 69 66 20 28 6c 6f 67 65 76 65 6e 74 73 20 21   if (logevents !
e700: 3d 20 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20  = 1)..          
e710: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
e720: 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
e730: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
e750: 6f 67 20 65 76 65 6e 74 20 63 6f 75 6e 74 20 7b  og event count {
e760: 30 7d 20 69 6e 63 6f 72 72 65 63 74 2e 22 2c 20  0} incorrect.", 
e770: 6c 6f 67 65 76 65 6e 74 73 29 29 3b 0d 0a 0d 0a  logevents));....
e780: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e              cnn.
e790: 43 6c 6f 73 65 28 29 3b 0d 0a 0d 0a 20 20 20 20  Close();....    
e7a0: 20 20 20 20 20 20 20 20 2f 2f 20 72 65 6d 6f 76          // remov
e7b0: 65 20 74 68 65 20 6c 6f 67 20 68 61 6e 64 6c 65  e the log handle
e7c0: 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e  r before the con
e7d0: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  nection is close
e7e0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
e7f0: 73 71 6c 69 74 65 5f 66 61 63 74 2e 4c 6f 67 20  sqlite_fact.Log 
e800: 2d 3d 20 6c 6f 67 48 61 6e 64 6c 65 72 3b 0d 0a  -= logHandler;..
e810: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
e820: 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20   }..#endif....  
e830: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
e840: 0a 20 20 20 20 2f 2f 2f 20 4f 70 65 6e 20 61 20  .    /// Open a 
e850: 72 65 61 64 65 72 20 61 6e 64 20 74 68 65 6e 20  reader and then 
e860: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
e870: 20 74 6f 20 74 65 73 74 20 74 68 65 20 77 72 69   to test the wri
e880: 74 65 72 27 73 20 63 6f 6d 6d 61 6e 64 20 74 69  ter's command ti
e890: 6d 65 6f 75 74 20 70 72 6f 70 65 72 74 79 0d 0a  meout property..
e8a0: 20 20 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20 64      /// SQLite d
e8b0: 6f 65 73 6e 27 74 20 61 6c 6c 6f 77 20 61 20 77  oesn't allow a w
e8c0: 72 69 74 65 20 77 68 65 6e 20 61 20 72 65 61 64  rite when a read
e8d0: 65 72 20 69 73 20 61 63 74 69 76 65 2e 0d 0a 20  er is active... 
e8e0: 20 20 20 2f 2f 2f 20 2a 2a 2a 20 4e 4f 54 45 20     /// *** NOTE 
e8f0: 41 53 20 4f 46 20 33 2e 33 2e 38 20 74 68 69 73  AS OF 3.3.8 this
e900: 20 74 65 73 74 20 6e 6f 20 6c 6f 6e 67 65 72 20   test no longer 
e910: 62 6c 6f 63 6b 73 20 62 65 63 61 75 73 65 20 53  blocks because S
e920: 51 4c 69 74 65 20 6e 6f 77 20 61 6c 6c 6f 77 73  QLite now allows
e930: 20 79 6f 75 20 74 6f 20 75 70 64 61 74 65 20 74   you to update t
e940: 61 62 6c 65 28 73 29 0d 0a 20 20 20 20 2f 2f 2f  able(s)..    ///
e950: 20 77 68 69 6c 65 20 61 20 72 65 61 64 65 72 20   while a reader 
e960: 69 73 20 61 63 74 69 76 65 20 6f 6e 20 74 68 65  is active on the
e970: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
e980: 2e 20 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  .  Therefore the
e990: 20 74 69 6d 65 6f 75 74 20 74 65 73 74 20 69 73   timeout test is
e9a0: 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 2f 2f   invalid..    //
e9b0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
e9c0: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
e9d0: 54 69 6d 65 6f 75 74 54 65 73 74 28 29 0d 0a 20  TimeoutTest().. 
e9e0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63     {..      Chec
e9f0: 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 0d 0a 20 20  kSQLite();....  
ea00: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
ea10: 6d 61 6e 64 20 63 6d 64 52 65 61 64 20 3d 20 5f  mand cmdRead = _
ea20: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
ea30: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
ea40: 20 20 20 20 20 20 20 63 6d 64 52 65 61 64 2e 43         cmdRead.C
ea50: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
ea60: 4c 45 43 54 20 49 44 20 46 52 4f 4d 20 54 65 73  LECT ID FROM Tes
ea70: 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20 20 20  tCase";..       
ea80: 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65   using (DbDataRe
ea90: 61 64 65 72 20 72 64 20 3d 20 63 6d 64 52 65 61  ader rd = cmdRea
eaa0: 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
eab0: 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ))..        {.. 
eac0: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
ead0: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 77 72 69  DbCommand cmdwri
eae0: 74 65 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  te = _cnn.Create
eaf0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
eb00: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
eb10: 20 20 20 20 20 63 6d 64 77 72 69 74 65 2e 43 6f       cmdwrite.Co
eb20: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 55 50 44  mmandText = "UPD
eb30: 41 54 45 20 5b 4b 65 79 49 6e 66 6f 54 65 73 74  ATE [KeyInfoTest
eb40: 5d 20 53 45 54 20 5b 49 44 5d 20 3d 20 5b 49 44  ] SET [ID] = [ID
eb50: 5d 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]";..           
eb60: 20 63 6d 64 77 72 69 74 65 2e 43 6f 6d 6d 61 6e   cmdwrite.Comman
eb70: 64 54 69 6d 65 6f 75 74 20 3d 20 35 3b 0d 0a 0d  dTimeout = 5;...
eb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
eb90: 20 64 77 74 69 63 6b 20 3d 20 45 6e 76 69 72 6f   dwtick = Enviro
eba0: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
ebb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
ebc0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  y..            {
ebd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ebe0: 63 6d 64 77 72 69 74 65 2e 45 78 65 63 75 74 65  cmdwrite.Execute
ebf0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
ec00: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ec10: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
ec20: 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20  xception)..     
ec30: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
ec40: 20 20 20 20 20 20 20 20 64 77 74 69 63 6b 20 3d          dwtick =
ec50: 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69   (Environment.Ti
ec60: 63 6b 43 6f 75 6e 74 20 2d 20 64 77 74 69 63 6b  ckCount - dwtick
ec70: 29 20 2f 20 31 30 30 30 3b 0d 0a 20 20 20 20 20  ) / 1000;..     
ec80: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 77 74           if (dwt
ec90: 69 63 6b 20 3c 20 35 20 7c 7c 20 64 77 74 69 63  ick < 5 || dwtic
eca0: 6b 20 3e 20 36 29 0d 0a 20 20 20 20 20 20 20 20  k > 6)..        
ecb0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
ecc0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 54 69 6d  w Exception("Tim
ecd0: 65 6f 75 74 20 64 69 64 6e 27 74 20 77 61 69 74  eout didn't wait
ece0: 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 21 22 29 3b   long enough!");
ecf0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ed00: 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20    return;..     
ed10: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ed20: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
ed30: 45 78 63 65 70 74 69 6f 6e 28 22 4f 70 65 72 61  Exception("Opera
ed40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65  tion should have
ed50: 20 66 61 69 6c 65 64 20 62 75 74 20 63 6f 6d 70   failed but comp
ed60: 6c 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  leted successful
ed70: 6c 79 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ly");..         
ed80: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
ed90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
eda0: 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65  .    [Test(Seque
edb0: 6e 63 65 20 3d 20 34 31 29 5d 0d 0a 20 20 20 20  nce = 41)]..    
edc0: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 54 72  internal void Tr
edd0: 61 6e 73 61 63 74 69 6f 6e 53 63 6f 70 65 54 65  ansactionScopeTe
ede0: 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  st()..    {..   
edf0: 20 20 20 75 73 69 6e 67 20 28 54 72 61 6e 73 61     using (Transa
ee00: 63 74 69 6f 6e 53 63 6f 70 65 20 73 63 6f 70 65  ctionScope scope
ee10: 20 3d 20 6e 65 77 20 54 72 61 6e 73 61 63 74 69   = new Transacti
ee20: 6f 6e 53 63 6f 70 65 28 29 29 0d 0a 20 20 20 20  onScope())..    
ee30: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 73 69    {..        usi
ee40: 6e 67 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  ng (DbConnection
ee50: 20 63 6e 6e 32 20 3d 20 28 28 49 43 6c 6f 6e 65   cnn2 = ((IClone
ee60: 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65  able)_cnn).Clone
ee70: 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69  () as DbConnecti
ee80: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  on)..        {..
ee90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6e            if (cn
eea0: 6e 32 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e  n2.State != Conn
eeb0: 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e  ectionState.Open
eec0: 29 20 63 6e 6e 32 2e 4f 70 65 6e 28 29 3b 0d 0a  ) cnn2.Open();..
eed0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
eee0: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
eef0: 20 63 6e 6e 32 2e 43 72 65 61 74 65 43 6f 6d 6d   cnn2.CreateComm
ef00: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20  and())..        
ef10: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
ef20: 20 2f 2f 20 43 72 65 61 74 65 64 20 61 20 74 61   // Created a ta
ef30: 62 6c 65 20 69 6e 73 69 64 65 20 74 68 65 20 74  ble inside the t
ef40: 72 61 6e 73 61 63 74 69 6f 6e 20 73 63 6f 70 65  ransaction scope
ef50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
ef60: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
ef70: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 56 6f  "CREATE TABLE Vo
ef80: 6c 61 74 69 6c 65 54 61 62 6c 65 20 28 49 44 20  latileTable (ID 
ef90: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
efa0: 4b 45 59 2c 20 4d 79 56 61 6c 75 65 20 56 41 52  KEY, MyValue VAR
efb0: 43 48 41 52 28 35 30 29 29 22 3b 0d 0a 20 20 20  CHAR(50))";..   
efc0: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
efd0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
efe0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ...            m
eff0: 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64 64 28  aydroptable.Add(
f000: 22 56 6f 6c 61 74 69 6c 65 54 61 62 6c 65 22 29  "VolatileTable")
f010: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
f020: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
f030: 64 20 63 6d 64 32 20 3d 20 63 6e 6e 32 2e 43 72  d cmd2 = cnn2.Cr
f040: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
f050: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
f070: 6e 67 20 28 63 6d 64 32 2e 54 72 61 6e 73 61 63  ng (cmd2.Transac
f080: 74 69 6f 6e 20 3d 20 63 6e 6e 32 2e 42 65 67 69  tion = cnn2.Begi
f090: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 0d  nTransaction()).
f0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
f0b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f0c0: 20 20 2f 2f 20 49 6e 73 65 72 74 69 6e 67 20 61    // Inserting a
f0d0: 20 76 61 6c 75 65 20 69 6e 73 69 64 65 20 74 68   value inside th
f0e0: 65 20 74 61 62 6c 65 2c 20 69 6e 73 69 64 65 20  e table, inside 
f0f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68  a transaction wh
f100: 69 63 68 20 69 73 20 69 6e 73 69 64 65 20 74 68  ich is inside th
f110: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 63  e transaction sc
f120: 6f 70 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ope..           
f130: 20 20 20 20 20 63 6d 64 32 2e 43 6f 6d 6d 61 6e       cmd2.Comman
f140: 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20  dText = "INSERT 
f150: 49 4e 54 4f 20 56 6f 6c 61 74 69 6c 65 54 61 62  INTO VolatileTab
f160: 6c 65 20 28 49 44 2c 20 4d 79 56 61 6c 75 65 29  le (ID, MyValue)
f170: 20 56 41 4c 55 45 53 28 31 2c 20 27 48 65 6c 6c   VALUES(1, 'Hell
f180: 6f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  o')";..         
f190: 20 20 20 20 20 20 20 63 6d 64 32 2e 45 78 65 63         cmd2.Exec
f1a0: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 63 6d 64 32 2e 54 72 61 6e 73 61 63 74 69 6f 6e  cmd2.Transaction
f1d0: 2e 43 6f 6d 6d 69 74 28 29 3b 0d 0a 20 20 20 20  .Commit();..    
f1e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f1f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f200: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
f210: 20 20 20 2f 2f 20 43 6f 6e 6e 65 63 74 69 6f 6e     // Connection
f220: 20 69 73 20 64 69 73 70 6f 73 65 64 20 62 65 66   is disposed bef
f230: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
f240: 69 6f 6e 73 63 6f 70 65 20 6c 65 61 76 65 73 2c  ionscope leaves,
f250: 20 74 68 65 72 65 62 79 20 66 6f 72 63 69 6e 67   thereby forcing
f260: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f270: 74 6f 20 73 74 61 79 20 6f 70 65 6e 0d 0a 20 20  to stay open..  
f280: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
f290: 20 2f 2f 20 45 78 69 74 20 74 68 65 20 74 72 61   // Exit the tra
f2a0: 6e 73 61 63 74 69 6f 6e 73 63 6f 70 65 20 77 69  nsactionscope wi
f2b0: 74 68 6f 75 74 20 63 6f 6d 6d 69 74 74 69 6e 67  thout committing
f2c0: 20 69 74 2c 20 63 61 75 73 69 6e 67 20 61 20 72   it, causing a r
f2d0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 62 6f 74 68 20  ollback of both 
f2e0: 74 68 65 20 63 72 65 61 74 65 20 74 61 62 6c 65  the create table
f2f0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 0d   and the insert.
f300: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f310: 20 20 2f 2f 20 56 65 72 69 66 79 20 74 68 61 74    // Verify that
f320: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
f330: 6e 6f 74 20 65 78 69 73 74 0d 0a 20 20 20 20 20  not exist..     
f340: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
f350: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
f360: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
f370: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
f380: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
f390: 3d 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28  = "SELECT COUNT(
f3a0: 2a 29 20 46 52 4f 4d 20 56 6f 6c 61 74 69 6c 65  *) FROM Volatile
f3b0: 54 61 62 6c 65 22 3b 0d 0a 20 20 20 20 20 20 20  Table";..       
f3c0: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d   try..        {.
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
f3e0: 74 20 6f 20 3d 20 63 6d 64 2e 45 78 65 63 75 74  t o = cmd.Execut
f3f0: 65 53 63 61 6c 61 72 28 29 3b 0d 0a 20 20 20 20  eScalar();..    
f400: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
f410: 64 54 65 78 74 20 3d 20 22 44 52 4f 50 20 54 41  dText = "DROP TA
f420: 42 4c 45 20 56 6f 6c 61 74 69 6c 65 54 61 62 6c  BLE VolatileTabl
f430: 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  e";..          c
f440: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
f450: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
f460: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
f470: 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  idOperationExcep
f480: 74 69 6f 6e 28 22 54 72 61 6e 73 61 63 74 69 6f  tion("Transactio
f490: 6e 20 66 61 69 6c 65 64 21 20 54 68 65 20 74 61  n failed! The ta
f4a0: 62 6c 65 20 65 78 69 73 74 73 21 22 29 3b 0d 0a  ble exists!");..
f4b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f4c0: 20 20 20 63 61 74 63 68 28 45 78 63 65 70 74 69     catch(Excepti
f4d0: 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 7b  on e)..        {
f4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
f4f0: 65 20 69 73 20 49 6e 76 61 6c 69 64 4f 70 65 72  e is InvalidOper
f500: 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 29 20  ationException) 
f510: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
f520: 69 6f 6e 28 65 2e 4d 65 73 73 61 67 65 29 3b 0d  ion(e.Message);.
f530: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f540: 6e 3b 20 2f 2f 20 53 75 63 63 65 65 64 65 64 2c  n; // Succeeded,
f550: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
f560: 64 20 6e 6f 74 20 68 61 76 65 20 65 78 69 73 74  d not have exist
f570: 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ed..        }.. 
f580: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
f590: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
f5a0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 61 75 73  y>..    /// Caus
f5b0: 65 73 20 74 68 65 20 75 73 65 72 2d 64 65 66 69  es the user-defi
f5c0: 6e 65 64 20 61 67 67 72 65 67 61 74 65 20 74 6f  ned aggregate to
f5d0: 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68 72   be iterated thr
f5e0: 6f 75 67 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ough..    /// </
f5f0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
f600: 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74  / <returns></ret
f610: 75 72 6e 73 3e 0d 0a 20 20 20 20 5b 54 65 73 74  urns>..    [Test
f620: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
f630: 73 74 72 69 6e 67 20 55 73 65 72 41 67 67 72 65  string UserAggre
f640: 67 61 74 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  gate()..    {.. 
f650: 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65       CheckSQLite
f660: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 53 74 72  ();....      Str
f670: 69 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c 64  ingBuilder build
f680: 65 72 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42  er = new StringB
f690: 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20  uilder();..     
f6a0: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
f6b0: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
f6c0: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
f6d0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
f6e0: 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 20 20  int dtStart;..  
f6f0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
f700: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ..        int nC
f710: 6f 75 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ount;....       
f720: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
f730: 20 3d 20 22 53 45 4c 45 43 54 20 4d 79 43 6f 75   = "SELECT MyCou
f740: 6e 74 28 2a 29 20 46 52 4f 4d 20 54 65 73 74 43  nt(*) FROM TestC
f750: 61 73 65 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ase";....       
f760: 20 6e 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20   nCount = 0;..  
f770: 20 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20        dtStart = 
f780: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
f790: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
f7a0: 77 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65  while (Environme
f7b0: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64  nt.TickCount - d
f7c0: 74 53 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a  tStart < 1000)..
f7d0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
f7e0: 20 20 20 20 20 6e 20 3d 20 43 6f 6e 76 65 72 74       n = Convert
f7f0: 2e 54 6f 49 6e 74 33 32 28 63 6d 64 2e 45 78 65  .ToInt32(cmd.Exe
f800: 63 75 74 65 53 63 61 6c 61 72 28 29 29 3b 0d 0a  cuteScalar());..
f810: 20 20 20 20 20 20 20 20 20 20 6e 43 6f 75 6e 74            nCount
f820: 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ++;..        }..
f830: 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 21 3d          if (n !=
f840: 20 31 32 30 30 30 33 29 20 74 68 72 6f 77 20 6e   120003) throw n
f850: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 55 6e  ew Exception("Un
f860: 65 78 70 65 63 74 65 64 20 63 6f 75 6e 74 22 29  expected count")
f870: 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64  ;..        build
f880: 65 72 2e 41 70 70 65 6e 64 28 53 74 72 69 6e 67  er.Append(String
f890: 2e 46 6f 72 6d 61 74 28 22 55 73 65 72 41 67 67  .Format("UserAgg
f8a0: 72 65 67 61 74 65 20 65 78 65 63 75 74 65 64 20  regate executed 
f8b0: 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73  {0} times in 1 s
f8c0: 65 63 6f 6e 64 2e 22 2c 20 6e 43 6f 75 6e 74 29  econd.", nCount)
f8d0: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
f8e0: 20 20 20 72 65 74 75 72 6e 20 62 75 69 6c 64 65     return builde
f8f0: 72 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 20  r.ToString();.. 
f900: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
f910: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
f920: 2f 2f 20 43 61 75 73 65 73 20 74 68 65 20 75 73  // Causes the us
f930: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  er-defined colla
f940: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 6f  tion sequence to
f950: 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68 72   be iterated thr
f960: 6f 75 67 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ough..    /// </
f970: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54  summary>..    [T
f980: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
f990: 61 6c 20 76 6f 69 64 20 55 73 65 72 43 6f 6c 6c  al void UserColl
f9a0: 61 74 69 6f 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a  ation()..    {..
f9b0: 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74        CheckSQLit
f9c0: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73  e();....      us
f9d0: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
f9e0: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
f9f0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
fa00: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20    {..        // 
fa10: 55 73 69 6e 67 20 61 20 64 65 66 61 75 6c 74 20  Using a default 
fa20: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fa30: 63 65 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  ce in descending
fa40: 20 6f 72 64 65 72 2c 20 22 50 61 72 61 6d 20 46   order, "Param F
fa50: 69 65 6c 64 33 22 20 77 69 6c 6c 20 61 70 70 65  ield3" will appe
fa60: 61 72 20 61 74 20 74 68 65 20 74 6f 70 0d 0a 20  ar at the top.. 
fa70: 20 20 20 20 20 20 20 2f 2f 20 61 6e 64 20 22 46         // and "F
fa80: 69 65 6c 64 33 22 20 77 69 6c 6c 20 62 65 20 6e  ield3" will be n
fa90: 65 78 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  ext, followed by
faa0: 20 61 20 4e 55 4c 4c 2e 20 20 4f 75 72 20 75 73   a NULL.  Our us
fab0: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  er-defined colla
fac0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69  ting sequence wi
fad0: 6c 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  ll ..        // 
fae0: 64 65 6c 69 62 65 72 61 74 65 6c 79 20 70 6c 61  deliberately pla
faf0: 63 65 20 74 68 65 6d 20 6f 75 74 20 6f 66 20 6f  ce them out of o
fb00: 72 64 65 72 20 73 6f 20 46 69 65 6c 64 33 20 69  rder so Field3 i
fb10: 73 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20  s first...      
fb20: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
fb30: 74 20 3d 20 22 53 45 4c 45 43 54 20 5b 46 69 c3  t = "SELECT [Fi.
fb40: ab 6c 64 33 5d 20 46 52 4f 4d 20 54 65 73 74 43  .ld3] FROM TestC
fb50: 61 73 65 20 4f 52 44 45 52 20 42 59 20 5b 46 69  ase ORDER BY [Fi
fb60: c3 ab 6c 64 33 5d 20 43 4f 4c 4c 41 54 45 20 4d  ..ld3] COLLATE M
fb70: 59 53 45 51 55 45 4e 43 45 20 44 45 53 43 22 3b  YSEQUENCE DESC";
fb80: 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ..        string
fb90: 20 73 20 3d 20 28 73 74 72 69 6e 67 29 63 6d 64   s = (string)cmd
fba0: 2e 45 78 65 63 75 74 65 53 63 61 6c 61 72 28 29  .ExecuteScalar()
fbb0: 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  ;..        if (s
fbc0: 20 21 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20 74   != "Fi..ld3") t
fbd0: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
fbe0: 6f 6e 28 22 4d 79 53 65 71 75 65 6e 63 65 20 64  on("MySequence d
fbf0: 69 64 6e 27 74 20 73 6f 72 74 20 70 72 6f 70 65  idn't sort prope
fc00: 72 6c 79 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  rly");..      }.
fc10: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
fc20: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
fc30: 20 2f 2f 2f 20 43 61 75 73 65 73 20 74 68 65 20   /// Causes the 
fc40: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
fc50: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 6c 6c  ction to be call
fc60: 65 64 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ed..    /// </su
fc70: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
fc80: 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
fc90: 6e 73 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  ns>..    [Test].
fca0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
fcb0: 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f  ring UserFunctio
fcc0: 6e 31 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n1()..    {..   
fcd0: 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29     CheckSQLite()
fce0: 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  ;..      using (
fcf0: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
fd00: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
fd10: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
fd20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d          int nTim
fd30: 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  es;..        int
fd40: 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20   dtStart;....   
fd50: 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b       nTimes = 0;
fd60: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
fd70: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
fd80: 45 43 54 20 46 6f 6f 28 27 65 65 27 2c 27 66 6f  ECT Foo('ee','fo
fd90: 6f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 64  o')";..        d
fda0: 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e  tStart = Environ
fdb0: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d  ment.TickCount;.
fdc0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28  .        while (
fdd0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
fde0: 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74 20  Count - dtStart 
fdf0: 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20 20 20  < 1000)..       
fe00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d   {..          cm
fe10: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
fe20: 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  y();..          
fe30: 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20 20  nTimes++;..     
fe40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
fe50: 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d  turn String.Form
fe60: 61 74 28 22 55 73 65 72 20 28 74 65 78 74 29 20  at("User (text) 
fe70: 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64  command executed
fe80: 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
fe90: 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73  second.", nTimes
fea0: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
feb0: 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d   }....    [Test]
fec0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
fed0: 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69  tring UserFuncti
fee0: 6f 6e 32 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on2()..    {..  
fef0: 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28      CheckSQLite(
ff00: 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  );..      using 
ff10: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
ff20: 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d   _cnn.CreateComm
ff30: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d  and())..      {.
ff40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69  .        int nTi
ff50: 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e  mes;..        in
ff60: 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20  t dtStart;....  
ff70: 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30        nTimes = 0
ff80: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
ff90: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
ffa0: 4c 45 43 54 20 46 6f 6f 28 31 30 2c 31 31 29 22  LECT Foo(10,11)"
ffb0: 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53 74 61  ;..        dtSta
ffc0: 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  rt = Environment
ffd0: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
ffe0: 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e 76 69       while (Envi
fff0: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
10000 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20 31 30  t - dtStart < 10
10010 30 30 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  00)..        {..
10020 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
10030 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
10040 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69 6d  ..          nTim
10050 65 73 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d  es++;..        }
10060 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
10070 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
10080 55 73 65 72 46 75 6e 63 74 69 6f 6e 20 63 6f 6d  UserFunction com
10090 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20 7b 30  mand executed {0
100a0 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73 65 63  } times in 1 sec
100b0 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29 3b 0d  ond.", nTimes);.
100c0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
100d0 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20  ...    [Test].. 
100e0 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69     internal stri
100f0 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f 6e 33  ng UserFunction3
10100 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
10110 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d   CheckSQLite();.
10120 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
10130 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
10140 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
10150 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
10160 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 73        int nTimes
10170 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  ;..        int d
10180 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20 20 20  tStart;....     
10190 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b 0d 0a     nTimes = 0;..
101a0 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
101b0 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
101c0 54 20 41 42 53 28 31 29 22 3b 0d 0a 20 20 20 20  T ABS(1)";..    
101d0 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e      dtStart = En
101e0 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
101f0 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77 68  unt;..        wh
10200 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74  ile (Environment
10210 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53  .TickCount - dtS
10220 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20 20  tart < 1000)..  
10230 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
10240 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
10250 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
10260 20 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a       nTimes++;..
10270 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10280 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
10290 2e 46 6f 72 6d 61 74 28 22 49 6e 74 72 69 6e 73  .Format("Intrins
102a0 69 63 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  ic command execu
102b0 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e  ted {0} times in
102c0 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69   1 second.", nTi
102d0 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mes);..      }..
102e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
102f0 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
10300 6c 20 73 74 72 69 6e 67 20 55 73 65 72 46 75 6e  l string UserFun
10310 63 74 69 6f 6e 34 28 29 0d 0a 20 20 20 20 7b 0d  ction4()..    {.
10320 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69  .      CheckSQLi
10330 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69  te();..      usi
10340 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
10350 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
10360 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
10370 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20   {..        int 
10380 6e 54 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20  nTimes;..       
10390 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d   int dtStart;...
103a0 0a 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 20  .        nTimes 
103b0 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  = 0;..        cm
103c0 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
103d0 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 27 46  "SELECT lower('F
103e0 4f 4f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20  OO')";..        
103f0 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f  dtStart = Enviro
10400 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
10410 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ..        while 
10420 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63  (Environment.Tic
10430 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74  kCount - dtStart
10440 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20 20   < 1000)..      
10450 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63    {..          c
10460 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
10470 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
10480 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20   nTimes++;..    
10490 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
104a0 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72  eturn String.For
104b0 6d 61 74 28 22 49 6e 74 72 69 6e 20 28 74 78 74  mat("Intrin (txt
104c0 29 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74  ) command execut
104d0 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20  ed {0} times in 
104e0 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d  1 second.", nTim
104f0 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  es);..      }.. 
10500 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
10510 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
10520 20 73 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63   string UserFunc
10530 74 69 6f 6e 35 28 29 0d 0a 20 20 20 20 7b 0d 0a  tion5()..    {..
10540 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74        CheckSQLit
10550 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e  e();..      usin
10560 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
10570 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
10580 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
10590 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  {..        int n
105a0 54 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20  Times;..        
105b0 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a  int dtStart;....
105c0 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d          nTimes =
105d0 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64   0;..        cmd
105e0 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
105f0 53 45 4c 45 43 54 20 31 22 3b 0d 0a 20 20 20 20  SELECT 1";..    
10600 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e      dtStart = En
10610 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
10620 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77 68  unt;..        wh
10630 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74  ile (Environment
10640 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53  .TickCount - dtS
10650 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20 20  tart < 1000)..  
10660 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
10670 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
10680 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
10690 20 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a       nTimes++;..
106a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
106b0 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
106c0 2e 46 6f 72 6d 61 74 28 22 52 61 77 20 56 61 6c  .Format("Raw Val
106d0 75 65 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  ue command execu
106e0 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e  ted {0} times in
106f0 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69   1 second.", nTi
10700 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mes);..      }..
10710 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 20 20 20      }..    ..   
10720 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20   [Test(Sequence 
10730 3d 20 34 32 29 5d 0d 0a 20 20 20 20 69 6e 74 65  = 42)]..    inte
10740 72 6e 61 6c 20 76 6f 69 64 20 56 65 72 69 66 79  rnal void Verify
10750 42 69 6e 61 72 79 44 61 74 61 28 29 0d 0a 20 20  BinaryData()..  
10760 20 20 7b 0d 0a 20 20 20 20 20 20 42 69 6e 61 72    {..      Binar
10770 79 49 6e 73 65 72 74 28 29 3b 0d 0a 20 20 20 20  yInsert();..    
10780 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
10790 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
107a0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
107b0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
107c0 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
107d0 20 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c 64   = "SELECT Field
107e0 36 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65 20  6 FROM TestCase 
107f0 57 48 45 52 45 20 46 69 65 6c 64 36 20 49 53 20  WHERE Field6 IS 
10800 4e 4f 54 20 4e 55 4c 4c 22 3b 0d 0a 20 20 20 20  NOT NULL";..    
10810 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e      byte[] b = n
10820 65 77 20 62 79 74 65 5b 34 30 30 30 5d 3b 0d 0a  ew byte[4000];..
10830 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ..        using 
10840 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64  (DbDataReader rd
10850 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
10860 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
10870 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
10880 20 28 72 64 2e 52 65 61 64 28 29 20 3d 3d 20 66   (rd.Read() == f
10890 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20  alse) throw new 
108a0 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61  Exception("No da
108b0 74 61 20 74 6f 20 72 65 61 64 21 22 29 3b 0d 0a  ta to read!");..
108c0 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67  ..          long
108d0 20 6e 20 3d 20 72 64 2e 47 65 74 42 79 74 65 73   n = rd.GetBytes
108e0 28 30 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c 20  (0, 0, null, 0, 
108f0 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  0);..          i
10900 66 20 28 6e 20 21 3d 20 34 30 30 30 29 20 74 68  f (n != 4000) th
10910 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
10920 6e 28 22 49 6e 76 61 6c 69 64 20 62 79 74 65 20  n("Invalid byte 
10930 6c 65 6e 67 74 68 21 22 29 3b 0d 0a 0d 0a 20 20  length!");....  
10940 20 20 20 20 20 20 20 20 72 64 2e 47 65 74 42 79          rd.GetBy
10950 74 65 73 28 30 2c 20 30 2c 20 62 2c 20 30 2c 20  tes(0, 0, b, 0, 
10960 34 30 30 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  4000);....      
10970 20 20 20 20 69 66 20 28 62 5b 30 5d 20 21 3d 20      if (b[0] != 
10980 31 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  1) throw new Exc
10990 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76  eption("Binary v
109a0 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62  alue non-match b
109b0 79 74 65 20 30 22 29 3b 0d 0a 20 20 20 20 20 20  yte 0");..      
109c0 20 20 20 20 69 66 20 28 62 5b 31 30 30 5d 20 21      if (b[100] !
109d0 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77 20 45  = 2) throw new E
109e0 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79  xception("Binary
109f0 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68   value non-match
10a00 20 62 79 74 65 20 31 30 30 22 29 3b 0d 0a 20 20   byte 100");..  
10a10 20 20 20 20 20 20 20 20 69 66 20 28 62 5b 31 30          if (b[10
10a20 30 30 5d 20 21 3d 20 33 29 20 74 68 72 6f 77 20  00] != 3) throw 
10a30 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 42  new Exception("B
10a40 69 6e 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d  inary value non-
10a50 6d 61 74 63 68 20 62 79 74 65 20 31 30 30 30 22  match byte 1000"
10a60 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
10a70 20 28 62 5b 32 30 30 30 5d 20 21 3d 20 34 29 20   (b[2000] != 4) 
10a80 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
10a90 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61 6c 75  ion("Binary valu
10aa0 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65  e non-match byte
10ab0 20 32 30 30 30 22 29 3b 0d 0a 20 20 20 20 20 20   2000");..      
10ac0 20 20 20 20 69 66 20 28 62 5b 33 30 30 30 5d 20      if (b[3000] 
10ad0 21 3d 20 35 29 20 74 68 72 6f 77 20 6e 65 77 20  != 5) throw new 
10ae0 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72  Exception("Binar
10af0 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  y value non-matc
10b00 68 20 62 79 74 65 20 33 30 30 30 22 29 3b 0d 0a  h byte 3000");..
10b10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10b20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
10b30 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74   [Test]..    int
10b40 65 72 6e 61 6c 20 76 6f 69 64 20 44 65 63 69 6d  ernal void Decim
10b50 61 6c 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  alTest()..    {.
10b60 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
10b70 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
10b80 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
10b90 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
10ba0 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
10bb0 2e 41 64 64 28 22 44 45 43 54 45 53 54 22 29 3b  .Add("DECTEST");
10bc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
10bd0 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43  CommandText = "C
10be0 52 45 41 54 45 20 54 41 42 4c 45 20 44 45 43 54  REATE TABLE DECT
10bf0 45 53 54 28 78 20 44 45 43 49 4d 41 4c 28 33 38  EST(x DECIMAL(38
10c00 2c 31 38 29 29 22 3b 0d 0a 20 20 20 20 20 20 20  ,18))";..       
10c10 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51   cmd.ExecuteNonQ
10c20 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  uery();....     
10c30 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
10c40 78 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54  xt = "INSERT INT
10c50 4f 20 44 45 43 54 45 53 54 28 78 29 20 56 41 4c  O DECTEST(x) VAL
10c60 55 45 53 28 30 2e 30 30 30 30 31 29 22 3b 0d 0a  UES(0.00001)";..
10c70 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
10c80 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
10c90 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20          ..      
10ca0 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
10cb0 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20 46 52  t = "SELECT * FR
10cc0 4f 4d 20 44 45 43 54 45 53 54 22 3b 0d 0a 20 20  OM DECTEST";..  
10cd0 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44        using (DbD
10ce0 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72  ataReader reader
10cf0 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
10d00 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
10d10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
10d20 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20  ader.Read();..  
10d30 20 20 20 20 20 20 20 20 64 65 63 69 6d 61 6c 20          decimal 
10d40 64 20 3d 20 28 64 65 63 69 6d 61 6c 29 72 65 61  d = (decimal)rea
10d50 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30 29 3b  der.GetValue(0);
10d60 0d 0a 20 20 20 20 20 20 20 20 20 20 64 20 3d 20  ..          d = 
10d70 72 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61  reader.GetDecima
10d80 6c 28 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  l(0);..        }
10d90 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
10da0 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65  ....    [Test(Se
10db0 71 75 65 6e 63 65 20 3d 20 39 38 29 5d 0d 0a 20  quence = 98)].. 
10dc0 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
10dd0 20 53 63 61 6c 61 72 50 72 65 54 65 73 74 28 29   ScalarPreTest()
10de0 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75  ..    {..      u
10df0 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
10e00 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
10e10 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
10e20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 64 72     {..        dr
10e30 6f 70 74 61 62 6c 65 73 2e 41 64 64 28 22 53 43  optables.Add("SC
10e40 41 4c 41 52 54 45 53 54 22 29 3b 0d 0a 0d 0a 20  ALARTEST");.... 
10e50 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
10e60 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41 54 45  ndText = "CREATE
10e70 20 54 41 42 4c 45 20 53 43 41 4c 41 52 54 45 53   TABLE SCALARTES
10e80 54 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  T(x INTEGER PRIM
10e90 41 52 59 20 4b 45 59 2c 20 79 29 22 3b 0d 0a 20  ARY KEY, y)";.. 
10ea0 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
10eb0 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d  teNonQuery();...
10ec0 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e  .        for (in
10ed0 74 20 69 20 3d 20 31 3b 20 69 20 3c 3d 20 31 30  t i = 1; i <= 10
10ee0 30 30 3b 20 69 2b 2b 29 0d 0a 20 20 20 20 20 20  00; i++)..      
10ef0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 44    {..          D
10f00 62 50 61 72 61 6d 65 74 65 72 20 70 61 72 61 6d  bParameter param
10f10 31 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61  1 = cmd.CreatePa
10f20 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20  rameter();....  
10f30 20 20 20 20 20 20 20 20 70 61 72 61 6d 31 2e 50          param1.P
10f40 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22  arameterName = "
10f50 70 61 72 61 6d 31 22 3b 0d 0a 20 20 20 20 20 20  param1";..      
10f60 20 20 20 20 70 61 72 61 6d 31 2e 44 62 54 79 70      param1.DbTyp
10f70 65 20 3d 20 44 62 54 79 70 65 2e 49 6e 74 33 32  e = DbType.Int32
10f80 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 72  ;..          par
10f90 61 6d 31 2e 56 61 6c 75 65 20 3d 20 69 3b 0d 0a  am1.Value = i;..
10fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  ..          DbPa
10fb0 72 61 6d 65 74 65 72 20 70 61 72 61 6d 32 20 3d  rameter param2 =
10fc0 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d   cmd.CreateParam
10fd0 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  eter();....     
10fe0 20 20 20 20 20 70 61 72 61 6d 32 2e 50 61 72 61       param2.Para
10ff0 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 70 61 72  meterName = "par
11000 61 6d 32 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  am2";..         
11010 20 70 61 72 61 6d 32 2e 44 62 54 79 70 65 20 3d   param2.DbType =
11020 20 44 62 54 79 70 65 2e 49 6e 74 33 32 3b 0d 0a   DbType.Int32;..
11030 20 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 32            param2
11040 2e 56 61 6c 75 65 20 3d 20 69 3b 0d 0a 0d 0a 20  .Value = i;.... 
11050 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d           cmd.Com
11060 6d 61 6e 64 54 65 78 74 20 3d 0d 0a 20 20 20 20  mandText =..    
11070 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
11080 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54  T OR REPLACE INT
11090 4f 20 53 43 41 4c 41 52 54 45 53 54 28 78 2c 20  O SCALARTEST(x, 
110a0 79 29 20 56 41 4c 55 45 53 28 3f 2c 20 3f 29 22  y) VALUES(?, ?)"
110b0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ;....          c
110c0 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 43 6c  md.Parameters.Cl
110d0 65 61 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ear();..        
110e0 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73    cmd.Parameters
110f0 2e 41 64 64 28 70 61 72 61 6d 31 29 3b 0d 0a 20  .Add(param1);.. 
11100 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72           cmd.Par
11110 61 6d 65 74 65 72 73 2e 41 64 64 28 70 61 72 61  ameters.Add(para
11120 6d 32 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  m2);....        
11130 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
11140 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
11150 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
11160 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
11170 28 53 65 71 75 65 6e 63 65 20 3d 20 39 39 29 5d  (Sequence = 99)]
11180 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
11190 6f 69 64 20 53 63 61 6c 61 72 54 65 73 74 28 29  oid ScalarTest()
111a0 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75  ..    {..      u
111b0 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
111c0 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
111d0 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
111e0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d     {..        cm
111f0 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
11200 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 53  "SELECT x FROM S
11210 43 41 4c 41 52 54 45 53 54 20 4f 52 44 45 52 20  CALARTEST ORDER 
11220 42 59 20 78 22 3b 0d 0a 20 20 20 20 20 20 20 20  BY x";..        
11230 63 6d 64 2e 45 78 65 63 75 74 65 53 63 61 6c 61  cmd.ExecuteScala
11240 72 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  r();..      }.. 
11250 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
11260 74 28 53 65 71 75 65 6e 63 65 20 3d 20 33 30 29  t(Sequence = 30)
11270 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
11280 76 6f 69 64 20 56 65 72 69 66 79 49 6e 73 65 72  void VerifyInser
11290 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  t()..    {..    
112a0 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
112b0 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
112c0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
112d0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
112e0 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
112f0 20 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c 64   = "SELECT Field
11300 31 2c 20 46 69 65 6c 64 32 2c 20 5b 46 69 c3 ab  1, Field2, [Fi..
11310 6c 64 33 5d 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c  ld3], [Fi..ld4],
11320 20 46 69 65 6c 64 35 20 46 52 4f 4d 20 54 65 73   Field5 FROM Tes
11330 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20 20 20  tCase";..       
11340 20 63 6d 64 2e 50 72 65 70 61 72 65 28 29 3b 0d   cmd.Prepare();.
11350 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28  .        using (
11360 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64 20  DbDataReader rd 
11370 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
11380 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
11390 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
113a0 28 72 64 2e 52 65 61 64 28 29 29 0d 0a 20 20 20  (rd.Read())..   
113b0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
113c0 20 20 20 20 20 20 69 6e 74 20 46 69 65 6c 64 31        int Field1
113d0 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32 28 30   = rd.GetInt32(0
113e0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
113f0 64 6f 75 62 6c 65 20 46 69 65 6c 64 32 20 3d 20  double Field2 = 
11400 72 64 2e 47 65 74 44 6f 75 62 6c 65 28 31 29 3b  rd.GetDouble(1);
11410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
11420 72 69 6e 67 20 46 69 65 6c 64 33 20 3d 20 72 64  ring Field3 = rd
11430 2e 47 65 74 53 74 72 69 6e 67 28 32 29 3b 0d 0a  .GetString(2);..
11440 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
11450 6e 67 20 46 69 65 6c 64 34 20 3d 20 72 64 2e 47  ng Field4 = rd.G
11460 65 74 53 74 72 69 6e 67 28 33 29 2e 54 72 69 6d  etString(3).Trim
11470 45 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  End();..        
11480 20 20 20 20 44 61 74 65 54 69 6d 65 20 46 69 65      DateTime Fie
11490 6c 64 35 20 3d 20 72 64 2e 47 65 74 44 61 74 65  ld5 = rd.GetDate
114a0 54 69 6d 65 28 34 29 3b 0d 0a 0d 0a 20 20 20 20  Time(4);....    
114b0 20 20 20 20 20 20 20 20 69 66 20 28 46 69 65 6c          if (Fiel
114c0 64 31 20 21 3d 20 31 29 20 74 68 72 6f 77 20 6e  d1 != 1) throw n
114d0 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72  ew Exception(Str
114e0 69 6e 67 2e 46 6f 72 6d 61 74 28 22 46 69 65 6c  ing.Format("Fiel
114f0 64 31 20 7b 30 7d 20 64 69 64 20 6e 6f 74 20 6d  d1 {0} did not m
11500 61 74 63 68 20 7b 31 7d 22 2c 20 46 69 65 6c 64  atch {1}", Field
11510 31 2c 20 31 29 29 3b 0d 0a 20 20 20 20 20 20 20  1, 1));..       
11520 20 20 20 20 20 69 66 20 28 46 69 65 6c 64 32 20       if (Field2 
11530 21 3d 20 33 2e 31 34 31 35 39 29 20 74 68 72 6f  != 3.14159) thro
11540 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
11550 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 46  String.Format("F
11560 69 65 6c 64 32 20 7b 30 7d 20 64 69 64 20 6e 6f  ield2 {0} did no
11570 74 20 6d 61 74 63 68 20 7b 31 7d 22 2c 20 46 69  t match {1}", Fi
11580 65 6c 64 32 2c 20 33 2e 31 34 31 35 39 29 29 3b  eld2, 3.14159));
11590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
115a0 20 28 46 69 65 6c 64 33 20 21 3d 20 22 46 69 c3   (Field3 != "Fi.
115b0 ab 6c 64 33 22 29 20 74 68 72 6f 77 20 6e 65 77  .ld3") throw new
115c0 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
115d0 67 2e 46 6f 72 6d 61 74 28 22 46 69 65 6c 64 33  g.Format("Field3
115e0 20 7b 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61 74   {0} did not mat
115f0 63 68 20 7b 31 7d 22 2c 20 46 69 65 6c 64 33 2c  ch {1}", Field3,
11600 20 22 46 69 c3 ab 6c 64 33 22 29 29 3b 0d 0a 20   "Fi..ld3"));.. 
11610 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 46             if (F
11620 69 65 6c 64 34 20 21 3d 20 22 46 69 c3 a6 6c 64  ield4 != "Fi..ld
11630 34 22 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  4") throw new Ex
11640 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46  ception(String.F
11650 6f 72 6d 61 74 28 22 46 69 65 6c 64 34 20 7b 30  ormat("Field4 {0
11660 7d 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  } did not match 
11670 7b 31 7d 22 2c 20 46 69 65 6c 64 34 2c 20 22 46  {1}", Field4, "F
11680 69 c3 a6 6c 64 34 22 29 29 3b 0d 0a 20 20 20 20  i..ld4"));..    
11690 20 20 20 20 20 20 20 20 69 66 20 28 46 69 65 6c          if (Fiel
116a0 64 35 2e 43 6f 6d 70 61 72 65 54 6f 28 44 61 74  d5.CompareTo(Dat
116b0 65 54 69 6d 65 2e 50 61 72 73 65 28 22 32 30 30  eTime.Parse("200
116c0 35 2d 30 31 2d 30 31 20 31 33 3a 34 39 3a 30 30  5-01-01 13:49:00
116d0 22 29 29 20 21 3d 20 30 29 20 74 68 72 6f 77 20  ")) != 0) throw 
116e0 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74  new Exception(St
116f0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 46 69 65  ring.Format("Fie
11700 6c 64 35 20 7b 30 7d 20 64 69 64 20 6e 6f 74 20  ld5 {0} did not 
11710 6d 61 74 63 68 20 7b 31 7d 22 2c 20 46 69 65 6c  match {1}", Fiel
11720 64 34 2c 20 44 61 74 65 54 69 6d 65 2e 50 61 72  d4, DateTime.Par
11730 73 65 28 22 32 30 30 35 2d 30 31 2d 30 31 20 31  se("2005-01-01 1
11740 33 3a 34 39 3a 30 30 22 29 29 29 3b 0d 0a 0d 0a  3:49:00")));....
11750 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
11760 72 64 2e 47 65 74 4e 61 6d 65 28 30 29 20 21 3d  rd.GetName(0) !=
11770 20 22 46 69 65 6c 64 31 22 29 20 74 68 72 6f 77   "Field1") throw
11780 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
11790 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d 6e  Non-Match column
117a0 20 6e 61 6d 65 20 46 69 65 6c 64 31 22 29 3b 0d   name Field1");.
117b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
117c0 28 72 64 2e 47 65 74 4e 61 6d 65 28 31 29 20 21  (rd.GetName(1) !
117d0 3d 20 22 46 69 65 6c 64 32 22 29 20 74 68 72 6f  = "Field2") thro
117e0 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
117f0 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d  "Non-Match colum
11800 6e 20 6e 61 6d 65 20 46 69 65 6c 64 32 22 29 3b  n name Field2");
11810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
11820 20 28 72 64 2e 47 65 74 4e 61 6d 65 28 32 29 20   (rd.GetName(2) 
11830 21 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20 74 68  != "Fi..ld3") th
11840 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
11850 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c  n("Non-Match col
11860 75 6d 6e 20 6e 61 6d 65 20 46 69 65 6c 64 33 22  umn name Field3"
11870 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
11880 69 66 20 28 72 64 2e 47 65 74 4e 61 6d 65 28 33  if (rd.GetName(3
11890 29 20 21 3d 20 22 46 69 c3 a6 6c 64 34 22 29 20  ) != "Fi..ld4") 
118a0 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
118b0 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 63  ion("Non-Match c
118c0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 46 69 65 6c 64  olumn name Field
118d0 34 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  4");..          
118e0 20 20 69 66 20 28 72 64 2e 47 65 74 4e 61 6d 65    if (rd.GetName
118f0 28 34 29 20 21 3d 20 22 46 69 65 6c 64 35 22 29  (4) != "Field5")
11900 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
11910 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20  tion("Non-Match 
11920 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 46 69 65 6c  column name Fiel
11930 64 35 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  d5");..         
11940 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c   }..          el
11950 73 65 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  se throw new Exc
11960 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61 74 61 20  eption("No data 
11970 69 6e 20 74 61 62 6c 65 22 29 3b 0d 0a 20 20 20  in table");..   
11980 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
11990 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20  .    }..  }.... 
119a0 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
119b0 20 20 2f 2f 2f 20 53 63 61 6c 61 72 20 75 73 65    /// Scalar use
119c0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
119d0 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20 65 78 61  on.  In this exa
119e0 6d 70 6c 65 2c 20 74 68 65 20 73 61 6d 65 20 63  mple, the same c
119f0 6c 61 73 73 20 69 73 20 64 65 63 6c 61 72 65 64  lass is declared
11a00 20 74 77 69 63 65 20 77 69 74 68 20 0d 0a 20 20   twice with ..  
11a10 2f 2f 2f 20 64 69 66 66 65 72 65 6e 74 20 66 75  /// different fu
11a20 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 74 6f 20  nction names to 
11a30 64 65 6d 6f 6e 73 74 72 61 74 65 20 68 6f 77 20  demonstrate how 
11a40 74 6f 20 75 73 65 20 61 6c 69 61 73 20 6e 61 6d  to use alias nam
11a50 65 73 20 66 6f 72 20 75 73 65 72 2d 64 65 66 69  es for user-defi
11a60 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a  ned functions...
11a70 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
11a80 0d 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e 63 74  ..  [SQLiteFunct
11a90 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 46 6f 6f 22  ion(Name = "Foo"
11aa0 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 32 2c  , Arguments = 2,
11ab0 20 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e 63   FuncType = Func
11ac0 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 29  tionType.Scalar)
11ad0 5d 0d 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e 63  ]..  [SQLiteFunc
11ae0 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 54 65 73  tion(Name = "Tes
11af0 74 46 75 6e 63 22 2c 20 41 72 67 75 6d 65 6e 74  tFunc", Argument
11b00 73 20 3d 20 32 2c 20 46 75 6e 63 54 79 70 65 20  s = 2, FuncType 
11b10 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 53  = FunctionType.S
11b20 63 61 6c 61 72 29 5d 0d 0a 20 20 63 6c 61 73 73  calar)]..  class
11b30 20 54 65 73 74 46 75 6e 63 20 3a 20 53 51 4c 69   TestFunc : SQLi
11b40 74 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d  teFunction..  {.
11b50 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
11b60 72 69 64 65 20 6f 62 6a 65 63 74 20 49 6e 76 6f  ride object Invo
11b70 6b 65 28 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73  ke(object[] args
11b80 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
11b90 69 66 20 28 61 72 67 73 5b 30 5d 2e 47 65 74 54  if (args[0].GetT
11ba0 79 70 65 28 29 20 21 3d 20 74 79 70 65 6f 66 28  ype() != typeof(
11bb0 69 6e 74 29 29 20 72 65 74 75 72 6e 20 61 72 67  int)) return arg
11bc0 73 5b 30 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 69  s[0];....      i
11bd0 6e 74 20 50 61 72 61 6d 31 20 3d 20 43 6f 6e 76  nt Param1 = Conv
11be0 65 72 74 2e 54 6f 49 6e 74 33 32 28 61 72 67 73  ert.ToInt32(args
11bf0 5b 30 5d 29 3b 20 2f 2f 20 46 69 72 73 74 20 70  [0]); // First p
11c00 61 72 61 6d 65 74 65 72 0d 0a 20 20 20 20 20 20  arameter..      
11c10 69 6e 74 20 50 61 72 61 6d 32 20 3d 20 43 6f 6e  int Param2 = Con
11c20 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 61 72 67  vert.ToInt32(arg
11c30 73 5b 31 5d 29 3b 20 2f 2f 20 53 65 63 6f 6e 64  s[1]); // Second
11c40 20 70 61 72 61 6d 65 74 65 72 0d 0a 0d 0a 20 20   parameter....  
11c50 20 20 20 20 72 65 74 75 72 6e 20 50 61 72 61 6d      return Param
11c60 31 20 2b 20 50 61 72 61 6d 32 3b 0d 0a 20 20 20  1 + Param2;..   
11c70 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 5b 53 51   }..  }....  [SQ
11c80 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 4e 61 6d  LiteFunction(Nam
11c90 65 20 3d 20 22 43 41 53 45 54 45 53 54 22 2c 20  e = "CASETEST", 
11ca0 41 72 67 75 6d 65 6e 74 73 20 3d 20 32 2c 20 46  Arguments = 2, F
11cb0 75 6e 63 54 79 70 65 20 3d 20 46 75 6e 63 74 69  uncType = Functi
11cc0 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 29 5d 0d  onType.Scalar)].
11cd0 0a 20 20 63 6c 61 73 73 20 43 61 73 65 54 65 73  .  class CaseTes
11ce0 74 46 75 6e 63 20 3a 20 53 51 4c 69 74 65 46 75  tFunc : SQLiteFu
11cf0 6e 63 74 69 6f 6e 45 78 0d 0a 20 20 7b 0d 0a 20  nctionEx..  {.. 
11d00 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
11d10 64 65 20 6f 62 6a 65 63 74 20 49 6e 76 6f 6b 65  de object Invoke
11d20 28 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 29 0d  (object[] args).
11d30 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 6f  .    {..      Co
11d40 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 20  llationSequence 
11d50 73 65 71 20 3d 20 47 65 74 43 6f 6c 6c 61 74 69  seq = GetCollati
11d60 6f 6e 53 65 71 75 65 6e 63 65 28 29 3b 0d 0a 20  onSequence();.. 
11d70 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 71 2e       return seq.
11d80 43 6f 6d 70 61 72 65 28 61 72 67 73 5b 30 5d 2e  Compare(args[0].
11d90 54 6f 53 74 72 69 6e 67 28 29 2c 20 61 72 67 73  ToString(), args
11da0 5b 31 5d 2e 54 6f 53 74 72 69 6e 67 28 29 29 3b  [1].ToString());
11db0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
11dc0 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
11dd0 0a 20 20 2f 2f 2f 20 41 67 67 72 65 67 61 74 65  .  /// Aggregate
11de0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
11df0 6e 63 74 69 6f 6e 2e 20 20 41 72 67 75 6d 65 6e  nction.  Argumen
11e00 74 73 20 3d 20 2d 31 20 6d 65 61 6e 73 20 61 6e  ts = -1 means an
11e10 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  y number of argu
11e20 6d 65 6e 74 73 20 69 73 20 61 63 63 65 70 74 61  ments is accepta
11e30 62 6c 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ble..  /// </sum
11e40 6d 61 72 79 3e 0d 0a 20 20 5b 53 51 4c 69 74 65  mary>..  [SQLite
11e50 46 75 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20  Function(Name = 
11e60 22 4d 79 43 6f 75 6e 74 22 2c 20 41 72 67 75 6d  "MyCount", Argum
11e70 65 6e 74 73 20 3d 20 2d 31 2c 20 46 75 6e 63 54  ents = -1, FuncT
11e80 79 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79  ype = FunctionTy
11e90 70 65 2e 41 67 67 72 65 67 61 74 65 29 5d 0d 0a  pe.Aggregate)]..
11ea0 20 20 63 6c 61 73 73 20 4d 79 43 6f 75 6e 74 20    class MyCount 
11eb0 3a 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  : SQLiteFunction
11ec0 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c 69  ..  {..    publi
11ed0 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  c override void 
11ee0 53 74 65 70 28 6f 62 6a 65 63 74 5b 5d 20 61 72  Step(object[] ar
11ef0 67 73 2c 20 69 6e 74 20 6e 53 74 65 70 2c 20 72  gs, int nStep, r
11f00 65 66 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78  ef object contex
11f10 74 44 61 74 61 29 0d 0a 20 20 20 20 7b 0d 0a 20  tData)..    {.. 
11f20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74       if (context
11f30 44 61 74 61 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  Data == null).. 
11f40 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
11f50 63 6f 6e 74 65 78 74 44 61 74 61 20 3d 20 31 3b  contextData = 1;
11f60 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
11f70 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 63   else..        c
11f80 6f 6e 74 65 78 74 44 61 74 61 20 3d 20 28 69 6e  ontextData = (in
11f90 74 29 63 6f 6e 74 65 78 74 44 61 74 61 20 2b 20  t)contextData + 
11fa0 31 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  1;..    }....   
11fb0 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
11fc0 20 6f 62 6a 65 63 74 20 46 69 6e 61 6c 28 6f 62   object Final(ob
11fd0 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61  ject contextData
11fe0 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
11ff0 72 65 74 75 72 6e 20 63 6f 6e 74 65 78 74 44 61  return contextDa
12000 74 61 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  ta;..    }..  }.
12010 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  ...  /// <summar
12020 79 3e 0d 0a 20 20 2f 2f 2f 20 53 61 6d 70 6c 65  y>..  /// Sample
12030 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73 73   regular express
12040 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 45  ion function.  E
12050 78 61 6d 70 6c 65 20 55 73 61 67 65 3a 0d 0a 20  xample Usage:.. 
12060 20 2f 2f 2f 20 53 45 4c 45 43 54 20 2a 20 46 52   /// SELECT * FR
12070 4f 4d 20 66 6f 6f 20 57 48 45 52 45 20 6e 61 6d  OM foo WHERE nam
12080 65 20 52 45 47 45 58 50 20 27 24 62 61 72 27 0d  e REGEXP '$bar'.
12090 0a 20 20 2f 2f 2f 20 53 45 4c 45 43 54 20 2a 20  .  /// SELECT * 
120a0 46 52 4f 4d 20 66 6f 6f 20 57 48 45 52 45 20 52  FROM foo WHERE R
120b0 45 47 45 58 50 28 27 24 62 61 72 27 2c 20 6e 61  EGEXP('$bar', na
120c0 6d 65 29 0d 0a 20 20 2f 2f 2f 20 0d 0a 20 20 2f  me)..  /// ..  /
120d0 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
120e0 20 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e   [SQLiteFunction
120f0 28 4e 61 6d 65 20 3d 20 22 52 45 47 45 58 50 22  (Name = "REGEXP"
12100 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 32 2c  , Arguments = 2,
12110 20 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e 63   FuncType = Func
12120 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 29  tionType.Scalar)
12130 5d 0d 0a 20 20 63 6c 61 73 73 20 4d 79 52 65 67  ]..  class MyReg
12140 45 78 20 3a 20 53 51 4c 69 74 65 46 75 6e 63 74  Ex : SQLiteFunct
12150 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 75  ion..  {..    pu
12160 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f 62  blic override ob
12170 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a 65  ject Invoke(obje
12180 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20 20 20 20  ct[] args)..    
12190 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
121a0 53 79 73 74 65 6d 2e 54 65 78 74 2e 52 65 67 75  System.Text.Regu
121b0 6c 61 72 45 78 70 72 65 73 73 69 6f 6e 73 2e 52  larExpressions.R
121c0 65 67 65 78 2e 49 73 4d 61 74 63 68 28 43 6f 6e  egex.IsMatch(Con
121d0 76 65 72 74 2e 54 6f 53 74 72 69 6e 67 28 61 72  vert.ToString(ar
121e0 67 73 5b 31 5d 29 2c 20 43 6f 6e 76 65 72 74 2e  gs[1]), Convert.
121f0 54 6f 53 74 72 69 6e 67 28 61 72 67 73 5b 30 5d  ToString(args[0]
12200 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  ));..    }..  }.
12210 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  ...  /// <summar
12220 79 3e 0d 0a 20 20 2f 2f 2f 20 55 73 65 72 2d 64  y>..  /// User-d
12230 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
12240 20 73 65 71 75 65 6e 63 65 2e 0d 0a 20 20 2f 2f   sequence...  //
12250 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
12260 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28  [SQLiteFunction(
12270 4e 61 6d 65 20 3d 20 22 4d 59 53 45 51 55 45 4e  Name = "MYSEQUEN
12280 43 45 22 2c 20 46 75 6e 63 54 79 70 65 20 3d 20  CE", FuncType = 
12290 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c  FunctionType.Col
122a0 6c 61 74 69 6f 6e 29 5d 0d 0a 20 20 63 6c 61 73  lation)]..  clas
122b0 73 20 4d 79 53 65 71 75 65 6e 63 65 20 3a 20 53  s MySequence : S
122c0 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 0d 0a 20  QLiteFunction.. 
122d0 20 7b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f   {..    public o
122e0 76 65 72 72 69 64 65 20 69 6e 74 20 43 6f 6d 70  verride int Comp
122f0 61 72 65 28 73 74 72 69 6e 67 20 70 61 72 61 6d  are(string param
12300 31 2c 20 73 74 72 69 6e 67 20 70 61 72 61 6d 32  1, string param2
12310 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
12320 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  // Make sure the
12330 20 73 74 72 69 6e 67 20 22 46 69 c3 ab 6c 64 33   string "Fi..ld3
12340 22 20 69 73 20 73 6f 72 74 65 64 20 6f 75 74 20  " is sorted out 
12350 6f 66 20 6f 72 64 65 72 0d 0a 20 20 20 20 20 20  of order..      
12360 69 66 20 28 70 61 72 61 6d 31 20 3d 3d 20 22 46  if (param1 == "F
12370 69 c3 ab 6c 64 33 22 29 20 72 65 74 75 72 6e 20  i..ld3") return 
12380 31 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 70 61  1;..      if (pa
12390 72 61 6d 32 20 3d 3d 20 22 46 69 c3 ab 6c 64 33  ram2 == "Fi..ld3
123a0 22 29 20 72 65 74 75 72 6e 20 2d 31 3b 0d 0a 20  ") return -1;.. 
123b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 74 72 69       return Stri
123c0 6e 67 2e 43 6f 6d 70 61 72 65 28 70 61 72 61 6d  ng.Compare(param
123d0 31 2c 20 70 61 72 61 6d 32 2c 20 74 72 75 65 29  1, param2, true)
123e0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
123f0 0a 20 20 5b 41 74 74 72 69 62 75 74 65 55 73 61  .  [AttributeUsa
12400 67 65 28 41 74 74 72 69 62 75 74 65 54 61 72 67  ge(AttributeTarg
12410 65 74 73 2e 4d 65 74 68 6f 64 2c 20 49 6e 68 65  ets.Method, Inhe
12420 72 69 74 65 64 20 3d 20 66 61 6c 73 65 2c 20 41  rited = false, A
12430 6c 6c 6f 77 4d 75 6c 74 69 70 6c 65 20 3d 20 66  llowMultiple = f
12440 61 6c 73 65 29 5d 0d 0a 20 20 70 75 62 6c 69 63  alse)]..  public
12450 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 54 65   sealed class Te
12460 73 74 41 74 74 72 69 62 75 74 65 20 3a 20 41 74  stAttribute : At
12470 74 72 69 62 75 74 65 2c 20 49 43 6f 6d 70 61 72  tribute, ICompar
12480 61 62 6c 65 3c 54 65 73 74 41 74 74 72 69 62 75  able<TestAttribu
12490 74 65 3e 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 72  te>..  {..    pr
124a0 69 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74  ivate static int
124b0 20 5f 73 74 61 72 74 20 3d 20 36 35 35 33 35 3b   _start = 65535;
124c0 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 69 6e  ..    private in
124d0 74 20 5f 73 65 71 75 65 6e 63 65 3b 0d 0a 0d 0a  t _sequence;....
124e0 20 20 20 20 70 75 62 6c 69 63 20 54 65 73 74 41      public TestA
124f0 74 74 72 69 62 75 74 65 28 29 0d 0a 20 20 20 20  ttribute()..    
12500 7b 0d 0a 20 20 20 20 20 20 5f 73 65 71 75 65 6e  {..      _sequen
12510 63 65 20 3d 20 5f 73 74 61 72 74 3b 0d 0a 20 20  ce = _start;..  
12520 20 20 20 20 5f 73 74 61 72 74 2b 2b 3b 0d 0a 20      _start++;.. 
12530 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c     }....    publ
12540 69 63 20 69 6e 74 20 53 65 71 75 65 6e 63 65 0d  ic int Sequence.
12550 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 67 65  .    {..      ge
12560 74 20 7b 20 72 65 74 75 72 6e 20 5f 73 65 71 75  t { return _sequ
12570 65 6e 63 65 3b 20 7d 0d 0a 20 20 20 20 20 20 73  ence; }..      s
12580 65 74 20 7b 20 5f 73 65 71 75 65 6e 63 65 20 3d  et { _sequence =
12590 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 7d   value; }..    }
125a0 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f 6e 20  ....    #region 
125b0 49 43 6f 6d 70 61 72 61 62 6c 65 3c 54 65 73 74  IComparable<Test
125c0 41 74 74 72 69 62 75 74 65 3e 20 4d 65 6d 62 65  Attribute> Membe
125d0 72 73 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63  rs....    public
125e0 20 69 6e 74 20 43 6f 6d 70 61 72 65 54 6f 28 54   int CompareTo(T
125f0 65 73 74 41 74 74 72 69 62 75 74 65 20 6f 74 68  estAttribute oth
12600 65 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  er)..    {..    
12610 20 20 72 65 74 75 72 6e 20 5f 73 65 71 75 65 6e    return _sequen
12620 63 65 2e 43 6f 6d 70 61 72 65 54 6f 28 6f 74 68  ce.CompareTo(oth
12630 65 72 2e 5f 73 65 71 75 65 6e 63 65 29 3b 0d 0a  er._sequence);..
12640 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72      }..    #endr
12650 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  egion..  }....  
12660 69 6e 74 65 72 6e 61 6c 20 65 6e 75 6d 20 54 65  internal enum Te
12670 73 74 52 65 73 75 6c 74 45 6e 75 6d 0d 0a 20 20  stResultEnum..  
12680 7b 0d 0a 20 20 20 20 53 75 63 63 65 65 64 65 64  {..    Succeeded
12690 20 3d 20 30 2c 0d 0a 20 20 20 20 46 61 69 6c 65   = 0,..    Faile
126a0 64 20 3d 20 31 2c 0d 0a 20 20 20 20 49 6e 63 6f  d = 1,..    Inco
126b0 6e 63 6c 75 73 69 76 65 20 3d 20 32 2c 0d 0a 20  nclusive = 2,.. 
126c0 20 7d 0d 0a 0d 0a 20 20 69 6e 74 65 72 6e 61 6c   }....  internal
126d0 20 63 6c 61 73 73 20 49 6e 63 6f 6e 63 6c 75 73   class Inconclus
126e0 69 76 65 45 78 63 65 70 74 69 6f 6e 20 3a 20 45  iveException : E
126f0 78 63 65 70 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20  xception..  {.. 
12700 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e 63 6f     internal Inco
12710 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74 69 6f  nclusiveExceptio
12720 6e 28 29 0d 0a 20 20 20 20 20 20 3a 20 62 61 73  n()..      : bas
12730 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  e()..    {..    
12740 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
12750 6c 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78  l InconclusiveEx
12760 63 65 70 74 69 6f 6e 28 73 74 72 69 6e 67 20 6d  ception(string m
12770 65 73 73 61 67 65 29 0d 0a 20 20 20 20 20 20 3a  essage)..      :
12780 20 62 61 73 65 28 6d 65 73 73 61 67 65 29 0d 0a   base(message)..
12790 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 20 20      {..    }..  
127a0 7d 0d 0a 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20  }....  internal 
127b0 63 6c 61 73 73 20 54 65 73 74 45 76 65 6e 74 41  class TestEventA
127c0 72 67 73 20 3a 20 45 76 65 6e 74 41 72 67 73 0d  rgs : EventArgs.
127d0 0a 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c 69 63  .  {..    public
127e0 20 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67   readonly string
127f0 20 54 65 73 74 4e 61 6d 65 3b 0d 0a 20 20 20 20   TestName;..    
12800 70 75 62 6c 69 63 20 72 65 61 64 6f 6e 6c 79 20  public readonly 
12810 54 65 73 74 52 65 73 75 6c 74 45 6e 75 6d 20 52  TestResultEnum R
12820 65 73 75 6c 74 3b 0d 0a 20 20 20 20 70 75 62 6c  esult;..    publ
12830 69 63 20 72 65 61 64 6f 6e 6c 79 20 45 78 63 65  ic readonly Exce
12840 70 74 69 6f 6e 20 45 78 63 65 70 74 69 6f 6e 3b  ption Exception;
12850 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 72 65 61  ..    public rea
12860 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 4d 65 73  donly string Mes
12870 73 61 67 65 3b 0d 0a 20 20 20 20 70 75 62 6c 69  sage;..    publi
12880 63 20 72 65 61 64 6f 6e 6c 79 20 69 6e 74 20 44  c readonly int D
12890 75 72 61 74 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20  uration;....    
128a0 69 6e 74 65 72 6e 61 6c 20 54 65 73 74 45 76 65  internal TestEve
128b0 6e 74 41 72 67 73 28 73 74 72 69 6e 67 20 74 65  ntArgs(string te
128c0 73 74 4e 61 6d 65 2c 20 54 65 73 74 52 65 73 75  stName, TestResu
128d0 6c 74 45 6e 75 6d 20 73 75 63 63 65 73 73 2c 20  ltEnum success, 
128e0 69 6e 74 20 64 75 72 61 74 69 6f 6e 2c 20 45 78  int duration, Ex
128f0 63 65 70 74 69 6f 6e 20 65 2c 20 73 74 72 69 6e  ception e, strin
12900 67 20 6d 65 73 73 61 67 65 29 0d 0a 20 20 20 20  g message)..    
12910 7b 0d 0a 20 20 20 20 20 20 54 65 73 74 4e 61 6d  {..      TestNam
12920 65 20 3d 20 74 65 73 74 4e 61 6d 65 3b 0d 0a 20  e = testName;.. 
12930 20 20 20 20 20 52 65 73 75 6c 74 20 3d 20 73 75       Result = su
12940 63 63 65 73 73 3b 0d 0a 20 20 20 20 20 20 45 78  ccess;..      Ex
12950 63 65 70 74 69 6f 6e 20 3d 20 65 3b 0d 0a 20 20  ception = e;..  
12960 20 20 20 20 4d 65 73 73 61 67 65 20 3d 20 6d 65      Message = me
12970 73 73 61 67 65 3b 0d 0a 20 20 20 20 20 20 44 75  ssage;..      Du
12980 72 61 74 69 6f 6e 20 3d 20 64 75 72 61 74 69 6f  ration = duratio
12990 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  n;..    }..  }..
129a0 0d 0a 20 20 64 65 6c 65 67 61 74 65 20 76 6f 69  ..  delegate voi
129b0 64 20 54 65 73 74 43 6f 6d 70 6c 65 74 65 64 45  d TestCompletedE
129c0 76 65 6e 74 28 6f 62 6a 65 63 74 20 73 65 6e 64  vent(object send
129d0 65 72 2c 20 54 65 73 74 45 76 65 6e 74 41 72 67  er, TestEventArg
129e0 73 20 61 72 67 73 29 3b 0d 0a 20 20 64 65 6c 65  s args);..  dele
129f0 67 61 74 65 20 76 6f 69 64 20 54 65 73 74 53 74  gate void TestSt
12a00 61 72 74 69 6e 67 45 76 65 6e 74 28 6f 62 6a 65  artingEvent(obje
12a10 63 74 20 73 65 6e 64 65 72 2c 20 54 65 73 74 45  ct sender, TestE
12a20 76 65 6e 74 41 72 67 73 20 61 72 67 73 29 3b 0d  ventArgs args);.
12a30 0a 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20 61 62  ...  internal ab
12a40 73 74 72 61 63 74 20 63 6c 61 73 73 20 54 65 73  stract class Tes
12a50 74 43 61 73 65 42 61 73 65 0d 0a 20 20 7b 0d 0a  tCaseBase..  {..
12a60 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 44 62      protected Db
12a70 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 20  ProviderFactory 
12a80 5f 66 61 63 74 3b 0d 0a 20 20 20 20 70 72 6f 74  _fact;..    prot
12a90 65 63 74 65 64 20 44 62 43 6f 6e 6e 65 63 74 69  ected DbConnecti
12aa0 6f 6e 20 5f 63 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d  on _cnn = null;.
12ab0 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 44  .    protected D
12ac0 62 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e  bConnectionStrin
12ad0 67 42 75 69 6c 64 65 72 20 5f 63 6e 6e 73 74 72  gBuilder _cnnstr
12ae0 69 6e 67 3b 0d 0a 20 20 20 20 70 72 6f 74 65 63  ing;..    protec
12af0 74 65 64 20 44 69 63 74 69 6f 6e 61 72 79 3c 73  ted Dictionary<s
12b00 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 5f 74 65  tring, bool> _te
12b10 73 74 73 20 3d 20 6e 65 77 20 44 69 63 74 69 6f  sts = new Dictio
12b20 6e 61 72 79 3c 73 74 72 69 6e 67 2c 62 6f 6f 6c  nary<string,bool
12b30 3e 28 29 3b 0d 0a 0d 0a 20 20 20 20 70 75 62 6c  >();....    publ
12b40 69 63 20 65 76 65 6e 74 20 54 65 73 74 43 6f 6d  ic event TestCom
12b50 70 6c 65 74 65 64 45 76 65 6e 74 20 4f 6e 54 65  pletedEvent OnTe
12b60 73 74 46 69 6e 69 73 68 65 64 3b 0d 0a 20 20 20  stFinished;..   
12b70 20 70 75 62 6c 69 63 20 65 76 65 6e 74 20 54 65   public event Te
12b80 73 74 53 74 61 72 74 69 6e 67 45 76 65 6e 74 20  stStartingEvent 
12b90 4f 6e 54 65 73 74 53 74 61 72 74 69 6e 67 3b 0d  OnTestStarting;.
12ba0 0a 20 20 20 20 70 75 62 6c 69 63 20 65 76 65 6e  .    public even
12bb0 74 20 45 76 65 6e 74 48 61 6e 64 6c 65 72 20 4f  t EventHandler O
12bc0 6e 41 6c 6c 54 65 73 74 73 44 6f 6e 65 3b 0d 0a  nAllTestsDone;..
12bd0 0d 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20  ..    protected 
12be0 54 65 73 74 43 61 73 65 42 61 73 65 28 29 0d 0a  TestCaseBase()..
12bf0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 6f 72      {..      Sor
12c00 74 65 64 4c 69 73 74 3c 54 65 73 74 41 74 74 72  tedList<TestAttr
12c10 69 62 75 74 65 2c 20 53 79 73 74 65 6d 2e 52 65  ibute, System.Re
12c20 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49  flection.MethodI
12c30 6e 66 6f 3e 20 69 74 65 6d 73 20 3d 20 6e 65 77  nfo> items = new
12c40 20 53 6f 72 74 65 64 4c 69 73 74 3c 54 65 73 74   SortedList<Test
12c50 41 74 74 72 69 62 75 74 65 2c 20 53 79 73 74 65  Attribute, Syste
12c60 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74  m.Reflection.Met
12c70 68 6f 64 49 6e 66 6f 3e 28 29 3b 0d 0a 20 20 20  hodInfo>();..   
12c80 20 20 20 66 6f 72 65 61 63 68 20 28 53 79 73 74     foreach (Syst
12c90 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65  em.Reflection.Me
12ca0 74 68 6f 64 49 6e 66 6f 20 6d 69 20 69 6e 20 47  thodInfo mi in G
12cb0 65 74 54 79 70 65 28 29 2e 47 65 74 4d 65 74 68  etType().GetMeth
12cc0 6f 64 73 28 53 79 73 74 65 6d 2e 52 65 66 6c 65  ods(System.Refle
12cd0 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61  ction.BindingFla
12ce0 67 73 2e 49 6e 73 74 61 6e 63 65 20 7c 20 53 79  gs.Instance | Sy
12cf0 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e  stem.Reflection.
12d00 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 4e 6f 6e  BindingFlags.Non
12d10 50 75 62 6c 69 63 20 7c 20 53 79 73 74 65 6d 2e  Public | System.
12d20 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
12d30 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d 65  ngFlags.InvokeMe
12d40 74 68 6f 64 29 29 0d 0a 20 20 20 20 20 20 7b 0d  thod))..      {.
12d50 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 5b  .        object[
12d60 5d 20 61 74 74 20 3d 20 6d 69 2e 47 65 74 43 75  ] att = mi.GetCu
12d70 73 74 6f 6d 41 74 74 72 69 62 75 74 65 73 28 74  stomAttributes(t
12d80 79 70 65 6f 66 28 54 65 73 74 41 74 74 72 69 62  ypeof(TestAttrib
12d90 75 74 65 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 20  ute), false);.. 
12da0 20 20 20 20 20 20 20 69 66 20 28 61 74 74 2e 4c         if (att.L
12db0 65 6e 67 74 68 20 3d 3d 20 31 29 0d 0a 20 20 20  ength == 1)..   
12dc0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
12dd0 20 20 69 74 65 6d 73 2e 41 64 64 28 28 54 65 73    items.Add((Tes
12de0 74 41 74 74 72 69 62 75 74 65 29 61 74 74 5b 30  tAttribute)att[0
12df0 5d 2c 20 6d 69 29 3b 0d 0a 20 20 20 20 20 20 20  ], mi);..       
12e00 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
12e10 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 4b 65       foreach (Ke
12e20 79 56 61 6c 75 65 50 61 69 72 3c 54 65 73 74 41  yValuePair<TestA
12e30 74 74 72 69 62 75 74 65 2c 20 53 79 73 74 65 6d  ttribute, System
12e40 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68  .Reflection.Meth
12e50 6f 64 49 6e 66 6f 3e 20 70 61 69 72 20 69 6e 20  odInfo> pair in 
12e60 69 74 65 6d 73 29 0d 0a 20 20 20 20 20 20 7b 0d  items)..      {.
12e70 0a 20 20 20 20 20 20 20 20 5f 74 65 73 74 73 2e  .        _tests.
12e80 41 64 64 28 70 61 69 72 2e 56 61 6c 75 65 2e 4e  Add(pair.Value.N
12e90 61 6d 65 2c 20 74 72 75 65 29 3b 0d 0a 20 20 20  ame, true);..   
12ea0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
12eb0 20 20 20 70 72 6f 74 65 63 74 65 64 20 54 65 73     protected Tes
12ec0 74 43 61 73 65 42 61 73 65 28 44 62 50 72 6f 76  tCaseBase(DbProv
12ed0 69 64 65 72 46 61 63 74 6f 72 79 20 66 61 63 74  iderFactory fact
12ee0 6f 72 79 2c 20 73 74 72 69 6e 67 20 63 6f 6e 6e  ory, string conn
12ef0 65 63 74 69 6f 6e 53 74 72 69 6e 67 29 0d 0a 20  ectionString).. 
12f00 20 20 20 7b 0d 0a 20 20 20 20 20 20 5f 66 61 63     {..      _fac
12f10 74 20 3d 20 66 61 63 74 6f 72 79 3b 0d 0a 20 20  t = factory;..  
12f20 20 20 20 20 5f 63 6e 6e 20 3d 20 5f 66 61 63 74      _cnn = _fact
12f30 2e 43 72 65 61 74 65 43 6f 6e 6e 65 63 74 69 6f  .CreateConnectio
12f40 6e 28 29 3b 0d 0a 20 20 20 20 20 20 5f 63 6e 6e  n();..      _cnn
12f50 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e  .ConnectionStrin
12f60 67 20 3d 20 63 6f 6e 6e 65 63 74 69 6f 6e 53 74  g = connectionSt
12f70 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20 5f 63 6e  ring;..      _cn
12f80 6e 73 74 72 69 6e 67 20 3d 20 5f 66 61 63 74 2e  nstring = _fact.
12f90 43 72 65 61 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  CreateConnection
12fa0 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b  StringBuilder();
12fb0 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 73 74 72 69  ..      _cnnstri
12fc0 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72  ng.ConnectionStr
12fd0 69 6e 67 20 3d 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing = connection
12fe0 53 74 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20 5f  String;..      _
12ff0 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20  cnn.Open();..   
13000 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
13010 61 6c 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74  al Dictionary<st
13020 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 54 65 73 74  ring, bool> Test
13030 73 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  s..    {..      
13040 67 65 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  get..      {..  
13050 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 74 65        return _te
13060 73 74 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  sts;..      }.. 
13070 20 20 20 20 20 73 65 74 0d 0a 20 20 20 20 20 20       set..      
13080 7b 0d 0a 20 20 20 20 20 20 20 20 5f 74 65 73 74  {..        _test
13090 73 20 3d 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20  s = value;..    
130a0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
130b0 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
130c0 52 75 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  Run()..    {..  
130d0 20 20 20 20 53 6f 72 74 65 64 4c 69 73 74 3c 54      SortedList<T
130e0 65 73 74 41 74 74 72 69 62 75 74 65 2c 20 53 79  estAttribute, Sy
130f0 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e  stem.Reflection.
13100 4d 65 74 68 6f 64 49 6e 66 6f 3e 20 69 74 65 6d  MethodInfo> item
13110 73 20 3d 20 6e 65 77 20 53 6f 72 74 65 64 4c 69  s = new SortedLi
13120 73 74 3c 54 65 73 74 41 74 74 72 69 62 75 74 65  st<TestAttribute
13130 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74  , System.Reflect
13140 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f 3e 28  ion.MethodInfo>(
13150 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  );..      foreac
13160 68 20 28 53 79 73 74 65 6d 2e 52 65 66 6c 65 63  h (System.Reflec
13170 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f 20  tion.MethodInfo 
13180 6d 69 20 69 6e 20 47 65 74 54 79 70 65 28 29 2e  mi in GetType().
13190 47 65 74 4d 65 74 68 6f 64 73 28 53 79 73 74 65  GetMethods(Syste
131a0 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e  m.Reflection.Bin
131b0 64 69 6e 67 46 6c 61 67 73 2e 49 6e 73 74 61 6e  dingFlags.Instan
131c0 63 65 20 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c  ce | System.Refl
131d0 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c  ection.BindingFl
131e0 61 67 73 2e 4e 6f 6e 50 75 62 6c 69 63 20 7c 20  ags.NonPublic | 
131f0 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
13200 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 49  n.BindingFlags.I
13210 6e 76 6f 6b 65 4d 65 74 68 6f 64 29 29 0d 0a 20  nvokeMethod)).. 
13220 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
13230 6f 62 6a 65 63 74 5b 5d 20 61 74 74 20 3d 20 6d  object[] att = m
13240 69 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 72 69  i.GetCustomAttri
13250 62 75 74 65 73 28 74 79 70 65 6f 66 28 54 65 73  butes(typeof(Tes
13260 74 41 74 74 72 69 62 75 74 65 29 2c 20 66 61 6c  tAttribute), fal
13270 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66  se);..        if
13280 20 28 61 74 74 2e 4c 65 6e 67 74 68 20 3d 3d 20   (att.Length == 
13290 31 20 26 26 20 5f 74 65 73 74 73 5b 6d 69 2e 4e  1 && _tests[mi.N
132a0 61 6d 65 5d 20 3d 3d 20 74 72 75 65 29 0d 0a 20  ame] == true).. 
132b0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
132c0 20 20 20 20 69 74 65 6d 73 2e 41 64 64 28 28 54      items.Add((T
132d0 65 73 74 41 74 74 72 69 62 75 74 65 29 61 74 74  estAttribute)att
132e0 5b 30 5d 2c 20 6d 69 29 3b 0d 0a 20 20 20 20 20  [0], mi);..     
132f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
13300 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28  .      foreach (
13310 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 54 65 73  KeyValuePair<Tes
13320 74 41 74 74 72 69 62 75 74 65 2c 20 53 79 73 74  tAttribute, Syst
13330 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65  em.Reflection.Me
13340 74 68 6f 64 49 6e 66 6f 3e 20 70 61 69 72 20 69  thodInfo> pair i
13350 6e 20 69 74 65 6d 73 29 0d 0a 20 20 20 20 20 20  n items)..      
13360 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 4f  {..        if (O
13370 6e 54 65 73 74 53 74 61 72 74 69 6e 67 20 21 3d  nTestStarting !=
13380 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
13390 20 20 4f 6e 54 65 73 74 53 74 61 72 74 69 6e 67    OnTestStarting
133a0 28 74 68 69 73 2c 20 6e 65 77 20 54 65 73 74 45  (this, new TestE
133b0 76 65 6e 74 41 72 67 73 28 70 61 69 72 2e 56 61  ventArgs(pair.Va
133c0 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73 74 52 65  lue.Name, TestRe
133d0 73 75 6c 74 45 6e 75 6d 2e 49 6e 63 6f 6e 63 6c  sultEnum.Inconcl
133e0 75 73 69 76 65 2c 20 30 2c 20 6e 75 6c 6c 2c 20  usive, 0, null, 
133f0 6e 75 6c 6c 29 29 3b 0d 0a 0d 0a 20 20 20 20 20  null));....     
13400 20 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 45     int start = E
13410 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
13420 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 74  ount;..        t
13430 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ry..        {.. 
13440 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
13450 6f 62 6a 20 3d 20 70 61 69 72 2e 56 61 6c 75 65  obj = pair.Value
13460 2e 49 6e 76 6f 6b 65 28 74 68 69 73 2c 20 6e 75  .Invoke(this, nu
13470 6c 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ll);..          
13480 69 6e 74 20 64 75 72 61 74 69 6f 6e 20 3d 20 45  int duration = E
13490 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
134a0 6f 75 6e 74 20 2d 20 73 74 61 72 74 3b 0d 0a 20  ount - start;.. 
134b0 20 20 20 20 20 20 20 20 20 69 66 20 28 4f 6e 54           if (OnT
134c0 65 73 74 46 69 6e 69 73 68 65 64 20 21 3d 20 6e  estFinished != n
134d0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
134e0 20 20 4f 6e 54 65 73 74 46 69 6e 69 73 68 65 64    OnTestFinished
134f0 28 74 68 69 73 2c 20 6e 65 77 20 54 65 73 74 45  (this, new TestE
13500 76 65 6e 74 41 72 67 73 28 70 61 69 72 2e 56 61  ventArgs(pair.Va
13510 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73 74 52 65  lue.Name, TestRe
13520 73 75 6c 74 45 6e 75 6d 2e 53 75 63 63 65 65 64  sultEnum.Succeed
13530 65 64 2c 20 64 75 72 61 74 69 6f 6e 2c 20 6e 75  ed, duration, nu
13540 6c 6c 2c 20 28 6f 62 6a 20 69 73 20 73 74 72 69  ll, (obj is stri
13550 6e 67 29 20 3f 20 28 73 74 72 69 6e 67 29 6f 62  ng) ? (string)ob
13560 6a 20 3a 20 53 74 72 69 6e 67 2e 45 6d 70 74 79  j : String.Empty
13570 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ));..        }..
13580 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
13590 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20  xception e)..   
135a0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
135b0 20 20 69 6e 74 20 64 75 72 61 74 69 6f 6e 20 3d    int duration =
135c0 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
135d0 6b 43 6f 75 6e 74 20 2d 20 73 74 61 72 74 3b 0d  kCount - start;.
135e0 0a 20 20 20 20 20 20 20 20 20 20 45 78 63 65 70  .          Excep
135f0 74 69 6f 6e 20 69 6e 6e 65 72 20 3d 20 65 2e 49  tion inner = e.I
13600 6e 6e 65 72 45 78 63 65 70 74 69 6f 6e 3b 0d 0a  nnerException;..
13610 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
13620 4f 6e 54 65 73 74 46 69 6e 69 73 68 65 64 20 21  OnTestFinished !
13630 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
13640 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
13650 20 20 69 66 20 28 69 6e 6e 65 72 20 69 73 20 49    if (inner is I
13660 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65 70  nconclusiveExcep
13670 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
13680 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
13690 20 20 20 20 4f 6e 54 65 73 74 46 69 6e 69 73 68      OnTestFinish
136a0 65 64 28 74 68 69 73 2c 20 6e 65 77 20 54 65 73  ed(this, new Tes
136b0 74 45 76 65 6e 74 41 72 67 73 28 70 61 69 72 2e  tEventArgs(pair.
136c0 56 61 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73 74  Value.Name, Test
136d0 52 65 73 75 6c 74 45 6e 75 6d 2e 49 6e 63 6f 6e  ResultEnum.Incon
136e0 63 6c 75 73 69 76 65 2c 20 64 75 72 61 74 69 6f  clusive, duratio
136f0 6e 2c 20 6e 75 6c 6c 2c 20 69 6e 6e 65 72 2e 4d  n, null, inner.M
13700 65 73 73 61 67 65 29 29 3b 0d 0a 20 20 20 20 20  essage));..     
13710 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13720 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
13730 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
13740 20 20 20 20 20 20 20 20 20 4f 6e 54 65 73 74 46           OnTestF
13750 69 6e 69 73 68 65 64 28 74 68 69 73 2c 20 6e 65  inished(this, ne
13760 77 20 54 65 73 74 45 76 65 6e 74 41 72 67 73 28  w TestEventArgs(
13770 70 61 69 72 2e 56 61 6c 75 65 2e 4e 61 6d 65 2c  pair.Value.Name,
13780 20 54 65 73 74 52 65 73 75 6c 74 45 6e 75 6d 2e   TestResultEnum.
13790 46 61 69 6c 65 64 2c 20 64 75 72 61 74 69 6f 6e  Failed, duration
137a0 2c 20 69 6e 6e 65 72 2c 20 6e 75 6c 6c 29 29 3b  , inner, null));
137b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
137c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
137d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
137e0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 4f 6e  ....      if (On
137f0 41 6c 6c 54 65 73 74 73 44 6f 6e 65 20 21 3d 20  AllTestsDone != 
13800 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 4f  null)..        O
13810 6e 41 6c 6c 54 65 73 74 73 44 6f 6e 65 28 74 68  nAllTestsDone(th
13820 69 73 2c 20 45 76 65 6e 74 41 72 67 73 2e 45 6d  is, EventArgs.Em
13830 70 74 79 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  pty);..    }..  
13840 7d 0d 0a 7d 0d 0a                                }..}..