System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 028670c93758b22669c3bfc70dde160a908f4c62:


0000: ef bb bf 75 73 69 6e 67 20 53 79 73 74 65 6d 3b  ...using System;
0010: 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44  ..using System.D
0020: 61 74 61 2e 43 6f 6d 6d 6f 6e 3b 0d 0a 75 73 69  ata.Common;..usi
0030: 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 3b 0d  ng System.Data;.
0040: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61  .using System.Da
0050: 74 61 2e 53 51 4c 69 74 65 3b 0d 0a 75 73 69 6e  ta.SQLite;..usin
0060: 67 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61 63  g System.Transac
0070: 74 69 6f 6e 73 3b 0d 0a 75 73 69 6e 67 20 53 79  tions;..using Sy
0080: 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73  stem.Collections
0090: 2e 47 65 6e 65 72 69 63 3b 0d 0a 75 73 69 6e 67  .Generic;..using
00a0: 20 53 79 73 74 65 6d 2e 54 65 78 74 3b 0d 0a 75   System.Text;..u
00b0: 73 69 6e 67 20 53 79 73 74 65 6d 2e 49 4f 3b 0d  sing System.IO;.
00c0: 0a 0d 0a 6e 61 6d 65 73 70 61 63 65 20 74 65 73  ...namespace tes
00d0: 74 0d 0a 7b 0d 0a 20 20 69 6e 74 65 72 6e 61 6c  t..{..  internal
00e0: 20 63 6c 61 73 73 20 54 65 73 74 43 61 73 65 73   class TestCases
00f0: 20 3a 20 54 65 73 74 43 61 73 65 42 61 73 65 0d   : TestCaseBase.
0100: 0a 20 20 7b 0d 0a 20 20 20 20 70 72 69 76 61 74  .  {..    privat
0110: 65 20 4c 69 73 74 3c 73 74 72 69 6e 67 3e 20 64  e List<string> d
0120: 72 6f 70 74 61 62 6c 65 73 20 3d 20 6e 65 77 20  roptables = new 
0130: 4c 69 73 74 3c 73 74 72 69 6e 67 3e 28 29 3b 0d  List<string>();.
0140: 0a 20 20 20 20 70 72 69 76 61 74 65 20 4c 69 73  .    private Lis
0150: 74 3c 73 74 72 69 6e 67 3e 20 6d 61 79 64 72 6f  t<string> maydro
0160: 70 74 61 62 6c 65 20 3d 20 6e 65 77 20 4c 69 73  ptable = new Lis
0170: 74 3c 73 74 72 69 6e 67 3e 28 29 3b 0d 0a 20 20  t<string>();..  
0180: 20 20 70 72 69 76 61 74 65 20 6c 6f 6e 67 20 6c    private long l
0190: 6f 67 65 76 65 6e 74 73 20 3d 20 30 3b 0d 0a 20  ogevents = 0;.. 
01a0: 20 20 20 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72     ....    inter
01b0: 6e 61 6c 20 54 65 73 74 43 61 73 65 73 28 29 0d  nal TestCases().
01c0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 0d  .    {..    }...
01d0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 54 65  .    internal Te
01e0: 73 74 43 61 73 65 73 28 44 62 50 72 6f 76 69 64  stCases(DbProvid
01f0: 65 72 46 61 63 74 6f 72 79 20 66 61 63 74 6f 72  erFactory factor
0200: 79 2c 20 73 74 72 69 6e 67 20 63 6f 6e 6e 65 63  y, string connec
0210: 74 69 6f 6e 53 74 72 69 6e 67 29 0d 0a 20 20 20  tionString)..   
0220: 20 20 20 3a 20 62 61 73 65 28 66 61 63 74 6f 72     : base(factor
0230: 79 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 53 74 72  y, connectionStr
0240: 69 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ing)..    {..   
0250: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
0260: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
0270: 20 49 6e 73 65 72 74 73 20 62 69 6e 61 72 79 20   Inserts binary 
0280: 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 64 61  data into the da
0290: 74 61 62 61 73 65 20 75 73 69 6e 67 20 61 20 6e  tabase using a n
02a0: 61 6d 65 64 20 70 61 72 61 6d 65 74 65 72 0d 0a  amed parameter..
02b0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
02c0: 79 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  y>..    internal
02d0: 20 76 6f 69 64 20 42 69 6e 61 72 79 49 6e 73 65   void BinaryInse
02e0: 72 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  rt()..    {..   
02f0: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
0300: 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43  and cmd = _cnn.C
0310: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
0320: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
0330: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
0340: 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  t = "INSERT INTO
0350: 20 54 65 73 74 43 61 73 65 28 46 69 65 6c 64 36   TestCase(Field6
0360: 29 20 56 41 4c 55 45 53 28 40 62 69 6e 29 22 3b  ) VALUES(@bin)";
0370: 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61  ..        DbPara
0380: 6d 65 74 65 72 20 46 69 65 6c 64 36 20 3d 20 63  meter Field6 = c
0390: 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74  md.CreateParamet
03a0: 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  er();....       
03b0: 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20   byte[] b = new 
03c0: 62 79 74 65 5b 34 30 30 30 5d 3b 0d 0a 20 20 20  byte[4000];..   
03d0: 20 20 20 20 20 62 5b 30 5d 20 3d 20 31 3b 0d 0a       b[0] = 1;..
03e0: 20 20 20 20 20 20 20 20 62 5b 31 30 30 5d 20 3d          b[100] =
03f0: 20 32 3b 0d 0a 20 20 20 20 20 20 20 20 62 5b 31   2;..        b[1
0400: 30 30 30 5d 20 3d 20 33 3b 0d 0a 20 20 20 20 20  000] = 3;..     
0410: 20 20 20 62 5b 32 30 30 30 5d 20 3d 20 34 3b 0d     b[2000] = 4;.
0420: 0a 20 20 20 20 20 20 20 20 62 5b 33 30 30 30 5d  .        b[3000]
0430: 20 3d 20 35 3b 0d 0a 0d 0a 20 20 20 20 20 20 20   = 5;....       
0440: 20 46 69 65 6c 64 36 2e 50 61 72 61 6d 65 74 65   Field6.Paramete
0450: 72 4e 61 6d 65 20 3d 20 22 40 62 69 6e 22 3b 0d  rName = "@bin";.
0460: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 36 2e  .        Field6.
0470: 56 61 6c 75 65 20 3d 20 62 3b 0d 0a 0d 0a 20 20  Value = b;....  
0480: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
0490: 74 65 72 73 2e 41 64 64 28 46 69 65 6c 64 36 29  ters.Add(Field6)
04a0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ;....        cmd
04b0: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
04c0: 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ();..      }..  
04d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
04e0: 6e 61 6c 20 76 6f 69 64 20 43 68 65 63 6b 4c 6f  nal void CheckLo
04f0: 63 6b 65 64 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  cked()..    {.. 
0500: 20 20 20 20 20 2f 2f 20 4c 65 74 73 20 6d 61 6b       // Lets mak
0510: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
0520: 61 73 65 20 69 73 6e 27 74 20 6c 6f 63 6b 65 64  ase isn't locked
0530: 2e 20 20 49 66 20 69 74 20 69 73 2c 20 77 65 27  .  If it is, we'
0540: 76 65 20 66 61 69 6c 65 64 2e 0d 0a 20 20 20 20  ve failed...    
0550: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6e 6e 65    using (DbConne
0560: 63 74 69 6f 6e 20 6e 65 77 63 6e 6e 20 3d 20 28  ction newcnn = (
0570: 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e 6e  (ICloneable)_cnn
0580: 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62 43  ).Clone() as DbC
0590: 6f 6e 6e 65 63 74 69 6f 6e 29 0d 0a 20 20 20 20  onnection)..    
05a0: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
05b0: 6e 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e  nd cmd = newcnn.
05c0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
05d0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
05e0: 20 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74     if (newcnn.St
05f0: 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f  ate != Connectio
0600: 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 6e 65 77  nState.Open) new
0610: 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  cnn.Open();.... 
0620: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
0630: 6e 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54  ndText = "INSERT
0640: 20 49 4e 54 4f 20 54 65 73 74 43 61 73 65 20 28   INTO TestCase (
0650: 46 69 65 6c 64 31 29 20 53 45 4c 45 43 54 20 31  Field1) SELECT 1
0660: 20 57 48 45 52 45 20 31 20 3d 20 32 22 3b 0d 0a   WHERE 1 = 2";..
0670: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
0680: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
0690: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
06a0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
06b0: 6f 69 64 20 43 68 65 63 6b 53 51 4c 69 74 65 28  oid CheckSQLite(
06c0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
06d0: 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70  if (_fact.GetTyp
06e0: 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66  e().Name.IndexOf
06f0: 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e  ("SQLite", Strin
0700: 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69  gComparison.Ordi
0710: 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d  nalIgnoreCase) =
0720: 3d 20 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 74  = -1)..        t
0730: 68 72 6f 77 20 6e 65 77 20 49 6e 63 6f 6e 63 6c  hrow new Inconcl
0740: 75 73 69 76 65 45 78 63 65 70 74 69 6f 6e 28 22  usiveException("
0750: 4e 6f 74 20 61 20 53 51 4c 69 74 65 20 64 61 74  Not a SQLite dat
0760: 61 62 61 73 65 22 29 3b 0d 0a 20 20 20 20 7d 0d  abase");..    }.
0770: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
0780: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 65  ary>..    /// Te
0790: 73 74 73 20 63 68 61 6e 67 69 6e 67 20 70 61 73  sts changing pas
07a0: 73 77 6f 72 64 20 6f 6e 20 61 6e 20 65 6e 63 72  sword on an encr
07b0: 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2e 0d  ypted database..
07c0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
07d0: 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  ry>..    [Test].
07e0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
07f0: 69 64 20 43 68 61 6e 67 65 50 61 73 73 77 6f 72  id ChangePasswor
0800: 64 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a  dTest()..    {..
0810: 20 20 20 20 20 20 20 20 69 66 20 28 5f 66 61 63          if (_fac
0820: 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d 65  t.GetType().Name
0830: 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74 65  .IndexOf("SQLite
0840: 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69  ", StringCompari
0850: 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72  son.OrdinalIgnor
0860: 65 43 61 73 65 29 20 3e 20 2d 31 29 0d 0a 20 20  eCase) > -1)..  
0870: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0880: 20 20 20 20 20 2f 2f 20 4f 70 65 6e 73 20 61 6e       // Opens an
0890: 20 75 6e 65 6e 63 72 79 70 74 65 64 20 64 61 74   unencrypted dat
08a0: 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 20  abase..         
08b0: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
08c0: 69 6f 6e 20 63 6e 6e 20 3d 20 6e 65 77 20 53 51  ion cnn = new SQ
08d0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 5f  LiteConnection(_
08e0: 63 6e 6e 73 74 72 69 6e 67 2e 43 6f 6e 6e 65 63  cnnstring.Connec
08f0: 74 69 6f 6e 53 74 72 69 6e 67 29 3b 0d 0a 0d 0a  tionString);....
0900: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e              cnn.
0910: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
0920: 20 20 20 20 20 20 20 2f 2f 20 45 6e 63 72 79 70         // Encryp
0930: 74 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ts the database.
0940: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
0950: 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 61 6e  remains valid an
0960: 64 20 75 73 61 62 6c 65 20 61 66 74 65 72 77 61  d usable afterwa
0970: 72 64 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  rds...          
0980: 20 20 63 6e 6e 2e 43 68 61 6e 67 65 50 61 73 73    cnn.ChangePass
0990: 77 6f 72 64 28 22 6d 79 70 61 73 73 77 6f 72 64  word("mypassword
09a0: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
09b0: 20 20 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e     maydroptable.
09c0: 41 64 64 28 22 43 68 61 6e 67 65 50 61 73 73 77  Add("ChangePassw
09d0: 6f 72 64 54 65 73 74 22 29 3b 0d 0a 20 20 20 20  ordTest");..    
09e0: 20 20 20 20 20 20 20 20 69 66 20 28 63 6e 6e 2e          if (cnn.
09f0: 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74  State != Connect
0a00: 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 63  ionState.Open) c
0a10: 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20  nn.Open();..    
0a20: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
0a30: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63  bCommand cmd = c
0a40: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
0a50: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ())..           
0a60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0a70: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
0a80: 65 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41  ext = "CREATE TA
0a90: 42 4c 45 20 43 68 61 6e 67 65 50 61 73 73 77 6f  BLE ChangePasswo
0aa0: 72 64 54 65 73 74 28 49 44 20 69 6e 74 20 70 72  rdTest(ID int pr
0ab0: 69 6d 61 72 79 20 6b 65 79 29 22 3b 0d 0a 20 20  imary key)";..  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
0ad0: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
0ae0: 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  y();..          
0af0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
0b00: 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d     cnn.Close();.
0b10: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
0b20: 2f 20 54 72 79 20 72 65 2d 6f 70 65 6e 69 6e 67  / Try re-opening
0b30: 20 77 69 74 68 20 62 61 64 20 70 61 73 73 77 6f   with bad passwo
0b40: 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd..            
0b50: 63 6e 6e 2e 53 65 74 50 61 73 73 77 6f 72 64 28  cnn.SetPassword(
0b60: 22 21 6d 79 70 61 73 73 77 6f 72 64 22 29 3b 0d  "!mypassword");.
0b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e  .            cnn
0b80: 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20 20 20  .Open();..      
0b90: 20 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28        cnn.Close(
0ba0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
0bb0: 20 20 2f 2f 20 54 72 79 20 72 65 2d 6f 70 65 6e    // Try re-open
0bc0: 69 6e 67 20 77 69 74 68 20 67 6f 6f 64 20 70 61  ing with good pa
0bd0: 73 73 77 6f 72 64 0d 0a 20 20 20 20 20 20 20 20  ssword..        
0be0: 20 20 20 20 63 6e 6e 2e 53 65 74 50 61 73 73 77      cnn.SetPassw
0bf0: 6f 72 64 28 22 6d 79 70 61 73 73 77 6f 72 64 22  ord("mypassword"
0c00: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
0c10: 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  cnn.Open();.... 
0c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 44 65             // De
0c30: 63 72 70 79 74 20 64 61 74 61 62 61 73 65 0d 0a  crpyt database..
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e              cnn.
0c50: 43 68 61 6e 67 65 50 61 73 73 77 6f 72 64 28 22  ChangePassword("
0c60: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
0c70: 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d     cnn.Close();.
0c80: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
0c90: 2f 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6e 6f  / Try opening no
0ca0: 77 20 77 69 74 68 6f 75 74 20 70 61 73 73 77 6f  w without passwo
0cb0: 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd..            
0cc0: 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20  cnn.Open();..   
0cd0: 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 43 6c 6f           cnn.Clo
0ce0: 73 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  se();....       
0cf0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
0d00: 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 3d   [Test(Sequence=
0d10: 31 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  1)]..    interna
0d20: 6c 20 73 74 72 69 6e 67 20 56 65 72 73 69 6f 6e  l string Version
0d30: 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  Test()..    {.. 
0d40: 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65       CheckSQLite
0d50: 28 29 3b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e  ();..      strin
0d60: 67 5b 5d 20 76 65 72 73 69 6f 6e 20 3d 20 5f 63  g[] version = _c
0d70: 6e 6e 2e 53 65 72 76 65 72 56 65 72 73 69 6f 6e  nn.ServerVersion
0d80: 2e 53 70 6c 69 74 28 27 2e 27 29 3b 0d 0a 20 20  .Split('.');..  
0d90: 20 20 20 20 69 66 20 28 43 6f 6e 76 65 72 74 2e      if (Convert.
0da0: 54 6f 49 6e 74 33 32 28 76 65 72 73 69 6f 6e 5b  ToInt32(version[
0db0: 30 5d 29 20 3c 20 33 0d 0a 20 20 20 20 20 20 20  0]) < 3..       
0dc0: 20 7c 7c 20 28 43 6f 6e 76 65 72 74 2e 54 6f 49   || (Convert.ToI
0dd0: 6e 74 33 32 28 76 65 72 73 69 6f 6e 5b 30 5d 29  nt32(version[0])
0de0: 20 3d 3d 20 33 20 26 26 20 43 6f 6e 76 65 72 74   == 3 && Convert
0df0: 2e 54 6f 49 6e 74 33 32 28 76 65 72 73 69 6f 6e  .ToInt32(version
0e00: 5b 31 5d 29 20 3c 20 36 29 0d 0a 20 20 20 20 20  [1]) < 6)..     
0e10: 20 20 20 7c 7c 20 28 43 6f 6e 76 65 72 74 2e 54     || (Convert.T
0e20: 6f 49 6e 74 33 32 28 76 65 72 73 69 6f 6e 5b 30  oInt32(version[0
0e30: 5d 29 20 3d 3d 20 33 20 26 26 20 43 6f 6e 76 65  ]) == 3 && Conve
0e40: 72 74 2e 54 6f 49 6e 74 33 32 28 76 65 72 73 69  rt.ToInt32(versi
0e50: 6f 6e 5b 31 5d 29 20 3d 3d 20 36 20 26 26 20 43  on[1]) == 6 && C
0e60: 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 76  onvert.ToInt32(v
0e70: 65 72 73 69 6f 6e 5b 32 5d 29 20 3c 20 31 29 0d  ersion[2]) < 1).
0e80: 0a 20 20 20 20 20 20 20 20 29 20 74 68 72 6f 77  .        ) throw
0e90: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53   new Exception(S
0ea0: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 53 51  tring.Format("SQ
0eb0: 4c 69 74 65 20 45 6e 67 69 6e 65 20 69 73 20 7b  Lite Engine is {
0ec0: 30 7d 2e 20 20 4d 69 6e 69 6d 75 6d 20 73 75 70  0}.  Minimum sup
0ed0: 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e 20 69  ported version i
0ee0: 73 20 33 2e 36 2e 31 22 2c 20 5f 63 6e 6e 2e 53  s 3.6.1", _cnn.S
0ef0: 65 72 76 65 72 56 65 72 73 69 6f 6e 29 29 3b 0d  erverVersion));.
0f00: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
0f10: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 53  String.Format("S
0f20: 51 4c 69 74 65 20 45 6e 67 69 6e 65 20 69 73 20  QLite Engine is 
0f30: 7b 30 7d 22 2c 20 5f 63 6e 6e 2e 53 65 72 76 65  {0}", _cnn.Serve
0f40: 72 56 65 72 73 69 6f 6e 29 3b 0d 0a 20 20 20 20  rVersion);..    
0f50: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 5b 54 65 73 74  }....    //[Test
0f60: 28 53 65 71 75 65 6e 63 65 20 3d 20 31 29 5d 0d  (Sequence = 1)].
0f70: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
0f80: 69 64 20 50 61 72 73 65 54 65 73 74 28 29 0d 0a  id ParseTest()..
0f90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 44 61 74      {..      Dat
0fa0: 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 5f 63 6e  aTable tbl = _cn
0fb0: 6e 2e 47 65 74 53 63 68 65 6d 61 28 22 56 69 65  n.GetSchema("Vie
0fc0: 77 43 6f 6c 75 6d 6e 73 22 29 3b 0d 0a 20 20 20  wColumns");..   
0fd0: 20 20 20 44 61 74 61 54 61 62 6c 65 20 74 62 6c     DataTable tbl
0fe0: 32 20 3d 20 5f 63 6e 6e 2e 47 65 74 53 63 68 65  2 = _cnn.GetSche
0ff0: 6d 61 28 22 56 69 65 77 73 22 29 3b 0d 0a 0d 0a  ma("Views");....
1000: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
1010: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
1020: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
1030: 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
1040: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
1050: 65 72 73 2e 41 64 64 28 63 6d 64 2e 43 72 65 61  ers.Add(cmd.Crea
1060: 74 65 50 61 72 61 6d 65 74 65 72 28 29 29 3b 0d  teParameter());.
1070: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72  .        cmd.Par
1080: 61 6d 65 74 65 72 73 5b 30 5d 2e 56 61 6c 75 65  ameters[0].Value
1090: 20 3d 20 31 3b 0d 0a 0d 0a 20 20 20 20 20 20 20   = 1;....       
10a0: 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e   cmd.Parameters.
10b0: 41 64 64 28 63 6d 64 2e 43 72 65 61 74 65 50 61  Add(cmd.CreatePa
10c0: 72 61 6d 65 74 65 72 28 29 29 3b 0d 0a 20 20 20  rameter());..   
10d0: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
10e0: 65 72 73 5b 31 5d 2e 56 61 6c 75 65 20 3d 20 31  ers[1].Value = 1
10f0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ;....        cmd
1100: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
1110: 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 73 71  select * from sq
1120: 6c 69 74 65 5f 6d 61 73 74 65 72 20 6c 69 6d 69  lite_master limi
1130: 74 20 3f 20 6f 66 66 73 65 74 20 3f 22 3b 0d 0a  t ? offset ?";..
1140: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 6f          object o
1150: 62 6a 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65  bj = cmd.Execute
1160: 53 63 61 6c 61 72 28 29 3b 0d 0a 0d 0a 20 20 20  Scalar();....   
1170: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
1180: 54 65 78 74 20 3d 20 40 22 0d 0a 43 52 45 41 54  Text = @"..CREAT
1190: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 41 28 49  E TEMP TABLE A(I
11a0: 44 20 49 4e 54 45 47 45 52 2c 20 42 49 44 20 49  D INTEGER, BID I
11b0: 4e 54 45 47 45 52 29 3b 43 52 45 41 54 45 20 54  NTEGER);CREATE T
11c0: 45 4d 50 20 54 41 42 4c 45 20 42 28 49 44 20 49  EMP TABLE B(ID I
11d0: 4e 54 45 47 45 52 2c 20 4d 59 56 41 4c 20 56 41  NTEGER, MYVAL VA
11e0: 52 43 48 41 52 29 3b 0d 0a 49 4e 53 45 52 54 20  RCHAR);..INSERT 
11f0: 49 4e 54 4f 20 41 20 28 49 44 2c 20 42 49 44 29  INTO A (ID, BID)
1200: 20 56 41 4c 55 45 53 28 32 2c 20 31 29 3b 0d 0a   VALUES(2, 1);..
1210: 49 4e 53 45 52 54 20 49 4e 54 4f 20 42 20 28 49  INSERT INTO B (I
1220: 44 2c 20 4d 59 56 41 4c 29 20 56 41 4c 55 45 53  D, MYVAL) VALUES
1230: 28 31 2c 27 54 45 53 54 27 29 3b 0d 0a 22 3b 0d  (1,'TEST');..";.
1240: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
1250: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
1260: 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20  .        ..     
1270: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
1280: 78 74 20 3d 20 22 73 65 6c 65 63 74 20 2a 2c 20  xt = "select *, 
1290: 28 73 65 6c 65 63 74 20 31 20 61 73 20 63 20 66  (select 1 as c f
12a0: 72 6f 6d 20 62 20 77 68 65 72 65 20 62 2e 69 64  rom b where b.id
12b0: 20 3d 20 61 2e 62 69 64 29 20 66 72 6f 6d 20 61   = a.bid) from a
12c0: 3b 22 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69  ;";..        usi
12d0: 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72  ng (DbDataReader
12e0: 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78   reader = cmd.Ex
12f0: 65 63 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a  ecuteReader())..
1300: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1310: 20 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64       reader.Read
1320: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ();..        }..
1330: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
1340: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 73 65 6c  mmandText = "sel
1350: 65 63 74 20 61 2e 69 64 20 61 73 20 61 61 20 66  ect a.id as aa f
1360: 72 6f 6d 20 61 20 77 68 65 72 65 20 28 73 65 6c  rom a where (sel
1370: 65 63 74 20 31 20 66 72 6f 6d 20 28 73 65 6c 65  ect 1 from (sele
1380: 63 74 20 31 20 77 68 65 72 65 20 31 20 3d 20 61  ct 1 where 1 = a
1390: 61 29 29 3b 22 3b 0d 0a 20 20 20 20 20 20 20 20  a));";..        
13a0: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
13b0: 64 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64  der reader = cmd
13c0: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29  .ExecuteReader()
13d0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
13e0: 20 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 52          reader.R
13f0: 65 61 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ead();..        
1400: 7d 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20  }..        ..   
1410: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
1420: 54 65 78 74 20 3d 20 22 73 65 6c 65 63 74 20 2a  Text = "select *
1430: 2c 20 28 73 65 6c 65 63 74 20 63 6f 75 6e 74 28  , (select count(
1440: 63 29 20 66 72 6f 6d 20 28 73 65 6c 65 63 74 20  c) from (select 
1450: 31 20 61 73 20 63 20 66 72 6f 6d 20 62 20 77 68  1 as c from b wh
1460: 65 72 65 20 62 2e 69 64 20 3d 20 61 2e 62 69 64  ere b.id = a.bid
1470: 29 29 20 66 72 6f 6d 20 61 3b 22 3b 0d 0a 20 20  )) from a;";..  
1480: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44        using (DbD
1490: 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72  ataReader reader
14a0: 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
14b0: 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
14c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
14d0: 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20  ader.Read();..  
14e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14f0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b  ..    }....    [
1500: 54 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20  Test(Sequence = 
1510: 33 39 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  39)]..    intern
1520: 61 6c 20 76 6f 69 64 20 4d 75 6c 74 69 70 6c 65  al void Multiple
1530: 46 75 6e 63 74 69 6f 6e 73 28 29 0d 0a 20 20 20  Functions()..   
1540: 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53   {..      CheckS
1550: 51 4c 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20  QLite();..      
1560: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
1570: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
1580: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
1590: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
15a0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
15b0: 20 22 53 45 4c 45 43 54 20 4d 59 43 4f 55 4e 54   "SELECT MYCOUNT
15c0: 28 46 69 65 6c 64 31 29 2c 20 4d 59 43 4f 55 4e  (Field1), MYCOUN
15d0: 54 28 46 69 65 6c 64 32 29 20 46 52 4f 4d 20 54  T(Field2) FROM T
15e0: 65 73 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20  estCase";..     
15f0: 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61     using (DbData
1600: 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20  Reader reader = 
1610: 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65  cmd.ExecuteReade
1620: 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  r())..        {.
1630: 0a 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65  .          reade
1640: 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20  r.Read();..     
1650: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1660: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
1670: 74 28 53 65 71 75 65 6e 63 65 20 3d 20 38 29 5d  t(Sequence = 8)]
1680: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
1690: 6f 69 64 20 46 75 6e 63 74 69 6f 6e 57 69 74 68  oid FunctionWith
16a0: 43 6f 6c 6c 61 74 69 6f 6e 28 29 0d 0a 20 20 20  Collation()..   
16b0: 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53   {..      CheckS
16c0: 51 4c 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20  QLite();..      
16d0: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
16e0: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
16f0: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
1700: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
1710: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
1720: 20 22 53 45 4c 45 43 54 20 43 48 41 52 49 4e 44   "SELECT CHARIND
1730: 45 58 28 27 70 61 74 27 2c 20 27 74 68 65 70 61  EX('pat', 'thepa
1740: 74 27 29 2c 20 43 48 41 52 49 4e 44 45 58 28 27  t'), CHARINDEX('
1750: 70 61 74 27 2c 20 27 54 48 45 50 41 54 27 29 2c  pat', 'THEPAT'),
1760: 20 43 48 41 52 49 4e 44 45 58 28 27 70 61 74 27   CHARINDEX('pat'
1770: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c   COLLATE NOCASE,
1780: 20 27 54 48 45 50 41 54 27 20 43 4f 4c 4c 41 54   'THEPAT' COLLAT
1790: 45 20 4e 4f 43 41 53 45 29 22 3b 0d 0a 20 20 20  E NOCASE)";..   
17a0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
17b0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
17c0: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
17d0: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
17e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 61  {..          rea
17f0: 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20  der.Read();..   
1800: 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65         if (reade
1810: 72 2e 47 65 74 49 6e 74 36 34 28 30 29 20 21 3d  r.GetInt64(0) !=
1820: 20 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34   reader.GetInt64
1830: 28 32 29 20 7c 7c 20 72 65 61 64 65 72 2e 47 65  (2) || reader.Ge
1840: 74 49 6e 74 36 34 28 31 29 20 21 3d 20 30 20 7c  tInt64(1) != 0 |
1850: 7c 20 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36  | reader.GetInt6
1860: 34 28 30 29 20 21 3d 20 34 29 0d 0a 20 20 20 20  4(0) != 4)..    
1870: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
1880: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 43 68 61  w Exception("Cha
1890: 72 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  rIndex returned 
18a0: 77 72 6f 6e 67 20 72 65 73 75 6c 74 73 21 22 29  wrong results!")
18b0: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
18c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
18d0: 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e      [Test(Sequen
18e0: 63 65 20 3d 20 39 29 5d 0d 0a 20 20 20 20 69 6e  ce = 9)]..    in
18f0: 74 65 72 6e 61 6c 20 76 6f 69 64 20 46 75 6e 63  ternal void Func
1900: 74 69 6f 6e 57 69 74 68 43 6f 6c 6c 61 74 69 6f  tionWithCollatio
1910: 6e 32 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n2()..    {..   
1920: 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29     CheckSQLite()
1930: 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  ;..      using (
1940: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
1950: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
1960: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
1970: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
1980: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
1990: 54 20 43 41 53 45 54 45 53 54 28 27 70 61 74 27  T CASETEST('pat'
19a0: 2c 20 27 70 61 74 27 29 2c 20 43 41 53 45 54 45  , 'pat'), CASETE
19b0: 53 54 28 27 70 61 74 27 2c 20 27 50 41 54 27 29  ST('pat', 'PAT')
19c0: 2c 20 43 41 53 45 54 45 53 54 28 27 70 61 74 27  , CASETEST('pat'
19d0: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c   COLLATE NOCASE,
19e0: 20 27 50 41 54 27 20 43 4f 4c 4c 41 54 45 20 4e   'PAT' COLLATE N
19f0: 4f 43 41 53 45 29 2c 20 43 41 53 45 54 45 53 54  OCASE), CASETEST
1a00: 28 27 70 61 74 27 20 43 4f 4c 4c 41 54 45 20 4d  ('pat' COLLATE M
1a10: 59 53 45 51 55 45 4e 43 45 2c 20 27 50 41 54 27  YSEQUENCE, 'PAT'
1a20: 20 43 4f 4c 4c 41 54 45 20 4d 59 53 45 51 55 45   COLLATE MYSEQUE
1a30: 4e 43 45 29 2c 20 43 41 53 45 54 45 53 54 28 27  NCE), CASETEST('
1a40: 74 61 70 27 2c 20 27 54 41 50 27 20 43 4f 4c 4c  tap', 'TAP' COLL
1a50: 41 54 45 20 4e 4f 43 41 53 45 29 22 3b 0d 0a 20  ATE NOCASE)";.. 
1a60: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
1a70: 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65  DataReader reade
1a80: 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  r = cmd.ExecuteR
1a90: 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20  eader())..      
1aa0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72    {..          r
1ab0: 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20  eader.Read();.. 
1ac0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
1ad0: 64 65 72 2e 47 65 74 49 6e 74 36 34 28 30 29 20  der.GetInt64(0) 
1ae0: 21 3d 20 72 65 61 64 65 72 2e 47 65 74 49 6e 74  != reader.GetInt
1af0: 36 34 28 32 29 20 7c 7c 20 72 65 61 64 65 72 2e  64(2) || reader.
1b00: 47 65 74 49 6e 74 36 34 28 31 29 20 21 3d 20 31  GetInt64(1) != 1
1b10: 20 7c 7c 20 72 65 61 64 65 72 2e 47 65 74 49 6e   || reader.GetIn
1b20: 74 36 34 28 30 29 20 21 3d 20 30 29 0d 0a 20 20  t64(0) != 0)..  
1b30: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
1b40: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 43  new Exception("C
1b50: 68 61 72 49 6e 64 65 78 20 72 65 74 75 72 6e 65  harIndex returne
1b60: 64 20 77 72 6f 6e 67 20 72 65 73 75 6c 74 73 21  d wrong results!
1b70: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ");..        }..
1b80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1b90: 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20  ..    [Test]..  
1ba0: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
1bb0: 44 61 74 61 54 79 70 65 73 53 63 68 65 6d 61 28  DataTypesSchema(
1bc0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
1bd0: 75 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65  using (DataTable
1be0: 20 74 62 6c 20 3d 20 5f 63 6e 6e 2e 47 65 74 53   tbl = _cnn.GetS
1bf0: 63 68 65 6d 61 28 22 44 61 74 61 54 79 70 65 73  chema("DataTypes
1c00: 22 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  "))..      {..  
1c10: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
1c20: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
1c30: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4d 61 6b 65 20  >..    /// Make 
1c40: 73 75 72 65 20 6f 75 72 20 69 6d 70 6c 65 6d 65  sure our impleme
1c50: 6e 74 61 74 69 6f 6e 20 6f 66 20 43 6c 65 61 72  ntation of Clear
1c60: 50 6f 6f 6c 28 29 20 62 65 68 61 76 65 73 20 65  Pool() behaves e
1c70: 78 61 63 74 6c 79 20 61 73 20 74 68 65 20 53 71  xactly as the Sq
1c80: 6c 43 6c 69 65 6e 74 20 76 65 72 73 69 6f 6e 20  lClient version 
1c90: 69 73 20 64 6f 63 75 6d 65 6e 74 65 64 20 74 6f  is documented to
1ca0: 20 62 65 68 61 76 65 2e 0d 0a 20 20 20 20 2f 2f   behave...    //
1cb0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
1cc0: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
1cd0: 3d 39 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72  =90)]..    inter
1ce0: 6e 61 6c 20 76 6f 69 64 20 43 6c 65 61 72 50 6f  nal void ClearPo
1cf0: 6f 6c 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  olTest()..    {.
1d00: 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 74 61  .      string ta
1d10: 62 6c 65 20 3d 20 22 63 6c 65 61 72 70 6f 6f 6c  ble = "clearpool
1d20: 22 3b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67  ";..      string
1d30: 20 74 65 6d 70 20 3d 20 22 54 45 4d 50 22 3b 0d   temp = "TEMP";.
1d40: 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 5f 66 61  ...      if (_fa
1d50: 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d  ct.GetType().Nam
1d60: 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74  e.IndexOf("SQLit
1d70: 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  e", StringCompar
1d80: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
1d90: 72 65 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a  reCase) == -1)..
1da0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1db0: 20 74 65 6d 70 20 3d 20 53 74 72 69 6e 67 2e 45   temp = String.E
1dc0: 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20 20 20 74  mpty;..        t
1dd0: 61 62 6c 65 20 3d 20 22 23 63 6c 65 61 72 70 6f  able = "#clearpo
1de0: 6f 6c 22 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ol";..      }...
1df0: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61  .      object va
1e00: 6c 75 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  lue;..      if (
1e10: 5f 63 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47 65  _cnnstring.TryGe
1e20: 74 56 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67 22  tValue("Pooling"
1e30: 2c 20 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d 20  , out value) == 
1e40: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
1e50: 20 45 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c   Exception("Pool
1e60: 69 6e 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20  ing not present 
1e70: 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  in connection st
1e80: 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 69  ring");..      i
1e90: 66 20 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20 3d  f ((bool)value =
1ea0: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
1eb0: 65 77 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45  ew InconclusiveE
1ec0: 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e  xception("Poolin
1ed0: 67 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69 6e  g not enabled in
1ee0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1ef0: 73 74 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20 20  string");....   
1f00: 20 20 20 73 74 72 69 6e 67 20 73 71 6c 20 3d 20     string sql = 
1f10: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 43  String.Format("C
1f20: 52 45 41 54 45 20 7b 30 7d 20 54 41 42 4c 45 20  REATE {0} TABLE 
1f30: 7b 31 7d 28 69 64 20 69 6e 74 20 70 72 69 6d 61  {1}(id int prima
1f40: 72 79 20 6b 65 79 29 3b 22 2c 20 74 65 6d 70 2c  ry key);", temp,
1f50: 20 74 61 62 6c 65 29 3b 0d 0a 20 20 20 20 20 20   table);..      
1f60: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
1f70: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
1f80: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
1f90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f      {..        /
1fa0: 2f 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 20  / Create a temp 
1fb0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
1fc0: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 20  n connection so 
1fd0: 77 65 20 63 61 6e 20 63 6f 6e 66 69 72 6d 20 6f  we can confirm o
1fe0: 75 72 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  ur new connectio
1ff0: 6e 73 20 61 72 65 20 75 73 69 6e 67 20 74 72 75  ns are using tru
2000: 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
2010: 73 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  s..        cmd.C
2020: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 73 71 6c  ommandText = sql
2030: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45  ;..        cmd.E
2040: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
2050: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
2060: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d      for (int n =
2070: 20 30 3b 20 6e 20 3c 20 31 30 3b 20 6e 2b 2b 29   0; n < 10; n++)
2080: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
2090: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6e 6e     using (DbConn
20a0: 65 63 74 69 6f 6e 20 6e 65 77 63 6e 6e 20 3d 20  ection newcnn = 
20b0: 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e  ((ICloneable)_cn
20c0: 6e 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62  n).Clone() as Db
20d0: 43 6f 6e 6e 65 63 74 69 6f 6e 29 0d 0a 20 20 20  Connection)..   
20e0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
20f0: 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61    if (newcnn.Sta
2100: 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e  te != Connection
2110: 53 74 61 74 65 2e 4f 70 65 6e 29 20 6e 65 77 63  State.Open) newc
2120: 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20  nn.Open();..    
2130: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
2140: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65 77  ommand cmd = new
2150: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
2160: 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  d())..          
2170: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  {..            /
2180: 2f 20 49 66 20 74 68 65 20 70 6f 6f 6c 20 69 73  / If the pool is
2190: 20 70 72 6f 70 65 72 6c 79 20 69 6d 70 6c 65 6d   properly implem
21a0: 65 6e 74 65 64 20 61 6e 64 20 74 68 65 20 70 6f  ented and the po
21b0: 6f 6c 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  oled connection 
21c0: 70 72 6f 70 65 72 6c 79 20 64 65 73 74 72 6f 79  properly destroy
21d0: 65 64 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ed, this command
21e0: 20 77 69 6c 6c 20 73 75 63 63 65 65 64 2e 0d 0a   will succeed...
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49              // I
2200: 66 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  f the new connec
2210: 74 69 6f 6e 20 77 61 73 20 6f 62 74 61 69 6e 65  tion was obtaine
2220: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20  d from the pool 
2230: 65 76 65 6e 20 61 66 74 65 72 20 77 65 20 63 6c  even after we cl
2240: 65 61 72 65 64 20 69 74 2c 20 74 68 65 6e 20 74  eared it, then t
2250: 68 69 73 20 74 61 62 6c 65 20 77 69 6c 6c 20 61  his table will a
2260: 6c 72 65 61 64 79 20 65 78 69 73 74 0d 0a 20 20  lready exist..  
2270: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 64            // and
2280: 20 74 68 65 20 74 65 73 74 20 66 61 69 6c 73 2e   the test fails.
2290: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
22a0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
22b0: 73 71 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  sql;..          
22c0: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
22d0: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
22e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
22f0: 20 2f 2f 20 54 72 79 20 61 6e 64 20 63 6c 65 61   // Try and clea
2300: 72 20 74 68 65 20 70 6f 6f 6c 20 61 73 73 6f 63  r the pool assoc
2310: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2320: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  file..          
2330: 6e 65 77 63 6e 6e 2e 47 65 74 54 79 70 65 28 29  newcnn.GetType()
2340: 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65 72 28 22 43  .InvokeMember("C
2350: 6c 65 61 72 50 6f 6f 6c 22 2c 20 53 79 73 74 65  learPool", Syste
2360: 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e  m.Reflection.Bin
2370: 64 69 6e 67 46 6c 61 67 73 2e 53 74 61 74 69 63  dingFlags.Static
2380: 20 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63   | System.Reflec
2390: 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67  tion.BindingFlag
23a0: 73 2e 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 20 7c  s.InvokeMethod |
23b0: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
23c0: 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e  on.BindingFlags.
23d0: 50 75 62 6c 69 63 2c 20 6e 75 6c 6c 2c 20 6e 75  Public, null, nu
23e0: 6c 6c 2c 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d  ll, new object[]
23f0: 20 7b 20 6e 65 77 63 6e 6e 20 7d 29 3b 0d 0a 0d   { newcnn });...
2400: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 41 74  .          // At
2410: 20 74 68 69 73 20 70 6f 69 6e 74 20 77 68 65 6e   this point when
2420: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2430: 69 73 20 64 65 73 74 72 6f 79 65 64 2c 20 69 74  is destroyed, it
2440: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72   should not be r
2450: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 70  eturned to the p
2460: 6f 6f 6c 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ool, but instead
2470: 20 64 69 73 70 6f 73 65 64 2e 0d 0a 20 20 20 20   disposed...    
2480: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
2490: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
24a0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
24b0: 2f 2f 2f 20 54 68 69 73 20 74 65 73 74 73 20 43  /// This tests C
24c0: 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73 28 29 20 66  learAllPools() f
24d0: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 20 20 4d  unctionality.  M
24e0: 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
24f0: 68 65 20 70 6f 6f 6c 20 69 73 20 77 6f 72 6b 69  he pool is worki
2500: 6e 67 20 70 72 6f 70 65 72 6c 79 20 61 6e 64 20  ng properly and 
2510: 63 6c 65 61 72 69 6e 67 20 70 72 6f 70 65 72 6c  clearing properl
2520: 79 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  y...    /// </su
2530: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73  mmary>..    [Tes
2540: 74 28 53 65 71 75 65 6e 63 65 20 3d 20 31 30 30  t(Sequence = 100
2550: 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  )]..    internal
2560: 20 76 6f 69 64 20 43 6c 65 61 72 41 6c 6c 50 6f   void ClearAllPo
2570: 6f 6c 73 54 65 73 74 28 29 0d 0a 20 20 20 20 7b  olsTest()..    {
2580: 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 74  ..      string t
2590: 61 62 6c 65 20 3d 20 22 63 6c 65 61 72 70 6f 6f  able = "clearpoo
25a0: 6c 22 3b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e  l";..      strin
25b0: 67 20 74 65 6d 70 20 3d 20 22 54 45 4d 50 22 3b  g temp = "TEMP";
25c0: 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 65  ..      string e
25d0: 78 69 73 74 73 20 3d 20 22 20 49 46 20 4e 4f 54  xists = " IF NOT
25e0: 20 45 58 49 53 54 53 20 22 3b 0d 0a 0d 0a 20 20   EXISTS ";....  
25f0: 20 20 20 20 69 66 20 28 5f 66 61 63 74 2e 47 65      if (_fact.Ge
2600: 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64  tType().Name.Ind
2610: 65 78 4f 66 28 22 53 51 4c 69 74 65 22 2c 20 53  exOf("SQLite", S
2620: 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e  tringComparison.
2630: 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73  OrdinalIgnoreCas
2640: 65 29 20 3d 3d 20 2d 31 29 0d 0a 20 20 20 20 20  e) == -1)..     
2650: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 65 6d 70   {..        temp
2660: 20 3d 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 3b   = String.Empty;
2670: 0d 0a 20 20 20 20 20 20 20 20 65 78 69 73 74 73  ..        exists
2680: 20 3d 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 3b   = String.Empty;
2690: 0d 0a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  ..        table 
26a0: 3d 20 22 23 63 6c 65 61 72 70 6f 6f 6c 22 3b 0d  = "#clearpool";.
26b0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
26c0: 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 3b 0d    object value;.
26d0: 0a 20 20 20 20 20 20 69 66 20 28 5f 63 6e 6e 73  .      if (_cnns
26e0: 74 72 69 6e 67 2e 54 72 79 47 65 74 56 61 6c 75  tring.TryGetValu
26f0: 65 28 22 50 6f 6f 6c 69 6e 67 22 2c 20 6f 75 74  e("Pooling", out
2700: 20 76 61 6c 75 65 29 20 3d 3d 20 66 61 6c 73 65   value) == false
2710: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
2720: 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20 6e  ption("Pooling n
2730: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 63 6f  ot present in co
2740: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 22  nnection string"
2750: 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 28 62  );..      if ((b
2760: 6f 6f 6c 29 76 61 6c 75 65 20 3d 3d 20 66 61 6c  ool)value == fal
2770: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 49 6e  se) throw new In
2780: 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74  conclusiveExcept
2790: 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20 6e 6f 74  ion("Pooling not
27a0: 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 65 20   enabled in the 
27b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
27c0: 67 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 73 74  g");....      st
27d0: 72 69 6e 67 20 73 71 6c 20 3d 20 53 74 72 69 6e  ring sql = Strin
27e0: 67 2e 46 6f 72 6d 61 74 28 22 43 52 45 41 54 45  g.Format("CREATE
27f0: 20 7b 30 7d 20 54 41 42 4c 45 20 7b 32 7d 7b 31   {0} TABLE {2}{1
2800: 7d 28 69 64 20 69 6e 74 20 70 72 69 6d 61 72 79  }(id int primary
2810: 20 6b 65 79 29 3b 22 2c 20 74 65 6d 70 2c 20 74   key);", temp, t
2820: 61 62 6c 65 2c 20 65 78 69 73 74 73 29 3b 0d 0a  able, exists);..
2830: 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 2e 47 65 74  ..      _cnn.Get
2840: 54 79 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d  Type().InvokeMem
2850: 62 65 72 28 22 43 6c 65 61 72 41 6c 6c 50 6f 6f  ber("ClearAllPoo
2860: 6c 73 22 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c  ls", System.Refl
2870: 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c  ection.BindingFl
2880: 61 67 73 2e 53 74 61 74 69 63 20 7c 20 53 79 73  ags.Static | Sys
2890: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42  tem.Reflection.B
28a0: 69 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f  indingFlags.Invo
28b0: 6b 65 4d 65 74 68 6f 64 20 7c 20 53 79 73 74 65  keMethod | Syste
28c0: 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e  m.Reflection.Bin
28d0: 64 69 6e 67 46 6c 61 67 73 2e 50 75 62 6c 69 63  dingFlags.Public
28e0: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75  , null, null, nu
28f0: 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 44 62  ll);....      Db
2900: 43 6f 6e 6e 65 63 74 69 6f 6e 5b 5d 20 61 72 72  Connection[] arr
2910: 20 3d 20 6e 65 77 20 44 62 43 6f 6e 6e 65 63 74   = new DbConnect
2920: 69 6f 6e 5b 31 30 5d 3b 0d 0a 0d 0a 20 20 20 20  ion[10];....    
2930: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 7b 0d 0a    try..      {..
2940: 20 20 20 20 20 20 20 20 2f 2f 20 43 72 65 61 74          // Creat
2950: 65 20 31 30 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  e 10 connections
2960: 20 61 6e 64 20 63 72 65 61 74 65 20 74 65 6d 70   and create temp
2970: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6f 6e 20  orary tables on 
2980: 74 68 65 6d 0d 0a 20 20 20 20 20 20 20 20 66 6f  them..        fo
2990: 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20  r (int n = 0; n 
29a0: 3c 20 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  < 10; n++)..    
29b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
29c0: 20 61 72 72 5b 6e 5d 20 3d 20 28 28 49 43 6c 6f   arr[n] = ((IClo
29d0: 6e 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f  neable)_cnn).Clo
29e0: 6e 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63  ne() as DbConnec
29f0: 74 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20  tion;..         
2a00: 20 69 66 20 28 61 72 72 5b 6e 5d 2e 53 74 61 74   if (arr[n].Stat
2a10: 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53  e != ConnectionS
2a20: 74 61 74 65 2e 4f 70 65 6e 29 20 61 72 72 5b 6e  tate.Open) arr[n
2a30: 5d 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20  ].Open();....   
2a40: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
2a50: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 61 72  Command cmd = ar
2a60: 72 5b 6e 5d 2e 43 72 65 61 74 65 43 6f 6d 6d 61  r[n].CreateComma
2a70: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  nd())..         
2a80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a90: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
2aa0: 3d 20 73 71 6c 3b 0d 0a 20 20 20 20 20 20 20 20  = sql;..        
2ab0: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
2ac0: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
2ad0: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
2ae0: 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67  andText = String
2af0: 2e 46 6f 72 6d 61 74 28 22 49 4e 53 45 52 54 20  .Format("INSERT 
2b00: 49 4e 54 4f 20 7b 31 7d 20 28 69 64 29 20 56 41  INTO {1} (id) VA
2b10: 4c 55 45 53 28 7b 30 7d 29 22 2c 20 6e 2c 20 74  LUES({0})", n, t
2b20: 61 62 6c 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  able);..        
2b30: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
2b40: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
2b50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2b60: 20 20 20 20 20 73 77 69 74 63 68 20 28 6e 29 0d       switch (n).
2b70: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
2b80: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 32            case 2
2b90: 3a 20 2f 2f 20 50 75 74 20 74 68 69 73 20 6f 6e  : // Put this on
2ba0: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
2bb0: 70 6f 6f 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  pool..          
2bc0: 20 20 20 20 61 72 72 5b 6e 5d 2e 44 69 73 70 6f      arr[n].Dispo
2bd0: 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  se();..         
2be0: 20 20 20 20 20 61 72 72 5b 6e 5d 20 3d 20 6e 75       arr[n] = nu
2bf0: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
2c00: 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
2c10: 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 0d 0a         case 4:..
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2c30: 20 43 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 70   Clear all the p
2c40: 6f 6f 6c 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ools..          
2c50: 20 20 20 20 5f 63 6e 6e 2e 47 65 74 54 79 70 65      _cnn.GetType
2c60: 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65 72 28  ().InvokeMember(
2c70: 22 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c 73 22 2c  "ClearAllPools",
2c80: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
2c90: 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e  on.BindingFlags.
2ca0: 53 74 61 74 69 63 20 7c 20 53 79 73 74 65 6d 2e  Static | System.
2cb0: 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
2cc0: 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d 65  ngFlags.InvokeMe
2cd0: 74 68 6f 64 20 7c 20 53 79 73 74 65 6d 2e 52 65  thod | System.Re
2ce0: 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67  flection.Binding
2cf0: 46 6c 61 67 73 2e 50 75 62 6c 69 63 2c 20 6e 75  Flags.Public, nu
2d00: 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  ll, null, null);
2d10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d20: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
2d30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2d40: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f 77  ..        // Now
2d50: 20 63 6c 6f 73 65 20 61 6c 6c 20 74 68 65 20 63   close all the c
2d60: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 4f 6e 6c  onnections.  Onl
2d70: 79 20 74 68 65 20 6c 61 73 74 20 35 20 73 68 6f  y the last 5 sho
2d80: 75 6c 64 20 67 6f 20 69 6e 74 6f 20 74 68 65 20  uld go into the 
2d90: 70 6f 6f 6c 0d 0a 20 20 20 20 20 20 20 20 66 6f  pool..        fo
2da0: 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20  r (int n = 0; n 
2db0: 3c 20 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  < 10; n++)..    
2dc0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2dd0: 20 69 66 20 28 61 72 72 5b 6e 5d 20 21 3d 20 6e   if (arr[n] != n
2de0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
2df0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
2e00: 72 72 5b 6e 5d 2e 44 69 73 70 6f 73 65 28 29 3b  rr[n].Dispose();
2e10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ..            ar
2e20: 72 5b 6e 5d 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  r[n] = null;..  
2e30: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2e40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2e50: 2f 2f 20 4f 70 65 6e 20 31 30 20 63 6f 6e 6e 65  // Open 10 conne
2e60: 63 74 69 6f 6e 73 2e 20 20 54 68 65 79 20 73 68  ctions.  They sh
2e70: 6f 75 6c 64 20 65 69 74 68 65 72 20 68 61 76 65  ould either have
2e80: 20 61 20 63 6c 65 61 72 70 6f 6f 6c 20 63 6f 6e   a clearpool con
2e90: 74 61 69 6e 69 6e 67 20 61 6e 20 69 64 20 6f 66  taining an id of
2ea0: 20 35 20 6f 72 20 67 72 65 61 74 65 72 2c 0d 0a   5 or greater,..
2eb0: 20 20 20 20 20 20 20 20 2f 2f 20 6f 72 20 73 68          // or sh
2ec0: 6f 75 6c 64 20 68 61 76 65 20 6e 6f 20 63 6c 65  ould have no cle
2ed0: 61 72 70 6f 6f 6c 20 74 61 62 6c 65 20 61 74 20  arpool table at 
2ee0: 61 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 66 6f  all...        fo
2ef0: 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20  r (int n = 0; n 
2f00: 3c 20 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  < 10; n++)..    
2f10: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2f20: 20 61 72 72 5b 6e 5d 20 3d 20 28 28 49 43 6c 6f   arr[n] = ((IClo
2f30: 6e 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f  neable)_cnn).Clo
2f40: 6e 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63  ne() as DbConnec
2f50: 74 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20  tion;..         
2f60: 20 69 66 20 28 61 72 72 5b 6e 5d 2e 53 74 61 74   if (arr[n].Stat
2f70: 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53  e != ConnectionS
2f80: 74 61 74 65 2e 4f 70 65 6e 29 20 61 72 72 5b 6e  tate.Open) arr[n
2f90: 5d 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20  ].Open();....   
2fa0: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
2fb0: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 61 72  Command cmd = ar
2fc0: 72 5b 6e 5d 2e 43 72 65 61 74 65 43 6f 6d 6d 61  r[n].CreateComma
2fd0: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  nd())..         
2fe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ff0: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
3000: 3d 20 73 71 6c 3b 0d 0a 20 20 20 20 20 20 20 20  = sql;..        
3010: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
3020: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
3030: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
3040: 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67  andText = String
3050: 2e 46 6f 72 6d 61 74 28 22 53 45 4c 45 43 54 20  .Format("SELECT 
3060: 5b 69 64 5d 20 46 52 4f 4d 20 7b 30 7d 22 2c 20  [id] FROM {0}", 
3070: 74 61 62 6c 65 29 3b 0d 0a 20 20 20 20 20 20 20  table);..       
3080: 20 20 20 20 20 6f 62 6a 65 63 74 20 6f 20 3d 20       object o = 
3090: 63 6d 64 2e 45 78 65 63 75 74 65 53 63 61 6c 61  cmd.ExecuteScala
30a0: 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  r();....        
30b0: 20 20 20 20 69 66 20 28 6f 20 3d 3d 20 6e 75 6c      if (o == nul
30c0: 6c 20 7c 7c 20 6f 20 3d 3d 20 44 42 4e 75 6c 6c  l || o == DBNull
30d0: 2e 56 61 6c 75 65 29 0d 0a 20 20 20 20 20 20 20  .Value)..       
30e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
30f0: 20 2f 2f 20 4e 6f 20 64 61 74 61 20 69 6e 20 74   // No data in t
3100: 68 65 20 74 61 62 6c 65 20 61 74 20 61 6c 6c 2c  he table at all,
3110: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20   which means we 
3120: 6d 75 73 74 27 76 65 20 6a 75 73 74 20 63 72 65  must've just cre
3130: 61 74 65 64 20 69 74 20 2d 2d 20 63 6f 6e 6e 65  ated it -- conne
3140: 63 74 69 6f 6e 20 77 61 73 6e 27 74 20 70 61 72  ction wasn't par
3150: 74 20 6f 66 20 74 68 65 20 70 6f 6f 6c 0d 0a 0d  t of the pool...
3160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3170: 28 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32  (Convert.ToInt32
3180: 28 6f 29 20 3c 20 35 29 0d 0a 20 20 20 20 20 20  (o) < 5)..      
3190: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
31a0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 55 6e 65  w Exception("Une
31b0: 78 70 65 63 74 65 64 20 64 61 74 61 20 72 65 74  xpected data ret
31c0: 75 72 6e 65 64 20 66 72 6f 6d 20 74 61 62 6c 65  urned from table
31d0: 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  !");..          
31e0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
31f0: 20 20 20 20 20 20 20 20 2f 2f 20 43 6c 65 61 72          // Clear
3200: 20 61 6c 6c 20 74 68 65 20 70 6f 6f 6c 73 0d 0a   all the pools..
3210: 20 20 20 20 20 20 20 20 5f 63 6e 6e 2e 47 65 74          _cnn.Get
3220: 54 79 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d  Type().InvokeMem
3230: 62 65 72 28 22 43 6c 65 61 72 41 6c 6c 50 6f 6f  ber("ClearAllPoo
3240: 6c 73 22 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c  ls", System.Refl
3250: 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c  ection.BindingFl
3260: 61 67 73 2e 53 74 61 74 69 63 20 7c 20 53 79 73  ags.Static | Sys
3270: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42  tem.Reflection.B
3280: 69 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f  indingFlags.Invo
3290: 6b 65 4d 65 74 68 6f 64 20 7c 20 53 79 73 74 65  keMethod | Syste
32a0: 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e  m.Reflection.Bin
32b0: 64 69 6e 67 46 6c 61 67 73 2e 50 75 62 6c 69 63  dingFlags.Public
32c0: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75  , null, null, nu
32d0: 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 7d 0d  ll);....      }.
32e0: 0a 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a  .      finally..
32f0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3300: 20 2f 2f 20 43 6c 6f 73 65 20 61 6c 6c 20 74 68   // Close all th
3310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20  e connections.. 
3320: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
3330: 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30 3b 20 6e  n = 0; n < 10; n
3340: 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ++)..        {..
3350: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72            if (ar
3360: 72 5b 6e 5d 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  r[n] != null).. 
3370: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3380: 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 44          arr[n].D
3390: 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20  ispose();..     
33a0: 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 20 3d 20         arr[n] = 
33b0: 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  null;..         
33c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
33d0: 20 20 20 20 20 20 20 2f 2f 20 43 6c 65 61 72 20         // Clear 
33e0: 61 6c 6c 20 74 68 65 20 70 6f 6f 6c 73 0d 0a 20  all the pools.. 
33f0: 20 20 20 20 20 20 20 5f 63 6e 6e 2e 47 65 74 54         _cnn.GetT
3400: 79 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d 62  ype().InvokeMemb
3410: 65 72 28 22 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c  er("ClearAllPool
3420: 73 22 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65  s", System.Refle
3430: 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61  ction.BindingFla
3440: 67 73 2e 53 74 61 74 69 63 20 7c 20 53 79 73 74  gs.Static | Syst
3450: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69  em.Reflection.Bi
3460: 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b  ndingFlags.Invok
3470: 65 4d 65 74 68 6f 64 20 7c 20 53 79 73 74 65 6d  eMethod | System
3480: 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64  .Reflection.Bind
3490: 69 6e 67 46 6c 61 67 73 2e 50 75 62 6c 69 63 2c  ingFlags.Public,
34a0: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c   null, null, nul
34b0: 6c 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  l);..      }..  
34c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
34d0: 28 53 65 71 75 65 6e 63 65 20 3d 20 35 30 29 5d  (Sequence = 50)]
34e0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
34f0: 6f 69 64 20 43 6f 65 72 73 69 6f 6e 54 65 73 74  oid CoersionTest
3500: 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
3510: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
3520: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
3530: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
3540: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3550: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
3560: 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c 64 31  = "SELECT Field1
3570: 2c 20 46 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c  , Field2, [Fi..l
3580: 64 33 5d 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20  d3], [Fi..ld4], 
3590: 46 69 65 6c 64 35 2c 20 27 41 27 2c 20 31 2c 20  Field5, 'A', 1, 
35a0: 31 20 2b 20 31 2c 20 33 2e 31 34 31 35 39 20 46  1 + 1, 3.14159 F
35b0: 52 4f 4d 20 54 65 73 74 43 61 73 65 22 3b 0d 0a  ROM TestCase";..
35c0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
35d0: 62 44 61 74 61 52 65 61 64 65 72 20 72 64 20 3d  bDataReader rd =
35e0: 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64   cmd.ExecuteRead
35f0: 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b  er())..        {
3600: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
3610: 72 64 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20  rd.Read())..    
3620: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3630: 20 20 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c       object Fiel
3640: 64 31 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32  d1 = rd.GetInt32
3650: 28 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  (0);..          
3660: 20 20 6f 62 6a 65 63 74 20 46 69 65 6c 64 32 20    object Field2 
3670: 3d 20 72 64 2e 47 65 74 44 6f 75 62 6c 65 28 31  = rd.GetDouble(1
3680: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
3690: 6f 62 6a 65 63 74 20 46 69 65 6c 64 33 20 3d 20  object Field3 = 
36a0: 72 64 2e 47 65 74 53 74 72 69 6e 67 28 32 29 3b  rd.GetString(2);
36b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
36c0: 6a 65 63 74 20 46 69 65 6c 64 34 20 3d 20 72 64  ject Field4 = rd
36d0: 2e 47 65 74 53 74 72 69 6e 67 28 33 29 2e 54 72  .GetString(3).Tr
36e0: 69 6d 45 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20  imEnd();..      
36f0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 46 69 65        object Fie
3700: 6c 64 35 20 3d 20 72 64 2e 47 65 74 44 61 74 65  ld5 = rd.GetDate
3710: 54 69 6d 65 28 34 29 3b 0d 0a 0d 0a 20 20 20 20  Time(4);....    
3720: 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 6e          // The n
3730: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 73 68  ext statement sh
3740: 6f 75 6c 64 20 63 61 75 73 65 20 61 6e 20 65 78  ould cause an ex
3750: 63 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  ception..       
3760: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
3770: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3780: 20 20 20 20 20 20 20 46 69 65 6c 64 31 20 3d 20         Field1 = 
3790: 72 64 2e 47 65 74 53 74 72 69 6e 67 28 30 29 3b  rd.GetString(0);
37a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
37b0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
37c0: 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65  ion("Should have
37d0: 20 66 61 69 6c 65 64 20 74 79 70 65 20 63 68 65   failed type che
37e0: 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20  cking!");..     
37f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3800: 20 20 20 20 20 20 63 61 74 63 68 20 28 49 6e 76        catch (Inv
3810: 61 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f  alidCastExceptio
3820: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
3830: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  {..            }
3840: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3850: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
3860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3870: 20 20 46 69 65 6c 64 32 20 3d 20 72 64 2e 47 65    Field2 = rd.Ge
3880: 74 53 74 72 69 6e 67 28 31 29 3b 0d 0a 20 20 20  tString(1);..   
3890: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
38a0: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
38b0: 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c  Should have fail
38c0: 65 64 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67  ed type checking
38d0: 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  !");..          
38e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
38f0: 20 63 61 74 63 68 20 28 49 6e 76 61 6c 69 64 43   catch (InvalidC
3900: 61 73 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20  astException).. 
3910: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3920: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3930: 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 33 20           Field3 
3940: 3d 20 72 64 2e 47 65 74 53 74 72 69 6e 67 28 32  = rd.GetString(2
3950: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
3960: 46 69 65 6c 64 34 20 3d 20 72 64 2e 47 65 74 53  Field4 = rd.GetS
3970: 74 72 69 6e 67 28 33 29 3b 0d 0a 0d 0a 20 20 20  tring(3);....   
3980: 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 31 20           Field1 
3990: 3d 20 72 64 2e 47 65 74 49 6e 74 33 32 28 30 29  = rd.GetInt32(0)
39a0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
39b0: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20   try..          
39c0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
39d0: 20 20 20 46 69 65 6c 64 32 20 3d 20 72 64 2e 47     Field2 = rd.G
39e0: 65 74 49 6e 74 33 32 28 31 29 3b 0d 0a 20 20 20  etInt32(1);..   
39f0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
3a00: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
3a10: 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c  Should have fail
3a20: 65 64 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67  ed type checking
3a30: 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  !");..          
3a40: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3a50: 20 63 61 74 63 68 20 28 49 6e 76 61 6c 69 64 43   catch (InvalidC
3a60: 61 73 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20  astException).. 
3a70: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3a80: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3a90: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65               Fie
3ac0: 6c 64 33 20 3d 20 72 64 2e 47 65 74 49 6e 74 33  ld3 = rd.GetInt3
3ad0: 32 28 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  2(2);..         
3ae0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
3af0: 78 63 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64  xception("Should
3b00: 20 68 61 76 65 20 66 61 69 6c 65 64 20 74 79 70   have failed typ
3b10: 65 20 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a  e checking!");..
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3b30: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
3b40: 20 28 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63   (InvalidCastExc
3b50: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
3b60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3b70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3b80: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
3b90: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3ba0: 20 20 20 20 20 20 20 46 69 65 6c 64 34 20 3d 20         Field4 = 
3bb0: 72 64 2e 47 65 74 49 6e 74 33 32 28 33 29 3b 0d  rd.GetInt32(3);.
3bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
3bd0: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
3be0: 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65 20  on("Should have 
3bf0: 66 61 69 6c 65 64 20 74 79 70 65 20 63 68 65 63  failed type chec
3c00: 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20 20  king!");..      
3c10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3c20: 20 20 20 20 20 63 61 74 63 68 20 28 49 6e 76 61       catch (Inva
3c30: 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e  lidCastException
3c40: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
3c50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
3c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
3c70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
3c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
3c90: 69 65 6c 64 35 20 3d 20 72 64 2e 47 65 74 49 6e  ield5 = rd.GetIn
3ca0: 74 33 32 28 34 29 3b 0d 0a 20 20 20 20 20 20 20  t32(4);..       
3cb0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
3cc0: 20 45 78 63 65 70 74 69 6f 6e 28 22 53 68 6f 75   Exception("Shou
3cd0: 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64 20 74  ld have failed t
3ce0: 79 70 65 20 63 68 65 63 6b 69 6e 67 21 22 29 3b  ype checking!");
3cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
3d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
3d10: 63 68 20 28 49 6e 76 61 6c 69 64 43 61 73 74 45  ch (InvalidCastE
3d20: 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20  xception)..     
3d30: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3d40: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3d50: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
3d60: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3d70: 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 33 20           Field3 
3d80: 3d 20 72 64 2e 47 65 74 44 65 63 69 6d 61 6c 28  = rd.GetDecimal(
3d90: 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2);..           
3da0: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63     throw new Exc
3db0: 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68  eption("Should h
3dc0: 61 76 65 20 66 61 69 6c 65 64 20 74 79 70 65 20  ave failed type 
3dd0: 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20  checking!");..  
3de0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3df0: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
3e00: 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65 70  InvalidCastExcep
3e10: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
3e20: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3e30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3e40: 20 63 61 74 63 68 20 28 46 6f 72 6d 61 74 45 78   catch (FormatEx
3e50: 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ception)..      
3e60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3e70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3e80: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
3e90: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3ea0: 20 20 20 20 20 20 46 69 65 6c 64 34 20 3d 20 72        Field4 = r
3eb0: 64 2e 47 65 74 44 65 63 69 6d 61 6c 28 33 29 3b  d.GetDecimal(3);
3ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ed0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
3ee0: 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65  ion("Should have
3ef0: 20 66 61 69 6c 65 64 20 74 79 70 65 20 63 68 65   failed type che
3f00: 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20  cking!");..     
3f10: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3f20: 20 20 20 20 20 20 63 61 74 63 68 20 28 49 6e 76        catch (Inv
3f30: 61 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f  alidCastExceptio
3f40: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
3f50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  {..            }
3f60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
3f70: 74 63 68 20 28 46 6f 72 6d 61 74 45 78 63 65 70  tch (FormatExcep
3f80: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
3f90: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3fa0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3fb0: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20   try..          
3fc0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
3fd0: 20 20 20 46 69 65 6c 64 35 20 3d 20 72 64 2e 47     Field5 = rd.G
3fe0: 65 74 44 65 63 69 6d 61 6c 28 34 29 3b 0d 0a 20  etDecimal(4);.. 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
4000: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
4010: 28 22 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61  ("Should have fa
4020: 69 6c 65 64 20 74 79 70 65 20 63 68 65 63 6b 69  iled type checki
4030: 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ng!");..        
4040: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4050: 20 20 20 63 61 74 63 68 20 28 49 6e 76 61 6c 69     catch (Invali
4060: 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 29 0d  dCastException).
4070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
4080: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
4090: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
40a0: 20 28 46 6f 72 6d 61 74 45 78 63 65 70 74 69 6f   (FormatExceptio
40b0: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
40c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  {..            }
40d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
40e0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 74 68           else th
40f0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
4100: 6e 28 22 4e 6f 20 64 61 74 61 20 69 6e 20 74 61  n("No data in ta
4110: 62 6c 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ble");..        
4120: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
4130: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53  }....    [Test(S
4140: 65 71 75 65 6e 63 65 20 3d 20 31 30 29 5d 0d 0a  equence = 10)]..
4150: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
4160: 64 20 43 72 65 61 74 65 54 61 62 6c 65 28 29 0d  d CreateTable().
4170: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 64 72  .    {..      dr
4180: 6f 70 74 61 62 6c 65 73 2e 41 64 64 28 22 54 65  optables.Add("Te
4190: 73 74 43 61 73 65 22 29 3b 0d 0a 0d 0a 20 20 20  stCase");....   
41a0: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
41b0: 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43  and cmd = _cnn.C
41c0: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
41d0: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
41e0: 20 20 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54    if (_fact.GetT
41f0: 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78  ype().Name.Index
4200: 4f 66 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72  Of("SQLite", Str
4210: 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72  ingComparison.Or
4220: 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29  dinalIgnoreCase)
4230: 20 3d 3d 20 2d 31 29 0d 0a 20 20 20 20 20 20 20   == -1)..       
4240: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
4250: 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41 42  xt = "CREATE TAB
4260: 4c 45 20 54 65 73 74 43 61 73 65 20 28 49 44 20  LE TestCase (ID 
4270: 62 69 67 69 6e 74 20 70 72 69 6d 61 72 79 20 6b  bigint primary k
4280: 65 79 20 69 64 65 6e 74 69 74 79 2c 20 46 69 65  ey identity, Fie
4290: 6c 64 31 20 69 6e 74 65 67 65 72 2c 20 46 69 65  ld1 integer, Fie
42a0: 6c 64 32 20 46 6c 6f 61 74 2c 20 5b 46 69 c3 ab  ld2 Float, [Fi..
42b0: 6c 64 33 5d 20 56 41 52 43 48 41 52 28 35 30 29  ld3] VARCHAR(50)
42c0: 2c 20 5b 46 69 c3 a6 6c 64 34 5d 20 43 48 41 52  , [Fi..ld4] CHAR
42d0: 28 31 30 29 2c 20 46 69 65 6c 64 35 20 44 61 74  (10), Field5 Dat
42e0: 65 54 69 6d 65 2c 20 46 69 65 6c 64 36 20 49 6d  eTime, Field6 Im
42f0: 61 67 65 29 22 3b 0d 0a 20 20 20 20 20 20 20 20  age)";..        
4300: 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
4310: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
4320: 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  = "CREATE TABLE 
4330: 54 65 73 74 43 61 73 65 20 28 49 44 20 69 6e 74  TestCase (ID int
4340: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
4350: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 20   autoincrement, 
4360: 46 69 65 6c 64 31 20 69 6e 74 2c 20 46 69 65 6c  Field1 int, Fiel
4370: 64 32 20 46 6c 6f 61 74 2c 20 5b 46 69 c3 ab 6c  d2 Float, [Fi..l
4380: 64 33 5d 20 56 41 52 43 48 41 52 28 35 30 29 2c  d3] VARCHAR(50),
4390: 20 5b 46 69 c3 a6 6c 64 34 5d 20 43 48 41 52 28   [Fi..ld4] CHAR(
43a0: 31 30 29 2c 20 46 69 65 6c 64 35 20 44 61 74 65  10), Field5 Date
43b0: 54 69 6d 65 2c 20 46 69 65 6c 64 36 20 49 6d 61  Time, Field6 Ima
43c0: 67 65 29 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ge)";....       
43d0: 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51   cmd.ExecuteNonQ
43e0: 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 7d  uery();..      }
43f0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b  ..    }....    [
4400: 54 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20  Test(Sequence = 
4410: 31 31 30 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65  1100)]..    inte
4420: 72 6e 61 6c 20 73 74 72 69 6e 67 20 44 61 74 61  rnal string Data
4430: 41 64 61 70 74 65 72 54 65 73 74 28 29 0d 0a 20  AdapterTest().. 
4440: 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75     {..      retu
4450: 72 6e 20 44 61 74 61 41 64 61 70 74 65 72 28 66  rn DataAdapter(f
4460: 61 6c 73 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  alse);..    }...
4470: 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65  .    [Test(Seque
4480: 6e 63 65 20 3d 20 31 32 30 30 29 5d 0d 0a 20 20  nce = 1200)]..  
4490: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e    internal strin
44a0: 67 20 44 61 74 61 41 64 61 70 74 65 72 57 69 74  g DataAdapterWit
44b0: 68 49 64 65 6e 74 69 74 79 46 65 74 63 68 28 29  hIdentityFetch()
44c0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72  ..    {..      r
44d0: 65 74 75 72 6e 20 44 61 74 61 41 64 61 70 74 65  eturn DataAdapte
44e0: 72 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 7d 0d  r(true);..    }.
44f0: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
4500: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 55 74  ary>..    /// Ut
4510: 69 6c 69 7a 65 73 20 74 68 65 20 53 51 4c 69 74  ilizes the SQLit
4520: 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65 72 2c  eCommandBuilder,
4530: 20 0d 0a 20 20 20 20 2f 2f 2f 20 77 68 69 63 68   ..    /// which
4540: 20 69 6e 20 74 75 72 6e 20 75 74 69 6c 69 7a 65   in turn utilize
4550: 73 20 53 51 4c 69 74 65 44 61 74 61 52 65 61 64  s SQLiteDataRead
4560: 65 72 27 73 20 47 65 74 53 63 68 65 6d 61 54 61  er's GetSchemaTa
4570: 62 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c  ble() functional
4580: 69 74 79 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69  ity..    /// Thi
4590: 73 20 69 6e 73 65 72 74 20 69 73 20 73 6c 6f 77  s insert is slow
45a0: 20 62 65 63 61 75 73 65 20 69 74 20 6d 75 73 74   because it must
45b0: 20 72 61 69 73 65 20 63 61 6c 6c 62 61 63 6b 73   raise callbacks
45c0: 20 62 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65   before and afte
45d0: 72 20 65 76 65 72 79 20 75 70 64 61 74 65 2e 0d  r every update..
45e0: 0a 20 20 20 20 2f 2f 2f 20 46 6f 72 20 61 20 66  .    /// For a f
45f0: 61 73 74 20 75 70 64 61 74 65 2c 20 73 65 65 20  ast update, see 
4600: 74 68 65 20 46 61 73 74 49 6e 73 65 72 74 4d 61  the FastInsertMa
4610: 6e 79 20 66 75 6e 63 74 69 6f 6e 20 62 65 6e 65  ny function bene
4620: 61 74 68 20 74 68 69 73 20 6f 6e 65 0d 0a 20 20  ath this one..  
4630: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
4640: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
4650: 74 72 69 6e 67 20 44 61 74 61 41 64 61 70 74 65  tring DataAdapte
4660: 72 28 62 6f 6f 6c 20 62 57 69 74 68 49 64 65 6e  r(bool bWithIden
4670: 74 69 74 79 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  tity)..    {..  
4680: 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65      StringBuilde
4690: 72 20 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20  r builder = new 
46a0: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b  StringBuilder();
46b0: 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  ....      using 
46c0: 28 44 62 54 72 61 6e 73 61 63 74 69 6f 6e 20 64  (DbTransaction d
46d0: 62 54 72 61 6e 73 20 3d 20 5f 63 6e 6e 2e 42 65  bTrans = _cnn.Be
46e0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  ginTransaction()
46f0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
4700: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
4710: 61 41 64 61 70 74 65 72 20 61 64 70 20 3d 20 5f  aAdapter adp = _
4720: 66 61 63 74 2e 43 72 65 61 74 65 44 61 74 61 41  fact.CreateDataA
4730: 64 61 70 74 65 72 28 29 29 0d 0a 20 20 20 20 20  dapter())..     
4740: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4750: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
4760: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
4770: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
4780: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
4790: 20 20 20 20 20 20 20 63 6d 64 2e 54 72 61 6e 73         cmd.Trans
47a0: 61 63 74 69 6f 6e 20 3d 20 64 62 54 72 61 6e 73  action = dbTrans
47b0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ;..            c
47c0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
47d0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
47e0: 54 65 73 74 43 61 73 65 20 57 48 45 52 45 20 31  TestCase WHERE 1
47f0: 20 3d 20 32 22 3b 0d 0a 20 20 20 20 20 20 20 20   = 2";..        
4800: 20 20 20 20 61 64 70 2e 53 65 6c 65 63 74 43 6f      adp.SelectCo
4810: 6d 6d 61 6e 64 20 3d 20 63 6d 64 3b 0d 0a 0d 0a  mmand = cmd;....
4820: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
4830: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 42 75 69 6c  g (DbCommandBuil
4840: 64 65 72 20 62 6c 64 20 3d 20 5f 66 61 63 74 2e  der bld = _fact.
4850: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 42 75 69  CreateCommandBui
4860: 6c 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  lder())..       
4870: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4880: 20 20 20 20 20 20 62 6c 64 2e 44 61 74 61 41 64        bld.DataAd
4890: 61 70 74 65 72 20 3d 20 61 64 70 3b 0d 0a 20 20  apter = adp;..  
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
48b0: 67 20 28 61 64 70 2e 49 6e 73 65 72 74 43 6f 6d  g (adp.InsertCom
48c0: 6d 61 6e 64 20 3d 20 28 44 62 43 6f 6d 6d 61 6e  mand = (DbComman
48d0: 64 29 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 62  d)((ICloneable)b
48e0: 6c 64 2e 47 65 74 49 6e 73 65 72 74 43 6f 6d 6d  ld.GetInsertComm
48f0: 61 6e 64 28 29 29 2e 43 6c 6f 6e 65 28 29 29 0d  and()).Clone()).
4900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
4910: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4920: 20 20 69 66 20 28 62 57 69 74 68 49 64 65 6e 74    if (bWithIdent
4930: 69 74 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ity)..          
4940: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4950: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f             if (_
4960: 66 61 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e  fact.GetType().N
4970: 61 6d 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c  ame.IndexOf("SQL
4980: 69 74 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70  ite", StringComp
4990: 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67  arison.OrdinalIg
49a0: 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20 2d 31 29  noreCase) == -1)
49b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
49c0: 20 20 20 20 20 20 61 64 70 2e 49 6e 73 65 72 74        adp.Insert
49d0: 43 6f 6d 6d 61 6e 64 2e 43 6f 6d 6d 61 6e 64 54  Command.CommandT
49e0: 65 78 74 20 2b 3d 20 22 3b 53 45 4c 45 43 54 20  ext += ";SELECT 
49f0: 53 43 4f 50 45 5f 49 44 45 4e 54 49 54 59 28 29  SCOPE_IDENTITY()
4a00: 20 41 53 20 5b 49 44 5d 22 3b 0d 0a 20 20 20 20   AS [ID]";..    
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
4a20: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
4a30: 20 20 20 20 20 20 20 20 61 64 70 2e 49 6e 73 65          adp.Inse
4a40: 72 74 43 6f 6d 6d 61 6e 64 2e 43 6f 6d 6d 61 6e  rtCommand.Comman
4a50: 64 54 65 78 74 20 2b 3d 20 22 3b 53 45 4c 45 43  dText += ";SELEC
4a60: 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  T last_insert_ro
4a70: 77 69 64 28 29 20 41 53 20 5b 49 44 5d 22 3b 0d  wid() AS [ID]";.
4a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a90: 20 20 20 61 64 70 2e 49 6e 73 65 72 74 43 6f 6d     adp.InsertCom
4aa0: 6d 61 6e 64 2e 55 70 64 61 74 65 64 52 6f 77 53  mand.UpdatedRowS
4ab0: 6f 75 72 63 65 20 3d 20 55 70 64 61 74 65 52 6f  ource = UpdateRo
4ac0: 77 53 6f 75 72 63 65 2e 46 69 72 73 74 52 65 74  wSource.FirstRet
4ad0: 75 72 6e 65 64 52 65 63 6f 72 64 3b 0d 0a 20 20  urnedRecord;..  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
4af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b00: 20 62 6c 64 2e 44 61 74 61 41 64 61 70 74 65 72   bld.DataAdapter
4b10: 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20   = null;....    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
4b30: 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c  g (DataTable tbl
4b40: 20 3d 20 6e 65 77 20 44 61 74 61 54 61 62 6c 65   = new DataTable
4b50: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ())..           
4b60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4b70: 20 20 20 20 20 20 20 20 20 20 61 64 70 2e 46 69            adp.Fi
4b80: 6c 6c 28 74 62 6c 29 3b 0d 0a 20 20 20 20 20 20  ll(tbl);..      
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
4ba0: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
4bb0: 31 30 30 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20  10000; n++)..   
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4be0: 20 20 20 20 20 20 44 61 74 61 52 6f 77 20 72 6f        DataRow ro
4bf0: 77 20 3d 20 74 62 6c 2e 4e 65 77 52 6f 77 28 29  w = tbl.NewRow()
4c00: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
4c10: 20 20 20 20 20 20 20 72 6f 77 5b 31 5d 20 3d 20         row[1] = 
4c20: 6e 20 2b 20 28 35 30 30 30 30 20 2a 20 28 28 62  n + (50000 * ((b
4c30: 57 69 74 68 49 64 65 6e 74 69 74 79 20 3d 3d 20  WithIdentity == 
4c40: 74 72 75 65 29 20 3f 20 32 20 3a 20 31 29 29 3b  true) ? 2 : 1));
4c50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4c60: 20 20 20 20 20 20 74 62 6c 2e 52 6f 77 73 2e 41        tbl.Rows.A
4c70: 64 64 28 72 6f 77 29 3b 0d 0a 20 20 20 20 20 20  dd(row);..      
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
4c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ca0: 20 20 20 2f 2f 43 6f 6e 73 6f 6c 65 2e 57 72 69     //Console.Wri
4cb0: 74 65 4c 69 6e 65 28 53 74 72 69 6e 67 2e 46 6f  teLine(String.Fo
4cc0: 72 6d 61 74 28 22 20 20 20 20 20 20 20 20 20 20  rmat("          
4cd0: 49 6e 73 65 72 74 69 6e 67 20 75 73 69 6e 67 20  Inserting using 
4ce0: 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65 72 20 61  CommandBuilder a
4cf0: 6e 64 20 44 61 74 61 41 64 61 70 74 65 72 5c 72  nd DataAdapter\r
4d00: 5c 6e 20 20 20 20 20 20 20 20 20 20 2d 3e 7b 30  \n          ->{0
4d10: 7d 20 28 31 30 2c 30 30 30 20 72 6f 77 73 29 20  } (10,000 rows) 
4d20: 2e 2e 2e 22 2c 20 28 62 57 69 74 68 49 64 65 6e  ...", (bWithIden
4d30: 74 69 74 79 20 3d 3d 20 74 72 75 65 29 20 3f 20  tity == true) ? 
4d40: 22 28 77 69 74 68 20 69 64 65 6e 74 69 74 79 20  "(with identity 
4d50: 66 65 74 63 68 29 22 20 3a 20 22 22 29 29 3b 0d  fetch)" : ""));.
4d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d70: 20 20 20 69 6e 74 20 64 74 53 74 61 72 74 20 3d     int dtStart =
4d80: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
4d90: 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20  kCount;..       
4da0: 20 20 20 20 20 20 20 20 20 20 20 61 64 70 2e 55             adp.U
4db0: 70 64 61 74 65 28 74 62 6c 29 3b 0d 0a 20 20 20  pdate(tbl);..   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4dd0: 6e 74 20 64 74 45 6e 64 20 3d 20 45 6e 76 69 72  nt dtEnd = Envir
4de0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
4df0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
4e00: 20 20 20 20 20 64 74 45 6e 64 20 2d 3d 20 64 74       dtEnd -= dt
4e10: 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20  Start;..        
4e20: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 65            builde
4e30: 72 2e 41 70 70 65 6e 64 46 6f 72 6d 61 74 28 22  r.AppendFormat("
4e40: 49 6e 73 65 72 74 20 45 6e 64 73 20 69 6e 20 7b  Insert Ends in {
4e50: 30 7d 20 6d 73 20 2e 2e 2e 20 22 2c 20 28 64 74  0} ms ... ", (dt
4e60: 45 6e 64 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  End));....      
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 64 74 53 74              dtSt
4e80: 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  art = Environmen
4e90: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 64 62 54 72 61 6e 73 2e 43 6f 6d 6d 69 74 28 29  dbTrans.Commit()
4ec0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
4ed0: 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45 6e 76       dtEnd = Env
4ee0: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
4ef0: 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt;..           
4f00: 20 20 20 20 20 20 20 64 74 45 6e 64 20 2d 3d 20         dtEnd -= 
4f10: 64 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20  dtStart;..      
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69 6c              buil
4f30: 64 65 72 2e 41 70 70 65 6e 64 46 6f 72 6d 61 74  der.AppendFormat
4f40: 28 22 43 6f 6d 6d 69 74 73 20 69 6e 20 7b 30 7d  ("Commits in {0}
4f50: 20 6d 73 22 2c 20 28 64 74 45 6e 64 29 29 3b 0d   ms", (dtEnd));.
4f60: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4f70: 20 20 20 20 20 69 66 20 28 62 57 69 74 68 49 64       if (bWithId
4f80: 65 6e 74 69 74 79 29 0d 0a 20 20 20 20 20 20 20  entity)..       
4f90: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 75 73 69 6e 67 20 28 44 61 74 61 54 61 62    using (DataTab
4fc0: 6c 65 20 74 62 6c 32 20 3d 20 6e 65 77 20 44 61  le tbl2 = new Da
4fd0: 74 61 54 61 62 6c 65 28 29 29 0d 0a 20 20 20 20  taTable())..    
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5000: 20 20 20 20 20 20 20 20 20 61 64 70 2e 53 65 6c           adp.Sel
5010: 65 63 74 43 6f 6d 6d 61 6e 64 2e 43 6f 6d 6d 61  ectCommand.Comma
5020: 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54  ndText = "SELECT
5030: 20 2a 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65   * FROM TestCase
5040: 20 57 48 45 52 45 20 46 69 65 6c 64 31 20 42 45   WHERE Field1 BE
5050: 54 57 45 45 4e 20 31 30 30 30 30 30 20 41 4e 44  TWEEN 100000 AND
5060: 20 31 39 39 39 39 39 20 4f 52 44 45 52 20 42 59   199999 ORDER BY
5070: 20 46 69 65 6c 64 31 22 3b 0d 0a 20 20 20 20 20   Field1";..     
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 61 64 70 2e 46 69 6c 6c 28 74 62 6c 32 29 3b   adp.Fill(tbl2);
50a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
50b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 62            if (tb
50c0: 6c 32 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d  l2.Rows.Count !=
50d0: 20 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 29   tbl.Rows.Count)
50e0: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
50f0: 74 69 6f 6e 28 22 53 65 6c 65 63 74 65 64 20 64  tion("Selected d
5100: 61 74 61 20 64 6f 65 73 6e 27 74 20 6d 61 74 63  ata doesn't matc
5110: 68 20 75 70 64 61 74 65 64 20 64 61 74 61 21 22  h updated data!"
5120: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
5130: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
5140: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
5150: 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 3b 20  tbl.Rows.Count; 
5160: 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20  n++)..          
5170: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 69 66 20 28 74 62 6c 2e 52         if (tbl.R
51a0: 6f 77 73 5b 6e 5d 5b 30 5d 2e 45 71 75 61 6c 73  ows[n][0].Equals
51b0: 28 74 62 6c 32 2e 52 6f 77 73 5b 6e 5d 5b 30 5d  (tbl2.Rows[n][0]
51c0: 29 20 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20  ) == false)..   
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
51f0: 20 45 78 63 65 70 74 69 6f 6e 28 22 46 65 74 63   Exception("Fetc
5200: 68 65 64 20 69 64 65 6e 74 69 74 79 20 64 6f 65  hed identity doe
5210: 73 6e 27 74 20 6d 61 74 63 68 20 73 65 6c 65 63  sn't match selec
5220: 74 65 64 20 69 64 65 6e 74 69 74 79 21 22 29 3b  ted identity!");
5230: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5240: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5260: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5270: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
5280: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5290: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
52a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
52b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
52c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
52d0: 20 72 65 74 75 72 6e 20 62 75 69 6c 64 65 72 2e   return builder.
52e0: 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20  ToString();..   
52f0: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
5300: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
5310: 20 4d 61 6b 65 20 73 75 72 65 20 61 20 64 61 74   Make sure a dat
5320: 61 72 65 61 64 65 72 20 63 61 6e 20 72 75 6e 20  areader can run 
5330: 65 76 65 6e 20 69 66 20 74 68 65 20 70 61 72 65  even if the pare
5340: 6e 74 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 69  nt command is di
5350: 73 70 6f 73 65 64 2c 20 61 6e 64 20 74 68 61 74  sposed, and that
5360: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5370: 69 73 20 63 6c 6f 73 65 64 0d 0a 20 20 20 20 2f  is closed..    /
5380: 2f 2f 20 62 79 20 74 68 65 20 64 61 74 61 72 65  // by the datare
5390: 61 64 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  ader when it is 
53a0: 66 69 6e 69 73 68 65 64 2e 0d 0a 20 20 20 20 2f  finished...    /
53b0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
53c0: 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69     [Test]..    i
53d0: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 44 61 74  nternal void Dat
53e0: 61 52 65 61 64 65 72 43 6c 65 61 6e 75 70 28 29  aReaderCleanup()
53f0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 44  ..    {..      D
5400: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63  bConnection newc
5410: 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c  nn = ((ICloneabl
5420: 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20  e)_cnn).Clone() 
5430: 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 3b  as DbConnection;
5440: 0d 0a 20 20 20 20 20 20 44 62 43 6f 6d 6d 61 6e  ..      DbComman
5450: 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e 43  d cmd = newcnn.C
5460: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 3b 0d  reateCommand();.
5470: 0a 0d 0a 20 20 20 20 20 20 74 72 79 0d 0a 20 20  ...      try..  
5480: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69      {..        i
5490: 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61 74 65 20  f (newcnn.State 
54a0: 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61  != ConnectionSta
54b0: 74 65 2e 4f 70 65 6e 29 0d 0a 20 20 20 20 20 20  te.Open)..      
54c0: 20 20 20 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28      newcnn.Open(
54d0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d  );....        cm
54e0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
54f0: 22 53 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 22  "SELECT 1, 2, 3"
5500: 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ;..        using
5510: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
5520: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
5530: 75 74 65 52 65 61 64 65 72 28 43 6f 6d 6d 61 6e  uteReader(Comman
5540: 64 42 65 68 61 76 69 6f 72 2e 43 6c 6f 73 65 43  dBehavior.CloseC
5550: 6f 6e 6e 65 63 74 69 6f 6e 29 29 0d 0a 20 20 20  onnection))..   
5560: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5570: 20 20 63 6d 64 2e 44 69 73 70 6f 73 65 28 29 3b    cmd.Dispose();
5580: 20 2f 2f 20 44 69 73 70 6f 73 65 20 6f 66 20 74   // Dispose of t
5590: 68 65 20 63 6f 6d 6d 61 6e 64 20 77 68 69 6c 65  he command while
55a0: 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 65 72 20   an open reader 
55b0: 69 73 20 61 63 74 69 76 65 20 2e 2e 2e 20 73 68  is active ... sh
55c0: 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 61 62  ould still be ab
55d0: 6c 65 20 74 6f 20 72 65 61 64 0d 0a 20 20 20 20  le to read..    
55e0: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
55f0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5600: 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64 28      reader.Read(
5610: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
5620: 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
5630: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
5640: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
5650: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
5660: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 66  Unable to read f
5670: 72 6f 6d 20 61 20 44 61 74 61 52 65 61 64 65 72  rom a DataReader
5680: 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  !");..          
5690: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
56a0: 66 20 28 72 65 61 64 65 72 2e 47 65 74 49 6e 74  f (reader.GetInt
56b0: 33 32 28 30 29 20 21 3d 20 31 20 7c 7c 20 72 65  32(0) != 1 || re
56c0: 61 64 65 72 2e 47 65 74 49 6e 74 33 32 28 31 29  ader.GetInt32(1)
56d0: 20 21 3d 20 32 20 7c 7c 20 72 65 61 64 65 72 2e   != 2 || reader.
56e0: 47 65 74 49 6e 74 33 32 28 32 29 20 21 3d 20 33  GetInt32(2) != 3
56f0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  )..            t
5700: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
5710: 6f 6e 28 22 55 6e 65 78 70 65 63 74 65 64 20 72  on("Unexpected r
5720: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 66 72 6f  eturn values fro
5730: 6d 20 72 65 61 64 65 72 21 22 29 3b 0d 0a 0d 0a  m reader!");....
5740: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65 72            reader
5750: 2e 43 6c 6f 73 65 28 29 3b 20 2f 2f 20 43 6c 6f  .Close(); // Clo
5760: 73 65 20 74 68 65 20 72 65 61 64 65 72 2c 20 61  se the reader, a
5770: 6e 64 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  nd check if the 
5780: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c  connection is cl
5790: 6f 73 65 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20  osed....        
57a0: 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61    if (newcnn.Sta
57b0: 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e  te != Connection
57c0: 53 74 61 74 65 2e 43 6c 6f 73 65 64 29 0d 0a 20  State.Closed).. 
57d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
57e0: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
57f0: 44 61 74 61 52 65 61 64 65 72 20 66 61 69 6c 65  DataReader faile
5800: 64 20 74 6f 20 63 6c 65 61 6e 75 70 21 22 29 3b  d to cleanup!");
5810: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
5820: 20 20 20 7d 0d 0a 20 20 20 20 20 20 66 69 6e 61     }..      fina
5830: 6c 6c 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  lly..      {..  
5840: 20 20 20 20 20 20 63 6d 64 2e 44 69 73 70 6f 73        cmd.Dispos
5850: 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 6e 65  e();..        ne
5860: 77 63 6e 6e 2e 44 69 73 70 6f 73 65 28 29 3b 0d  wcnn.Dispose();.
5870: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
5880: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20  ...    [Test].. 
5890: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
58a0: 20 44 61 74 61 54 79 70 65 54 65 73 74 28 29 0d   DataTypeTest().
58b0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 44 61  .    {..      Da
58c0: 74 65 54 69 6d 65 20 6e 6f 77 20 3d 20 44 61 74  teTime now = Dat
58d0: 65 54 69 6d 65 2e 4e 6f 77 3b 0d 0a 0d 0a 20 20  eTime.Now;....  
58e0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
58f0: 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e  mand cmd = _cnn.
5900: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
5910: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
5920: 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64     droptables.Ad
5930: 64 28 22 64 61 74 61 74 79 70 65 74 65 73 74 22  d("datatypetest"
5940: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  );....        if
5950: 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70 65 28   (_fact.GetType(
5960: 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66 28 22  ).Name.IndexOf("
5970: 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e 67 43  SQLite", StringC
5980: 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61  omparison.Ordina
5990: 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20  lIgnoreCase) == 
59a0: 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20 63  -1)..          c
59b0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
59c0: 20 22 63 72 65 61 74 65 20 74 61 62 6c 65 20 64   "create table d
59d0: 61 74 61 74 79 70 65 74 65 73 74 28 69 64 20 62  atatypetest(id b
59e0: 69 67 69 6e 74 20 69 64 65 6e 74 69 74 79 20 70  igint identity p
59f0: 72 69 6d 61 72 79 20 6b 65 79 2c 20 6d 79 76 61  rimary key, myva
5a00: 6c 75 65 20 73 71 6c 5f 76 61 72 69 61 6e 74 2c  lue sql_variant,
5a10: 20 64 61 74 65 74 69 6d 65 76 61 6c 75 65 20 64   datetimevalue d
5a20: 61 74 65 74 69 6d 65 2c 20 64 65 63 69 6d 61 6c  atetime, decimal
5a30: 76 61 6c 75 65 20 64 65 63 69 6d 61 6c 28 33 38  value decimal(38
5a40: 2c 31 38 29 29 22 3b 0d 0a 20 20 20 20 20 20 20  ,18))";..       
5a50: 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
5a60: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
5a70: 20 3d 20 22 63 72 65 61 74 65 20 74 61 62 6c 65   = "create table
5a80: 20 64 61 74 61 74 79 70 65 74 65 73 74 28 69 64   datatypetest(id
5a90: 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   integer primary
5aa0: 20 6b 65 79 2c 20 6d 79 76 61 6c 75 65 20 73 71   key, myvalue sq
5ab0: 6c 5f 76 61 72 69 61 6e 74 2c 20 64 61 74 65 74  l_variant, datet
5ac0: 69 6d 65 76 61 6c 75 65 20 64 61 74 65 74 69 6d  imevalue datetim
5ad0: 65 2c 20 64 65 63 69 6d 61 6c 76 61 6c 75 65 20  e, decimalvalue 
5ae0: 64 65 63 69 6d 61 6c 28 33 38 2c 31 38 29 29 22  decimal(38,18))"
5af0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ;....        cmd
5b00: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
5b10: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 53  ();....        S
5b20: 79 73 74 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74  ystem.Globalizat
5b30: 69 6f 6e 2e 43 75 6c 74 75 72 65 49 6e 66 6f 20  ion.CultureInfo 
5b40: 6f 6c 64 63 75 6c 74 75 72 65 20 3d 20 53 79 73  oldculture = Sys
5b50: 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68  tem.Threading.Th
5b60: 72 65 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65  read.CurrentThre
5b70: 61 64 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72  ad.CurrentCultur
5b80: 65 3b 0d 0a 20 20 20 20 20 20 20 20 53 79 73 74  e;..        Syst
5b90: 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e  em.Globalization
5ba0: 2e 43 75 6c 74 75 72 65 49 6e 66 6f 20 6f 6c 64  .CultureInfo old
5bb0: 75 69 63 75 6c 74 75 72 65 20 3d 20 53 79 73 74  uiculture = Syst
5bc0: 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72  em.Threading.Thr
5bd0: 65 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61  ead.CurrentThrea
5be0: 64 2e 43 75 72 72 65 6e 74 55 49 43 75 6c 74 75  d.CurrentUICultu
5bf0: 72 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  re;....        /
5c00: 2f 20 49 6e 73 65 72 74 20 75 73 69 6e 67 20 61  / Insert using a
5c10: 20 64 69 66 66 65 72 65 6e 74 20 63 75 72 72 65   different curre
5c20: 6e 74 20 63 75 6c 74 75 72 65 0d 0a 20 20 20 20  nt culture..    
5c30: 20 20 20 20 53 79 73 74 65 6d 2e 54 68 72 65 61      System.Threa
5c40: 64 69 6e 67 2e 54 68 72 65 61 64 2e 43 75 72 72  ding.Thread.Curr
5c50: 65 6e 74 54 68 72 65 61 64 2e 43 75 72 72 65 6e  entThread.Curren
5c60: 74 43 75 6c 74 75 72 65 20 3d 20 6e 65 77 20 53  tCulture = new S
5c70: 79 73 74 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74  ystem.Globalizat
5c80: 69 6f 6e 2e 43 75 6c 74 75 72 65 49 6e 66 6f 28  ion.CultureInfo(
5c90: 22 65 73 2d 45 53 22 29 3b 0d 0a 20 20 20 20 20  "es-ES");..     
5ca0: 20 20 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64     System.Thread
5cb0: 69 6e 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65  ing.Thread.Curre
5cc0: 6e 74 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  ntThread.Current
5cd0: 55 49 43 75 6c 74 75 72 65 20 3d 20 53 79 73 74  UICulture = Syst
5ce0: 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72  em.Threading.Thr
5cf0: 65 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61  ead.CurrentThrea
5d00: 64 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65  d.CurrentCulture
5d10: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79  ;....        try
5d20: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
5d30: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
5d40: 6e 64 54 65 78 74 20 3d 20 22 69 6e 73 65 72 74  ndText = "insert
5d50: 20 69 6e 74 6f 20 64 61 74 61 74 79 70 65 74 65   into datatypete
5d60: 73 74 28 6d 79 76 61 6c 75 65 2c 20 64 61 74 65  st(myvalue, date
5d70: 74 69 6d 65 76 61 6c 75 65 2c 20 64 65 63 69 6d  timevalue, decim
5d80: 61 6c 76 61 6c 75 65 29 20 76 61 6c 75 65 73 28  alvalue) values(
5d90: 40 70 31 2c 40 70 32 2c 40 70 33 29 22 3b 0d 0a  @p1,@p2,@p3)";..
5da0: 20 20 20 20 20 20 20 20 20 20 44 62 50 61 72 61            DbPara
5db0: 6d 65 74 65 72 20 70 31 20 3d 20 63 6d 64 2e 43  meter p1 = cmd.C
5dc0: 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29  reateParameter()
5dd0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 44 62 50  ;..          DbP
5de0: 61 72 61 6d 65 74 65 72 20 70 32 20 3d 20 63 6d  arameter p2 = cm
5df0: 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  d.CreateParamete
5e00: 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  r();..          
5e10: 44 62 50 61 72 61 6d 65 74 65 72 20 70 33 20 3d  DbParameter p3 =
5e20: 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d   cmd.CreateParam
5e30: 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  eter();....     
5e40: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
5e50: 65 72 73 2e 41 64 64 28 70 31 29 3b 0d 0a 20 20  ers.Add(p1);..  
5e60: 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61          cmd.Para
5e70: 6d 65 74 65 72 73 2e 41 64 64 28 70 32 29 3b 0d  meters.Add(p2);.
5e80: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50  .          cmd.P
5e90: 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 70 33  arameters.Add(p3
5ea0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
5eb0: 70 31 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65  p1.ParameterName
5ec0: 20 3d 20 22 40 70 31 22 3b 0d 0a 20 20 20 20 20   = "@p1";..     
5ed0: 20 20 20 20 20 70 32 2e 50 61 72 61 6d 65 74 65       p2.Paramete
5ee0: 72 4e 61 6d 65 20 3d 20 22 40 70 32 22 3b 0d 0a  rName = "@p2";..
5ef0: 20 20 20 20 20 20 20 20 20 20 70 33 2e 50 61 72            p3.Par
5f00: 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70  ameterName = "@p
5f10: 33 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  3";....         
5f20: 20 70 31 2e 56 61 6c 75 65 20 3d 20 28 6c 6f 6e   p1.Value = (lon
5f30: 67 29 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  g)1;..          
5f40: 70 32 2e 56 61 6c 75 65 20 3d 20 6e 65 77 20 44  p2.Value = new D
5f50: 61 74 65 54 69 6d 65 28 31 37 35 33 2c 20 31 2c  ateTime(1753, 1,
5f60: 20 31 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20   1);..          
5f70: 70 33 2e 56 61 6c 75 65 20 3d 20 28 44 65 63 69  p3.Value = (Deci
5f80: 6d 61 6c 29 31 2e 30 35 3b 0d 0a 20 20 20 20 20  mal)1.05;..     
5f90: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
5fa0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20  NonQuery();.... 
5fb0: 20 20 20 20 20 20 20 20 20 70 31 2e 52 65 73 65           p1.Rese
5fc0: 74 44 62 54 79 70 65 28 29 3b 0d 0a 20 20 20 20  tDbType();..    
5fd0: 20 20 20 20 20 20 70 32 2e 52 65 73 65 74 44 62        p2.ResetDb
5fe0: 54 79 70 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  Type();..       
5ff0: 20 20 20 70 33 2e 52 65 73 65 74 44 62 54 79 70     p3.ResetDbTyp
6000: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
6010: 20 20 70 31 2e 56 61 6c 75 65 20 3d 20 22 4f 6e    p1.Value = "On
6020: 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70  e";..          p
6030: 32 2e 56 61 6c 75 65 20 3d 20 22 32 30 30 31 2d  2.Value = "2001-
6040: 30 31 2d 30 31 22 3b 0d 0a 20 20 20 20 20 20 20  01-01";..       
6050: 20 20 20 70 33 2e 56 61 6c 75 65 20 3d 20 28 44     p3.Value = (D
6060: 65 63 69 6d 61 6c 29 31 2e 30 3b 0d 0a 20 20 20  ecimal)1.0;..   
6070: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
6080: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d  teNonQuery();...
6090: 0a 20 20 20 20 20 20 20 20 20 20 70 31 2e 52 65  .          p1.Re
60a0: 73 65 74 44 62 54 79 70 65 28 29 3b 0d 0a 20 20  setDbType();..  
60b0: 20 20 20 20 20 20 20 20 70 32 2e 52 65 73 65 74          p2.Reset
60c0: 44 62 54 79 70 65 28 29 3b 0d 0a 20 20 20 20 20  DbType();..     
60d0: 20 20 20 20 20 70 33 2e 52 65 73 65 74 44 62 54       p3.ResetDbT
60e0: 79 70 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ype();....      
60f0: 20 20 20 20 70 31 2e 56 61 6c 75 65 20 3d 20 31      p1.Value = 1
6100: 2e 30 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  .01;..          
6110: 70 32 2e 56 61 6c 75 65 20 3d 20 6e 6f 77 3b 0d  p2.Value = now;.
6120: 0a 20 20 20 20 20 20 20 20 20 20 70 33 2e 56 61  .          p3.Va
6130: 6c 75 65 20 3d 20 28 44 65 63 69 6d 61 6c 29 39  lue = (Decimal)9
6140: 2e 39 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  .91;..          
6150: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
6160: 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ery();....      
6170: 20 20 20 20 2f 2f 20 52 65 61 64 20 75 73 69 6e      // Read usin
6180: 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 75  g a different cu
6190: 72 72 65 6e 74 20 63 75 6c 74 75 72 65 0d 0a 20  rrent culture.. 
61a0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
61b0: 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64  Threading.Thread
61c0: 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43  .CurrentThread.C
61d0: 75 72 72 65 6e 74 43 75 6c 74 75 72 65 20 3d 20  urrentCulture = 
61e0: 6e 65 77 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61  new System.Globa
61f0: 6c 69 7a 61 74 69 6f 6e 2e 43 75 6c 74 75 72 65  lization.Culture
6200: 49 6e 66 6f 28 22 65 6e 2d 55 53 22 29 3b 0d 0a  Info("en-US");..
6210: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
6220: 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61  .Threading.Threa
6230: 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e  d.CurrentThread.
6240: 43 75 72 72 65 6e 74 55 49 43 75 6c 74 75 72 65  CurrentUICulture
6250: 20 3d 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64   = System.Thread
6260: 69 6e 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65  ing.Thread.Curre
6270: 6e 74 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  ntThread.Current
6280: 43 75 6c 74 75 72 65 3b 0d 0a 0d 0a 20 20 20 20  Culture;....    
6290: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
62a0: 64 54 65 78 74 20 3d 20 22 73 65 6c 65 63 74 20  dText = "select 
62b0: 6d 79 76 61 6c 75 65 2c 20 64 61 74 65 74 69 6d  myvalue, datetim
62c0: 65 76 61 6c 75 65 2c 20 64 65 63 69 6d 61 6c 76  evalue, decimalv
62d0: 61 6c 75 65 20 66 72 6f 6d 20 64 61 74 61 74 79  alue from dataty
62e0: 70 65 74 65 73 74 22 3b 0d 0a 20 20 20 20 20 20  petest";..      
62f0: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
6300: 72 73 2e 43 6c 65 61 72 28 29 3b 0d 0a 20 20 20  rs.Clear();..   
6310: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
6320: 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65  DataReader reade
6330: 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  r = cmd.ExecuteR
6340: 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20  eader())..      
6350: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6360: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
6370: 30 3b 20 6e 20 3c 20 33 3b 20 6e 2b 2b 29 0d 0a  0; n < 3; n++)..
6380: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
63a0: 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20  der.Read();..   
63b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
63c0: 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31  eader.GetValue(1
63d0: 29 2e 47 65 74 54 79 70 65 28 29 20 21 3d 20 72  ).GetType() != r
63e0: 65 61 64 65 72 2e 47 65 74 44 61 74 65 54 69 6d  eader.GetDateTim
63f0: 65 28 31 29 2e 47 65 74 54 79 70 65 28 29 29 20  e(1).GetType()) 
6400: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
6410: 69 6f 6e 28 22 44 61 74 65 54 69 6d 65 20 74 79  ion("DateTime ty
6420: 70 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d  pe non-match");.
6430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
6440: 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c  f (reader.GetVal
6450: 75 65 28 32 29 2e 47 65 74 54 79 70 65 28 29 20  ue(2).GetType() 
6460: 21 3d 20 72 65 61 64 65 72 2e 47 65 74 44 65 63  != reader.GetDec
6470: 69 6d 61 6c 28 32 29 2e 47 65 74 54 79 70 65 28  imal(2).GetType(
6480: 29 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  )) throw new Exc
6490: 65 70 74 69 6f 6e 28 22 44 65 63 69 6d 61 6c 20  eption("Decimal 
64a0: 74 79 70 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29  type non-match")
64b0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
64c0: 20 20 20 73 77 69 74 63 68 20 28 6e 29 0d 0a 20     switch (n).. 
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 63 61 73 65 20 30 3a 0d 0a 20 20 20 20 20 20 20  case 0:..       
6500: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
6510: 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30  eader.GetValue(0
6520: 29 2e 47 65 74 54 79 70 65 28 29 20 21 3d 20 74  ).GetType() != t
6530: 79 70 65 6f 66 28 6c 6f 6e 67 29 29 20 74 68 72  ypeof(long)) thr
6540: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
6550: 28 22 6c 6f 6e 67 20 74 79 70 65 20 6e 6f 6e 2d  ("long type non-
6560: 6d 61 74 63 68 22 29 3b 0d 0a 0d 0a 20 20 20 20  match");....    
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6580: 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75   (reader.GetValu
6590: 65 28 30 29 2e 45 71 75 61 6c 73 28 28 6c 6f 6e  e(0).Equals((lon
65a0: 67 29 31 29 20 3d 3d 20 66 61 6c 73 65 29 20 74  g)1) == false) t
65b0: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
65c0: 6f 6e 28 22 6c 6f 6e 67 20 76 61 6c 75 65 20 6e  on("long value n
65d0: 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 20 20 20  on-match");..   
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
65f0: 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c  f (reader.GetVal
6600: 75 65 28 31 29 2e 45 71 75 61 6c 73 28 6e 65 77  ue(1).Equals(new
6610: 20 44 61 74 65 54 69 6d 65 28 31 37 35 33 2c 20   DateTime(1753, 
6620: 31 2c 20 31 29 29 20 3d 3d 20 66 61 6c 73 65 29  1, 1)) == false)
6630: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
6640: 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d  tion(String.Form
6650: 61 74 28 22 44 61 74 65 54 69 6d 65 20 76 61 6c  at("DateTime val
6660: 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 65 78 70  ue non-match exp
6670: 65 63 74 65 64 20 7b 30 7d 20 67 6f 74 20 7b 31  ected {0} got {1
6680: 7d 22 2c 20 6e 65 77 20 44 61 74 65 54 69 6d 65  }", new DateTime
6690: 28 31 37 35 33 2c 20 31 2c 20 31 29 2c 20 72 65  (1753, 1, 1), re
66a0: 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29  ader.GetValue(1)
66b0: 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ));..           
66c0: 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65         if (reade
66d0: 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2e 45 71  r.GetValue(2).Eq
66e0: 75 61 6c 73 28 28 44 65 63 69 6d 61 6c 29 31 2e  uals((Decimal)1.
66f0: 30 35 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68  05) == false) th
6700: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
6710: 6e 28 22 44 65 63 69 6d 61 6c 20 76 61 6c 75 65  n("Decimal value
6720: 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 0d   non-match");...
6730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6740: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65     if (reader.Ge
6750: 74 56 61 6c 75 65 28 30 29 2e 45 71 75 61 6c 73  tValue(0).Equals
6760: 28 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34  (reader.GetInt64
6770: 28 30 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74  (0)) == false) t
6780: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
6790: 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  on(String.Format
67a0: 28 22 6c 6f 6e 67 20 76 61 6c 75 65 20 66 61 69  ("long value fai
67b0: 6c 65 64 20 74 6f 20 6d 61 74 63 68 20 69 74 73  led to match its
67c0: 65 6c 66 2c 20 7b 30 7d 20 61 6e 64 20 7b 31 7d  elf, {0} and {1}
67d0: 22 2c 20 72 65 61 64 65 72 2e 47 65 74 56 61 6c  ", reader.GetVal
67e0: 75 65 28 30 29 2c 20 72 65 61 64 65 72 2e 47 65  ue(0), reader.Ge
67f0: 74 49 6e 74 36 34 28 30 29 29 29 3b 0d 0a 20 20  tInt64(0)));..  
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
6820: 6c 75 65 28 31 29 2e 45 71 75 61 6c 73 28 72 65  lue(1).Equals(re
6830: 61 64 65 72 2e 47 65 74 44 61 74 65 54 69 6d 65  ader.GetDateTime
6840: 28 31 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74  (1)) == false) t
6850: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
6860: 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  on(String.Format
6870: 28 22 44 61 74 65 54 69 6d 65 20 66 61 69 6c 65  ("DateTime faile
6880: 64 20 74 6f 20 6d 61 74 63 68 20 69 74 73 65 6c  d to match itsel
6890: 66 20 7b 30 7d 20 61 6e 64 20 7b 31 7d 22 2c 20  f {0} and {1}", 
68a0: 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28  reader.GetValue(
68b0: 31 29 2c 20 72 65 61 64 65 72 2e 47 65 74 44 61  1), reader.GetDa
68c0: 74 65 54 69 6d 65 28 31 29 29 29 3b 0d 0a 20 20  teTime(1)));..  
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
68f0: 6c 75 65 28 32 29 2e 45 71 75 61 6c 73 28 72 65  lue(2).Equals(re
6900: 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61 6c 28  ader.GetDecimal(
6910: 32 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68  2)) == false) th
6920: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
6930: 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n(String.Format(
6940: 22 44 65 63 69 6d 61 6c 20 66 61 69 6c 65 64 20  "Decimal failed 
6950: 74 6f 20 6d 61 74 63 68 20 69 74 73 65 6c 66 20  to match itself 
6960: 7b 30 7d 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65  {0} and {1}", re
6970: 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 32 29  ader.GetValue(2)
6980: 2c 20 72 65 61 64 65 72 2e 47 65 74 44 65 63 69  , reader.GetDeci
6990: 6d 61 6c 28 32 29 29 29 3b 0d 0a 20 20 20 20 20  mal(2)));..     
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
69b0: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ak;..           
69c0: 20 20 20 20 20 63 61 73 65 20 31 3a 0d 0a 20 20       case 1:..  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
69f0: 6c 75 65 28 30 29 2e 47 65 74 54 79 70 65 28 29  lue(0).GetType()
6a00: 20 21 3d 20 74 79 70 65 6f 66 28 73 74 72 69 6e   != typeof(strin
6a10: 67 29 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  g)) throw new Ex
6a20: 63 65 70 74 69 6f 6e 28 22 53 74 72 69 6e 67 20  ception("String 
6a30: 74 79 70 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29  type non-match")
6a40: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
6a50: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
6a60: 47 65 74 56 61 6c 75 65 28 30 29 2e 45 71 75 61  GetValue(0).Equa
6a70: 6c 73 28 22 4f 6e 65 22 29 20 3d 3d 20 66 61 6c  ls("One") == fal
6a80: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
6a90: 63 65 70 74 69 6f 6e 28 22 53 74 72 69 6e 67 20  ception("String 
6aa0: 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22  value non-match"
6ab0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
6ac0: 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72        if (reader
6ad0: 2e 47 65 74 56 61 6c 75 65 28 31 29 2e 45 71 75  .GetValue(1).Equ
6ae0: 61 6c 73 28 6e 65 77 20 44 61 74 65 54 69 6d 65  als(new DateTime
6af0: 28 32 30 30 31 2c 20 31 2c 20 31 29 29 20 3d 3d  (2001, 1, 1)) ==
6b00: 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65   false) throw ne
6b10: 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69  w Exception(Stri
6b20: 6e 67 2e 46 6f 72 6d 61 74 28 22 44 61 74 65 54  ng.Format("DateT
6b30: 69 6d 65 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61  ime value non-ma
6b40: 74 63 68 20 65 78 70 65 63 74 65 64 20 7b 30 7d  tch expected {0}
6b50: 20 67 6f 74 20 7b 31 7d 22 2c 20 6e 65 77 20 44   got {1}", new D
6b60: 61 74 65 54 69 6d 65 28 32 30 30 31 2c 20 31 2c  ateTime(2001, 1,
6b70: 20 31 29 2c 20 72 65 61 64 65 72 2e 47 65 74 56   1), reader.GetV
6b80: 61 6c 75 65 28 31 29 29 29 3b 0d 0a 20 20 20 20  alue(1)));..    
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6ba0: 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75   (reader.GetValu
6bb0: 65 28 32 29 2e 45 71 75 61 6c 73 28 28 44 65 63  e(2).Equals((Dec
6bc0: 69 6d 61 6c 29 31 2e 30 29 20 3d 3d 20 66 61 6c  imal)1.0) == fal
6bd0: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
6be0: 63 65 70 74 69 6f 6e 28 22 44 65 63 69 6d 61 6c  ception("Decimal
6bf0: 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68   value non-match
6c00: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
6c10: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
6c20: 64 65 72 2e 47 65 74 53 74 72 69 6e 67 28 30 29  der.GetString(0)
6c30: 20 21 3d 20 22 4f 6e 65 22 29 20 74 68 72 6f 77   != "One") throw
6c40: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
6c50: 53 74 72 69 6e 67 20 76 61 6c 75 65 20 6e 6f 6e  String value non
6c60: 2d 6d 61 74 63 68 22 29 3b 0d 0a 20 20 20 20 20  -match");..     
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6c80: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
6c90: 28 31 29 2e 45 71 75 61 6c 73 28 72 65 61 64 65  (1).Equals(reade
6ca0: 72 2e 47 65 74 44 61 74 65 54 69 6d 65 28 31 29  r.GetDateTime(1)
6cb0: 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f  ) == false) thro
6cc0: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
6cd0: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44  String.Format("D
6ce0: 61 74 65 54 69 6d 65 20 66 61 69 6c 65 64 20 74  ateTime failed t
6cf0: 6f 20 6d 61 74 63 68 20 69 74 73 65 6c 66 20 7b  o match itself {
6d00: 30 7d 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65 61  0} and {1}", rea
6d10: 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29 2c  der.GetValue(1),
6d20: 20 72 65 61 64 65 72 2e 47 65 74 44 61 74 65 54   reader.GetDateT
6d30: 69 6d 65 28 31 29 29 29 3b 0d 0a 20 20 20 20 20  ime(1)));..     
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6d50: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
6d60: 28 32 29 2e 45 71 75 61 6c 73 28 72 65 61 64 65  (2).Equals(reade
6d70: 72 2e 47 65 74 44 65 63 69 6d 61 6c 28 32 29 29  r.GetDecimal(2))
6d80: 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77   == false) throw
6d90: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53   new Exception(S
6da0: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44 65  tring.Format("De
6db0: 63 69 6d 61 6c 20 66 61 69 6c 65 64 20 74 6f 20  cimal failed to 
6dc0: 6d 61 74 63 68 20 69 74 73 65 6c 66 20 7b 30 7d  match itself {0}
6dd0: 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65 61 64 65   and {1}", reade
6de0: 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2c 20 72  r.GetValue(2), r
6df0: 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61 6c  eader.GetDecimal
6e00: 28 32 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  (2)));..        
6e10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6e20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6e30: 20 20 63 61 73 65 20 32 3a 0d 0a 20 20 20 20 20    case 2:..     
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6e50: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
6e60: 28 30 29 2e 47 65 74 54 79 70 65 28 29 20 21 3d  (0).GetType() !=
6e70: 20 74 79 70 65 6f 66 28 64 6f 75 62 6c 65 29 29   typeof(double))
6e80: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
6e90: 74 69 6f 6e 28 22 44 6f 75 62 6c 65 20 74 79 70  tion("Double typ
6ea0: 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a  e non-match");..
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65 74    if (reader.Get
6ed0: 56 61 6c 75 65 28 30 29 2e 45 71 75 61 6c 73 28  Value(0).Equals(
6ee0: 31 2e 30 31 29 20 3d 3d 20 66 61 6c 73 65 29 20  1.01) == false) 
6ef0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
6f00: 69 6f 6e 28 22 44 6f 75 62 6c 65 20 76 61 6c 75  ion("Double valu
6f10: 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a  e non-match");..
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f30: 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65 74    if (reader.Get
6f40: 56 61 6c 75 65 28 31 29 2e 54 6f 53 74 72 69 6e  Value(1).ToStrin
6f50: 67 28 29 20 21 3d 20 6e 6f 77 2e 54 6f 53 74 72  g() != now.ToStr
6f60: 69 6e 67 28 29 29 20 74 68 72 6f 77 20 6e 65 77  ing()) throw new
6f70: 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
6f80: 67 2e 46 6f 72 6d 61 74 28 22 44 61 74 65 54 69  g.Format("DateTi
6f90: 6d 65 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74  me value non-mat
6fa0: 63 68 2c 20 65 78 70 65 63 74 65 64 20 7b 30 7d  ch, expected {0}
6fb0: 20 67 6f 74 20 7b 31 7d 22 2c 20 6e 6f 77 2c 20   got {1}", now, 
6fc0: 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28  reader.GetValue(
6fd0: 31 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  1)));..         
6fe0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
6ff0: 64 65 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2e  der.GetValue(2).
7000: 45 71 75 61 6c 73 28 28 44 65 63 69 6d 61 6c 29  Equals((Decimal)
7010: 39 2e 39 31 29 20 3d 3d 20 66 61 6c 73 65 29 20  9.91) == false) 
7020: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
7030: 69 6f 6e 28 22 44 65 63 69 6d 61 6c 20 76 61 6c  ion("Decimal val
7040: 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d  ue non-match");.
7050: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
7060: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
7070: 47 65 74 44 6f 75 62 6c 65 28 30 29 20 21 3d 20  GetDouble(0) != 
7080: 31 2e 30 31 29 20 74 68 72 6f 77 20 6e 65 77 20  1.01) throw new 
7090: 45 78 63 65 70 74 69 6f 6e 28 22 44 6f 75 62 6c  Exception("Doubl
70a0: 65 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  e value non-matc
70b0: 68 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  h");..          
70c0: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
70d0: 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29 2e 45  er.GetValue(1).E
70e0: 71 75 61 6c 73 28 72 65 61 64 65 72 2e 47 65 74  quals(reader.Get
70f0: 44 61 74 65 54 69 6d 65 28 31 29 29 20 3d 3d 20  DateTime(1)) == 
7100: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
7110: 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e   Exception(Strin
7120: 67 2e 46 6f 72 6d 61 74 28 22 44 61 74 65 54 69  g.Format("DateTi
7130: 6d 65 20 66 61 69 6c 65 64 20 74 6f 20 6d 61 74  me failed to mat
7140: 63 68 20 69 74 73 65 6c 66 20 7b 30 7d 20 61 6e  ch itself {0} an
7150: 64 20 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e 47  d {1}", reader.G
7160: 65 74 56 61 6c 75 65 28 31 29 2c 20 72 65 61 64  etValue(1), read
7170: 65 72 2e 47 65 74 44 61 74 65 54 69 6d 65 28 31  er.GetDateTime(1
7180: 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  )));..          
7190: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
71a0: 65 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2e 45  er.GetValue(2).E
71b0: 71 75 61 6c 73 28 72 65 61 64 65 72 2e 47 65 74  quals(reader.Get
71c0: 44 65 63 69 6d 61 6c 28 32 29 29 20 3d 3d 20 66  Decimal(2)) == f
71d0: 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20  alse) throw new 
71e0: 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
71f0: 2e 46 6f 72 6d 61 74 28 22 44 65 63 69 6d 61 6c  .Format("Decimal
7200: 20 66 61 69 6c 65 64 20 74 6f 20 6d 61 74 63 68   failed to match
7210: 20 69 74 73 65 6c 66 20 7b 30 7d 20 61 6e 64 20   itself {0} and 
7220: 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e 47 65 74  {1}", reader.Get
7230: 56 61 6c 75 65 28 32 29 2c 20 72 65 61 64 65 72  Value(2), reader
7240: 2e 47 65 74 44 65 63 69 6d 61 6c 28 32 29 29 29  .GetDecimal(2)))
7250: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
7260: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
7270: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
7280: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7290: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
72a0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6e    }..        fin
72b0: 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ally..        {.
72c0: 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65  .          Syste
72d0: 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
72e0: 61 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64  ad.CurrentThread
72f0: 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 20  .CurrentCulture 
7300: 3d 20 6f 6c 64 63 75 6c 74 75 72 65 3b 0d 0a 20  = oldculture;.. 
7310: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
7320: 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64  Threading.Thread
7330: 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43  .CurrentThread.C
7340: 75 72 72 65 6e 74 55 49 43 75 6c 74 75 72 65 20  urrentUICulture 
7350: 3d 20 6f 6c 64 75 69 63 75 6c 74 75 72 65 3b 0d  = olduiculture;.
7360: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
7370: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
7380: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
7390: 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 69 73  .    /// This is
73a0: 20 61 6e 20 6d 65 61 6e 20 75 67 6c 79 20 74 65   an mean ugly te
73b0: 73 74 20 74 68 61 74 20 6c 65 61 76 65 73 20 61  st that leaves a
73c0: 20 6c 6f 74 20 6f 66 20 6f 70 65 6e 20 64 61 74   lot of open dat
73d0: 61 72 65 61 64 65 72 73 20 6f 75 74 20 6f 6e 20  areaders out on 
73e0: 6d 61 6e 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  many connections
73f0: 0d 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 73 65 65  ..    /// to see
7400: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
7410: 20 63 61 6e 20 73 75 72 76 69 76 65 20 62 65 69   can survive bei
7420: 6e 67 20 63 6c 6f 6e 65 64 20 61 20 6c 6f 74 20  ng cloned a lot 
7430: 61 6e 64 20 64 69 73 70 6f 73 65 64 20 77 68 69  and disposed whi
7440: 6c 65 20 61 63 74 69 76 65 20 72 65 61 64 65 72  le active reader
7450: 73 20 61 72 65 20 75 70 2e 0d 0a 20 20 20 20 2f  s are up...    /
7460: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
7470: 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63     [Test(Sequenc
7480: 65 20 3d 20 34 30 29 5d 0d 0a 20 20 20 20 69 6e  e = 40)]..    in
7490: 74 65 72 6e 61 6c 20 76 6f 69 64 20 4c 65 61 6b  ternal void Leak
74a0: 79 44 61 74 61 52 65 61 64 65 72 73 28 29 0d 0a  yDataReaders()..
74b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 74 72 79      {..      try
74c0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
74d0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
74e0: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77  DbConnection new
74f0: 63 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20  cnn = null;..   
7500: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
7510: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
7520: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 78 20       for (int x 
7530: 3d 20 30 3b 20 78 20 3c 20 31 30 30 30 30 3b 20  = 0; x < 10000; 
7540: 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20  x++)..          
7550: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
7560: 20 20 20 69 66 20 28 6e 65 77 63 6e 6e 20 3d 3d     if (newcnn ==
7570: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
7580: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
7590: 20 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 20           newcnn 
75a0: 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f  = ((ICloneable)_
75b0: 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20  cnn).Clone() as 
75c0: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0d 0a 20  DbConnection;.. 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
75e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
75f0: 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61 74 65  if (newcnn.State
7600: 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74   != ConnectionSt
7610: 61 74 65 2e 4f 70 65 6e 29 0d 0a 20 20 20 20 20  ate.Open)..     
7620: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 63 6e             newcn
7630: 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20  n.Open();....   
7640: 20 20 20 20 20 20 20 20 20 20 20 44 62 43 6f 6d             DbCom
7650: 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e  mand cmd = newcn
7660: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
7670: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
7680: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
7690: 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20 46 52  t = "SELECT * FR
76a0: 4f 4d 20 54 65 73 74 43 61 73 65 22 3b 0d 0a 20  OM TestCase";.. 
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 62 44               DbD
76c0: 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72  ataReader reader
76d0: 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
76e0: 61 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  ader();..       
76f0: 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 52 65         reader.Re
7700: 61 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ad();..         
7710: 20 20 20 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20       object obj 
7720: 3d 20 72 65 61 64 65 72 5b 30 5d 3b 0d 0a 0d 0a  = reader[0];....
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7740: 20 28 78 20 25 20 35 30 30 20 3d 3d 20 30 29 0d   (x % 500 == 0).
7750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
7760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7770: 20 20 6e 65 77 63 6e 6e 2e 43 6c 6f 73 65 28 29    newcnn.Close()
7780: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
7790: 20 20 20 6e 65 77 63 6e 6e 20 3d 20 6e 75 6c 6c     newcnn = null
77a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
77b0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
77c0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
77d0: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c            finall
77e0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  y..          {..
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
7800: 6e 65 77 63 6e 6e 20 21 3d 20 6e 75 6c 6c 29 0d  newcnn != null).
7810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
7820: 65 77 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a  ewcnn.Close();..
7830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ..            ne
7840: 77 63 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  wcnn = null;..  
7850: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7860: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 43 68     }..        Ch
7870: 65 63 6b 4c 6f 63 6b 65 64 28 29 3b 0d 0a 20 20  eckLocked();..  
7880: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 61 74      }..      cat
7890: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29  ch (Exception e)
78a0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
78b0: 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
78c0: 73 74 69 63 73 2e 44 65 62 75 67 2e 57 72 69 74  stics.Debug.Writ
78d0: 65 4c 69 6e 65 28 65 2e 4d 65 73 73 61 67 65 29  eLine(e.Message)
78e0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
78f0: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53  }....    [Test(S
7900: 65 71 75 65 6e 63 65 20 3d 20 69 6e 74 2e 4d 61  equence = int.Ma
7910: 78 56 61 6c 75 65 29 5d 0d 0a 20 20 20 20 69 6e  xValue)]..    in
7920: 74 65 72 6e 61 6c 20 76 6f 69 64 20 44 72 6f 70  ternal void Drop
7930: 54 61 62 6c 65 28 29 0d 0a 20 20 20 20 7b 0d 0a  Table()..    {..
7940: 20 20 20 20 20 20 44 72 6f 70 54 61 62 6c 65 73        DropTables
7950: 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a  (true);..    }..
7960: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
7970: 6f 69 64 20 44 72 6f 70 54 61 62 6c 65 73 28 62  oid DropTables(b
7980: 6f 6f 6c 20 74 68 72 6f 77 45 72 72 6f 72 29 0d  ool throwError).
7990: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 2f 2f  .    {..      //
79a0: 73 74 72 69 6e 67 5b 5d 20 61 72 72 20 3d 20 6e  string[] arr = n
79b0: 65 77 20 73 74 72 69 6e 67 5b 5d 20 7b 20 22 54  ew string[] { "T
79c0: 65 73 74 43 61 73 65 22 2c 20 22 64 61 74 61 74  estCase", "datat
79d0: 79 70 65 74 65 73 74 22 2c 20 22 4d 75 6c 74 69  ypetest", "Multi
79e0: 54 68 72 65 61 64 65 64 54 65 73 74 22 2c 20 22  ThreadedTest", "
79f0: 66 75 6c 6c 74 65 78 74 22 2c 20 22 67 75 69 64  fulltext", "guid
7a00: 74 65 73 74 22 2c 20 22 6b 65 79 69 6e 66 6f 74  test", "keyinfot
7a10: 65 73 74 22 2c 20 22 73 74 65 70 72 65 61 64 65  est", "stepreade
7a20: 72 22 2c 20 22 6e 6f 6e 65 78 69 73 74 65 6e 74  r", "nonexistent
7a30: 22 20 7d 3b 0d 0a 20 20 20 20 20 20 73 74 72 69  " };..      stri
7a40: 6e 67 20 65 72 72 6f 72 73 20 3d 20 53 74 72 69  ng errors = Stri
7a50: 6e 67 2e 45 6d 70 74 79 3b 0d 0a 0d 0a 20 20 20  ng.Empty;....   
7a60: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
7a70: 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43  and cmd = _cnn.C
7a80: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
7a90: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
7aa0: 20 20 66 6f 72 65 61 63 68 28 73 74 72 69 6e 67    foreach(string
7ab0: 20 74 61 62 6c 65 20 69 6e 20 64 72 6f 70 74 61   table in dropta
7ac0: 62 6c 65 73 29 0d 0a 20 20 20 20 20 20 20 20 7b  bles)..        {
7ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 0d  ..          try.
7ae0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
7af0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
7b00: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69  mmandText = Stri
7b10: 6e 67 2e 46 6f 72 6d 61 74 28 22 44 52 4f 50 20  ng.Format("DROP 
7b20: 54 41 42 4c 45 7b 31 7d 20 5b 7b 30 7d 5d 22 2c  TABLE{1} [{0}]",
7b30: 20 74 61 62 6c 65 2c 20 28 74 68 72 6f 77 45 72   table, (throwEr
7b40: 72 6f 72 20 3d 3d 20 66 61 6c 73 65 29 20 3f 20  ror == false) ? 
7b50: 22 20 49 46 20 45 58 49 53 54 53 22 20 3a 20 22  " IF EXISTS" : "
7b60: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
7b70: 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51   cmd.ExecuteNonQ
7b80: 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20  uery();..       
7b90: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
7ba0: 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e  catch (Exception
7bb0: 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b   e)..          {
7bc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
7bd0: 20 28 74 68 72 6f 77 45 72 72 6f 72 20 3d 3d 20   (throwError == 
7be0: 74 72 75 65 29 0d 0a 20 20 20 20 20 20 20 20 20  true)..         
7bf0: 20 20 20 20 20 65 72 72 6f 72 73 20 2b 3d 20 53       errors += S
7c00: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b 30  tring.Format("{0
7c10: 7d 5c 72 5c 6e 22 2c 20 65 2e 4d 65 73 73 61 67  }\r\n", e.Messag
7c20: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  e);..          }
7c30: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
7c40: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
7c50: 73 74 72 69 6e 67 20 74 61 62 6c 65 20 69 6e 20  string table in 
7c60: 6d 61 79 64 72 6f 70 74 61 62 6c 65 29 0d 0a 20  maydroptable).. 
7c70: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7c80: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
7c90: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7ca0: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
7cb0: 74 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  t = String.Forma
7cc0: 74 28 22 44 52 4f 50 20 54 41 42 4c 45 7b 31 7d  t("DROP TABLE{1}
7cd0: 20 5b 7b 30 7d 5d 22 2c 20 74 61 62 6c 65 2c 20   [{0}]", table, 
7ce0: 28 74 68 72 6f 77 45 72 72 6f 72 20 3d 3d 20 66  (throwError == f
7cf0: 61 6c 73 65 29 20 3f 20 22 20 49 46 20 45 58 49  alse) ? " IF EXI
7d00: 53 54 53 22 20 3a 20 22 22 29 3b 0d 0a 20 20 20  STS" : "");..   
7d10: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
7d20: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
7d30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
7d40: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
7d50: 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20  xception)..     
7d60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7d70: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
7d80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7d90: 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75   if (String.IsNu
7da0: 6c 6c 4f 72 45 6d 70 74 79 28 65 72 72 6f 72 73  llOrEmpty(errors
7db0: 29 20 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20  ) == false)..   
7dc0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
7dd0: 78 63 65 70 74 69 6f 6e 28 65 72 72 6f 72 73 29  xception(errors)
7de0: 3b 0d 0a 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;....    }....  
7df0: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
7e00: 20 3d 20 31 30 30 30 29 5d 0d 0a 20 20 20 20 69   = 1000)]..    i
7e10: 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 46  nternal string F
7e20: 61 73 74 49 6e 73 65 72 74 4d 61 6e 79 28 29 0d  astInsertMany().
7e30: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 74  .    {..      St
7e40: 72 69 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c  ringBuilder buil
7e50: 64 65 72 20 3d 20 6e 65 77 20 53 74 72 69 6e 67  der = new String
7e60: 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20  Builder();..    
7e70: 20 20 75 73 69 6e 67 20 28 44 62 54 72 61 6e 73    using (DbTrans
7e80: 61 63 74 69 6f 6e 20 64 62 54 72 61 6e 73 20 3d  action dbTrans =
7e90: 20 5f 63 6e 6e 2e 42 65 67 69 6e 54 72 61 6e 73   _cnn.BeginTrans
7ea0: 61 63 74 69 6f 6e 28 29 29 0d 0a 20 20 20 20 20  action())..     
7eb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20   {..        int 
7ec0: 64 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20  dtStart;..      
7ed0: 20 20 69 6e 74 20 64 74 45 6e 64 3b 0d 0a 0d 0a    int dtEnd;....
7ee0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
7ef0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
7f00: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
7f10: 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  d())..        {.
7f20: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 54  .          cmd.T
7f30: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 64 62 54  ransaction = dbT
7f40: 72 61 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20 20  rans;..         
7f50: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
7f60: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
7f70: 54 65 73 74 43 61 73 65 28 46 69 65 6c 64 31 29  TestCase(Field1)
7f80: 20 56 41 4c 55 45 53 28 40 70 31 29 22 3b 0d 0a   VALUES(@p1)";..
7f90: 20 20 20 20 20 20 20 20 20 20 44 62 50 61 72 61            DbPara
7fa0: 6d 65 74 65 72 20 46 69 65 6c 64 31 20 3d 20 63  meter Field1 = c
7fb0: 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74  md.CreateParamet
7fc0: 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  er();....       
7fd0: 20 20 20 46 69 65 6c 64 31 2e 50 61 72 61 6d 65     Field1.Parame
7fe0: 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 31 22 3b  terName = "@p1";
7ff0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  ..          cmd.
8000: 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46  Parameters.Add(F
8010: 69 65 6c 64 31 29 3b 0d 0a 0d 0a 20 20 20 20 20  ield1);....     
8020: 20 20 20 20 20 2f 2f 43 6f 6e 73 6f 6c 65 2e 57       //Console.W
8030: 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67 2e  riteLine(String.
8040: 46 6f 72 6d 61 74 28 22 20 20 20 20 20 20 20 20  Format("        
8050: 20 20 46 61 73 74 20 69 6e 73 65 72 74 20 75 73    Fast insert us
8060: 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 61  ing parameters a
8070: 6e 64 20 70 72 65 70 61 72 65 64 20 73 74 61 74  nd prepared stat
8080: 65 6d 65 6e 74 5c 72 5c 6e 20 20 20 20 20 20 20  ement\r\n       
8090: 20 20 20 2d 3e 20 28 31 30 30 2c 30 30 30 20 72     -> (100,000 r
80a0: 6f 77 73 29 20 42 65 67 69 6e 73 20 2e 2e 2e 20  ows) Begins ... 
80b0: 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  "));..          
80c0: 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f  dtStart = Enviro
80d0: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
80e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  ..          for 
80f0: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
8100: 31 30 30 30 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20  100000; n++)..  
8110: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
8120: 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e 56 61         Field1.Va
8130: 6c 75 65 20 3d 20 6e 20 2b 20 32 30 30 30 30 30  lue = n + 200000
8140: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ;..            c
8150: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
8160: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
8170: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
8180: 64 74 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d  dtEnd = Environm
8190: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a  ent.TickCount;..
81a0: 20 20 20 20 20 20 20 20 20 20 64 74 45 6e 64 20            dtEnd 
81b0: 2d 3d 20 64 74 53 74 61 72 74 3b 0d 0a 20 20 20  -= dtStart;..   
81c0: 20 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e 41         builder.A
81d0: 70 70 65 6e 64 46 6f 72 6d 61 74 28 22 45 6e 64  ppendFormat("End
81e0: 73 20 69 6e 20 7b 30 7d 20 6d 73 20 2e 2e 2e 20  s in {0} ms ... 
81f0: 22 2c 20 28 64 74 45 6e 64 29 29 3b 0d 0a 20 20  ", (dtEnd));..  
8200: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8210: 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76     dtStart = Env
8220: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
8230: 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 64 62 54  nt;..        dbT
8240: 72 61 6e 73 2e 43 6f 6d 6d 69 74 28 29 3b 0d 0a  rans.Commit();..
8250: 20 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20          dtEnd = 
8260: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
8270: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
8280: 64 74 45 6e 64 20 2d 3d 20 64 74 53 74 61 72 74  dtEnd -= dtStart
8290: 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64  ;..        build
82a0: 65 72 2e 41 70 70 65 6e 64 46 6f 72 6d 61 74 28  er.AppendFormat(
82b0: 22 43 6f 6d 6d 69 74 73 20 69 6e 20 7b 30 7d 20  "Commits in {0} 
82c0: 6d 73 22 2c 20 28 64 74 45 6e 64 29 29 3b 0d 0a  ms", (dtEnd));..
82d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72        }..      r
82e0: 65 74 75 72 6e 20 62 75 69 6c 64 65 72 2e 54 6f  eturn builder.To
82f0: 53 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d  String();..    }
8300: 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a  ....    [Test]..
8310: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
8320: 64 20 46 75 6c 6c 54 65 78 74 54 65 73 74 28 29  d FullTextTest()
8330: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43  ..    {..      C
8340: 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 0d  heckSQLite();...
8350: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
8360: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
8370: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
8380: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
8390: 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
83a0: 2e 41 64 64 28 22 46 75 6c 6c 54 65 78 74 22 29  .Add("FullText")
83b0: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
83c0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52  ommandText = "CR
83d0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
83e0: 4c 45 20 46 75 6c 6c 54 65 78 74 20 55 53 49 4e  LE FullText USIN
83f0: 47 20 46 54 53 33 28 6e 61 6d 65 2c 20 69 6e 67  G FTS3(name, ing
8400: 72 65 64 69 65 6e 74 73 29 3b 22 3b 0d 0a 20 20  redients);";..  
8410: 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74        cmd.Execut
8420: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a  eNonQuery();....
8430: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d          string[]
8440: 20 6e 61 6d 65 73 20 3d 20 7b 20 22 62 72 6f 63   names = { "broc
8450: 63 6f 6c 69 20 73 74 65 77 22 2c 20 22 70 75 6d  coli stew", "pum
8460: 70 6b 69 6e 20 73 74 65 77 22 2c 20 22 62 72 6f  pkin stew", "bro
8470: 63 63 6f 6c 69 20 70 69 65 22 2c 20 22 70 75 6d  ccoli pie", "pum
8480: 70 6b 69 6e 20 70 69 65 22 20 7d 3b 0d 0a 20 20  pkin pie" };..  
8490: 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d 20 69        string[] i
84a0: 6e 67 72 65 64 69 65 6e 74 73 20 3d 20 7b 20 22  ngredients = { "
84b0: 62 72 6f 63 63 6f 6c 69 20 70 65 70 70 65 72 73  broccoli peppers
84c0: 20 63 68 65 65 73 65 20 74 6f 6d 61 74 6f 65 73   cheese tomatoes
84d0: 22 2c 20 22 70 75 6d 70 6b 69 6e 20 6f 6e 69 6f  ", "pumpkin onio
84e0: 6e 73 20 67 61 72 6c 69 63 20 63 65 6c 65 72 79  ns garlic celery
84f0: 22 2c 20 22 62 72 6f 63 63 6f 6c 69 20 63 68 65  ", "broccoli che
8500: 65 73 65 20 6f 6e 69 6f 6e 73 20 66 6c 6f 75 72  ese onions flour
8510: 22 2c 20 22 70 75 6d 70 6b 69 6e 20 73 75 67 61  ", "pumpkin suga
8520: 72 20 66 6c 6f 75 72 20 62 75 74 74 65 72 22 20  r flour butter" 
8530: 7d 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  };..        int 
8540: 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d  n;....        cm
8550: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
8560: 22 69 6e 73 65 72 74 20 69 6e 74 6f 20 46 75 6c  "insert into Ful
8570: 6c 54 65 78 74 20 28 6e 61 6d 65 2c 20 69 6e 67  lText (name, ing
8580: 72 65 64 69 65 6e 74 73 29 20 76 61 6c 75 65 73  redients) values
8590: 20 28 40 6e 61 6d 65 2c 20 40 69 6e 67 72 65 64   (@name, @ingred
85a0: 69 65 6e 74 29 3b 22 3b 0d 0a 20 20 20 20 20 20  ient);";..      
85b0: 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 6e 61    DbParameter na
85c0: 6d 65 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50  me = cmd.CreateP
85d0: 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20  arameter();..   
85e0: 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65 72       DbParameter
85f0: 20 69 6e 67 72 65 64 69 65 6e 74 20 3d 20 63 6d   ingredient = cm
8600: 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  d.CreateParamete
8610: 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  r();....        
8620: 6e 61 6d 65 2e 50 61 72 61 6d 65 74 65 72 4e 61  name.ParameterNa
8630: 6d 65 20 3d 20 22 40 6e 61 6d 65 22 3b 0d 0a 20  me = "@name";.. 
8640: 20 20 20 20 20 20 20 69 6e 67 72 65 64 69 65 6e         ingredien
8650: 74 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20  t.ParameterName 
8660: 3d 20 22 40 69 6e 67 72 65 64 69 65 6e 74 22 3b  = "@ingredient";
8670: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
8680: 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 6e  Parameters.Add(n
8690: 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 63  ame);..        c
86a0: 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64  md.Parameters.Ad
86b0: 64 28 69 6e 67 72 65 64 69 65 6e 74 29 3b 0d 0a  d(ingredient);..
86c0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6e  ..        for (n
86d0: 20 3d 20 30 3b 20 6e 20 3c 20 6e 61 6d 65 73 2e   = 0; n < names.
86e0: 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0d 0a 20 20  Length; n++)..  
86f0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
8700: 20 20 20 6e 61 6d 65 2e 56 61 6c 75 65 20 3d 20     name.Value = 
8710: 6e 61 6d 65 73 5b 6e 5d 3b 0d 0a 20 20 20 20 20  names[n];..     
8720: 20 20 20 20 20 69 6e 67 72 65 64 69 65 6e 74 2e       ingredient.
8730: 56 61 6c 75 65 20 3d 20 69 6e 67 72 65 64 69 65  Value = ingredie
8740: 6e 74 73 5b 6e 5d 3b 0d 0a 0d 0a 20 20 20 20 20  nts[n];....     
8750: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
8760: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
8770: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8780: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
8790: 74 20 3d 20 22 73 65 6c 65 63 74 20 72 6f 77 69  t = "select rowi
87a0: 64 2c 20 6e 61 6d 65 2c 20 69 6e 67 72 65 64 69  d, name, ingredi
87b0: 65 6e 74 73 20 66 72 6f 6d 20 46 75 6c 6c 54 65  ents from FullTe
87c0: 78 74 20 77 68 65 72 65 20 6e 61 6d 65 20 6d 61  xt where name ma
87d0: 74 63 68 20 27 70 69 65 27 3b 22 3b 0d 0a 20 20  tch 'pie';";..  
87e0: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
87f0: 74 65 72 73 2e 43 6c 65 61 72 28 29 3b 0d 0a 0d  ters.Clear();...
8800: 0a 20 20 20 20 20 20 20 20 69 6e 74 5b 5d 20 72  .        int[] r
8810: 6f 77 69 64 73 20 3d 20 7b 20 33 2c 20 34 20 7d  owids = { 3, 4 }
8820: 3b 0d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 30  ;..        n = 0
8830: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 73 69  ;....        usi
8840: 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72  ng (DbDataReader
8850: 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78   reader = cmd.Ex
8860: 65 63 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a  ecuteReader())..
8870: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
8880: 20 20 20 20 20 77 68 69 6c 65 20 28 72 65 61 64       while (read
8890: 65 72 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20  er.Read())..    
88a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
88b0: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
88c0: 47 65 74 49 6e 74 36 34 28 30 29 20 21 3d 20 72  GetInt64(0) != r
88d0: 6f 77 69 64 73 5b 6e 2b 2b 5d 29 0d 0a 20 20 20  owids[n++])..   
88e0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
88f0: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
8900: 55 6e 65 78 70 65 63 74 65 64 20 72 6f 77 69 64  Unexpected rowid
8910: 20 72 65 74 75 72 6e 65 64 22 29 3b 0d 0a 0d 0a   returned");....
8920: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
8930: 6e 20 3e 20 72 6f 77 69 64 73 2e 4c 65 6e 67 74  n > rowids.Lengt
8940: 68 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  h) throw new Exc
8950: 65 70 74 69 6f 6e 28 22 54 6f 6f 20 6d 61 6e 79  eption("Too many
8960: 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 22 29   rows returned")
8970: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
8980: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8990: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
89a0: 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74   [Test]..    int
89b0: 65 72 6e 61 6c 20 76 6f 69 64 20 47 75 69 64 54  ernal void GuidT
89c0: 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
89d0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
89e0: 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e  mand cmd = _cnn.
89f0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
8a00: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
8a10: 20 20 20 47 75 69 64 20 67 75 69 64 20 3d 20 47     Guid guid = G
8a20: 75 69 64 2e 4e 65 77 47 75 69 64 28 29 3b 0d 0a  uid.NewGuid();..
8a30: 0d 0a 20 20 20 20 20 20 20 20 64 72 6f 70 74 61  ..        dropta
8a40: 62 6c 65 73 2e 41 64 64 28 22 47 75 69 64 54 65  bles.Add("GuidTe
8a50: 73 74 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  st");....       
8a60: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
8a70: 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   = "CREATE TABLE
8a80: 20 47 75 69 64 54 65 73 74 28 4d 79 47 75 69 64   GuidTest(MyGuid
8a90: 20 75 6e 69 71 75 65 69 64 65 6e 74 69 66 69 65   uniqueidentifie
8aa0: 72 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  r)";..        cm
8ab0: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
8ac0: 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y();....        
8ad0: 2f 2f 20 49 6e 73 65 72 74 20 61 20 67 75 69 64  // Insert a guid
8ae0: 20 61 73 20 61 20 64 65 66 61 75 6c 74 20 62 69   as a default bi
8af0: 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  nary representat
8b00: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ion..        cmd
8b10: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
8b20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 47 75 69 64  INSERT INTO Guid
8b30: 54 65 73 74 28 4d 79 47 75 69 64 29 20 56 41 4c  Test(MyGuid) VAL
8b40: 55 45 53 28 40 62 29 22 3b 0d 0a 20 20 20 20 20  UES(@b)";..     
8b50: 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 70     DbParameter p
8b60: 61 72 6d 20 3d 20 63 6d 64 2e 43 72 65 61 74 65  arm = cmd.Create
8b70: 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20  Parameter();..  
8b80: 20 20 20 20 20 20 70 61 72 6d 2e 50 61 72 61 6d        parm.Param
8b90: 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 62 22 3b  eterName = "@b";
8ba0: 0d 0a 20 20 20 20 20 20 20 20 70 61 72 6d 2e 56  ..        parm.V
8bb0: 61 6c 75 65 20 3d 20 67 75 69 64 3b 0d 0a 20 20  alue = guid;..  
8bc0: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
8bd0: 74 65 72 73 2e 41 64 64 28 70 61 72 6d 29 3b 0d  ters.Add(parm);.
8be0: 0a 20 20 20 20 20 20 20 20 2f 2f 28 28 53 51 4c  .        //((SQL
8bf0: 69 74 65 50 61 72 61 6d 65 74 65 72 43 6f 6c 6c  iteParameterColl
8c00: 65 63 74 69 6f 6e 29 63 6d 64 2e 50 61 72 61 6d  ection)cmd.Param
8c10: 65 74 65 72 73 29 2e 41 64 64 57 69 74 68 56 61  eters).AddWithVa
8c20: 6c 75 65 28 22 40 62 22 2c 20 67 75 69 64 29 3b  lue("@b", guid);
8c30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 49  ....        // I
8c40: 6e 73 65 72 74 20 61 20 67 75 69 64 20 61 73 20  nsert a guid as 
8c50: 74 65 78 74 0d 0a 20 20 20 20 20 20 20 20 63 6d  text..        cm
8c60: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
8c70: 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  y();..        cm
8c80: 64 2e 50 61 72 61 6d 65 74 65 72 73 5b 30 5d 2e  d.Parameters[0].
8c90: 56 61 6c 75 65 20 3d 20 67 75 69 64 2e 54 6f 53  Value = guid.ToS
8ca0: 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20 20 20  tring();..      
8cb0: 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73    cmd.Parameters
8cc0: 5b 30 5d 2e 44 62 54 79 70 65 20 3d 20 44 62 54  [0].DbType = DbT
8cd0: 79 70 65 2e 53 74 72 69 6e 67 3b 0d 0a 20 20 20  ype.String;..   
8ce0: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
8cf0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20  NonQuery();.... 
8d00: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
8d10: 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54  ndText = "SELECT
8d20: 20 4d 79 47 75 69 64 20 46 52 4f 4d 20 47 75 69   MyGuid FROM Gui
8d30: 64 54 65 73 74 22 3b 0d 0a 20 20 20 20 20 20 20  dTest";..       
8d40: 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e   cmd.Parameters.
8d50: 43 6c 65 61 72 28 29 3b 0d 0a 0d 0a 20 20 20 20  Clear();....    
8d60: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
8d70: 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d  aReader reader =
8d80: 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64   cmd.ExecuteRead
8d90: 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b  er())..        {
8da0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 61 64  ..          read
8db0: 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20  er.Read();..    
8dc0: 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72        if (reader
8dd0: 2e 47 65 74 46 69 65 6c 64 54 79 70 65 28 30 29  .GetFieldType(0)
8de0: 20 21 3d 20 74 79 70 65 6f 66 28 47 75 69 64 29   != typeof(Guid)
8df0: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
8e00: 70 74 69 6f 6e 28 22 43 6f 6c 75 6d 6e 20 69 73  ption("Column is
8e10: 20 6e 6f 74 20 61 20 47 75 69 64 22 29 3b 0d 0a   not a Guid");..
8e20: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65            if (re
8e30: 61 64 65 72 2e 47 65 74 47 75 69 64 28 30 29 20  ader.GetGuid(0) 
8e40: 21 3d 20 67 75 69 64 29 20 74 68 72 6f 77 20 6e  != guid) throw n
8e50: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72  ew Exception(Str
8e60: 69 6e 67 2e 46 6f 72 6d 61 74 28 22 47 6f 74 20  ing.Format("Got 
8e70: 67 75 69 64 20 7b 30 7d 2c 20 65 78 70 65 63 74  guid {0}, expect
8e80: 65 64 20 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e  ed {1}", reader.
8e90: 47 65 74 47 75 69 64 28 30 29 2c 20 67 75 69 64  GetGuid(0), guid
8ea0: 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ));....         
8eb0: 20 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d   reader.Read();.
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72  .          if (r
8ed0: 65 61 64 65 72 2e 47 65 74 46 69 65 6c 64 54 79  eader.GetFieldTy
8ee0: 70 65 28 30 29 20 21 3d 20 74 79 70 65 6f 66 28  pe(0) != typeof(
8ef0: 47 75 69 64 29 29 20 74 68 72 6f 77 20 6e 65 77  Guid)) throw new
8f00: 20 45 78 63 65 70 74 69 6f 6e 28 22 43 6f 6c 75   Exception("Colu
8f10: 6d 6e 20 69 73 20 6e 6f 74 20 61 20 47 75 69 64  mn is not a Guid
8f20: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ");..          i
8f30: 66 20 28 72 65 61 64 65 72 2e 47 65 74 47 75 69  f (reader.GetGui
8f40: 64 28 30 29 20 21 3d 20 67 75 69 64 29 20 74 68  d(0) != guid) th
8f50: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
8f60: 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n(String.Format(
8f70: 22 47 6f 74 20 67 75 69 64 20 7b 30 7d 2c 20 65  "Got guid {0}, e
8f80: 78 70 65 63 74 65 64 20 7b 31 7d 22 2c 20 72 65  xpected {1}", re
8f90: 61 64 65 72 2e 47 65 74 47 75 69 64 28 30 29 2c  ader.GetGuid(0),
8fa0: 20 67 75 69 64 29 29 3b 0d 0a 20 20 20 20 20 20   guid));..      
8fb0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
8fc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
8fd0: 28 53 65 71 75 65 6e 63 65 20 3d 20 32 30 29 5d  (Sequence = 20)]
8fe0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
8ff0: 6f 69 64 20 49 6e 73 65 72 74 54 61 62 6c 65 28  oid InsertTable(
9000: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
9010: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
9020: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
9030: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
9040: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
9050: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
9060: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 54 65   "INSERT INTO Te
9070: 73 74 43 61 73 65 28 46 69 65 6c 64 31 2c 20 46  stCase(Field1, F
9080: 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d  ield2, [Fi..ld3]
9090: 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65  , [Fi..ld4], Fie
90a0: 6c 64 35 29 20 56 41 4c 55 45 53 28 31 2c 20 33  ld5) VALUES(1, 3
90b0: 2e 31 34 31 35 39 2c 20 27 46 69 c3 ab 6c 64 33  .14159, 'Fi..ld3
90c0: 27 2c 20 27 46 69 c3 a6 6c 64 34 27 2c 20 27 32  ', 'Fi..ld4', '2
90d0: 30 30 35 2d 30 31 2d 30 31 20 31 33 3a 34 39 3a  005-01-01 13:49:
90e0: 30 30 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20  00')";..        
90f0: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
9100: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ery();..      }.
9110: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54  .    }....    [T
9120: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
9130: 61 6c 20 73 74 72 69 6e 67 20 49 74 65 72 61 74  al string Iterat
9140: 69 6f 6e 54 65 73 74 31 28 29 0d 0a 20 20 20 20  ionTest1()..    
9150: 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51  {..      CheckSQ
9160: 4c 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75  Lite();..      u
9170: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
9180: 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
9190: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
91a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e     {..        in
91b0: 74 20 64 74 53 74 61 72 74 3b 0d 0a 20 20 20 20  t dtStart;..    
91c0: 20 20 20 20 69 6e 74 20 64 74 45 6e 64 3b 0d 0a      int dtEnd;..
91d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 75          int nCou
91e0: 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 6c 6f 6e  nt;..        lon
91f0: 67 20 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  g n;....        
9200: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
9210: 3d 20 22 53 45 4c 45 43 54 20 46 6f 6f 28 49 44  = "SELECT Foo(ID
9220: 2c 20 49 44 29 20 46 52 4f 4d 20 54 65 73 74 43  , ID) FROM TestC
9230: 61 73 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 63  ase";..        c
9240: 6d 64 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a 20  md.Prepare();.. 
9250: 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20 3d         dtStart =
9260: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
9270: 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20  kCount;..       
9280: 20 6e 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20   nCount = 0;..  
9290: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44        using (DbD
92a0: 61 74 61 52 65 61 64 65 72 20 72 64 20 3d 20 63  ataReader rd = c
92b0: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
92c0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
92d0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
92e0: 28 72 64 2e 52 65 61 64 28 29 29 0d 0a 20 20 20  (rd.Read())..   
92f0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
9300: 20 20 20 20 20 20 6e 20 3d 20 72 64 2e 47 65 74        n = rd.Get
9310: 49 6e 74 36 34 28 30 29 3b 0d 0a 20 20 20 20 20  Int64(0);..     
9320: 20 20 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b         nCount++;
9330: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
9340: 20 20 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d           dtEnd =
9350: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
9360: 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20  kCount;..       
9370: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
9380: 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  rn String.Format
9390: 28 22 55 73 65 72 20 46 75 6e 63 74 69 6f 6e 20  ("User Function 
93a0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 7b 30 7d  iteration of {0}
93b0: 20 72 65 63 6f 72 64 73 20 69 6e 20 7b 31 7d 20   records in {1} 
93c0: 6d 73 22 2c 20 6e 43 6f 75 6e 74 2c 20 28 64 74  ms", nCount, (dt
93d0: 45 6e 64 20 2d 20 64 74 53 74 61 72 74 29 29 3b  End - dtStart));
93e0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
93f0: 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a  ....    [Test]..
9400: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72      internal str
9410: 69 6e 67 20 49 74 65 72 61 74 69 6f 6e 54 65 73  ing IterationTes
9420: 74 32 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  t2()..    {..   
9430: 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72     StringBuilder
9440: 20 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53   builder = new S
9450: 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0d  tringBuilder();.
9460: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
9470: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
9480: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
9490: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
94a0: 20 20 20 20 20 20 69 6e 74 20 64 74 53 74 61 72        int dtStar
94b0: 74 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t;..        int 
94c0: 64 74 45 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20  dtEnd;..        
94d0: 69 6e 74 20 6e 43 6f 75 6e 74 3b 0d 0a 20 20 20  int nCount;..   
94e0: 20 20 20 20 20 6c 6f 6e 67 20 6e 3b 0d 0a 0d 0a       long n;....
94f0: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
9500: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
9510: 54 20 49 44 20 46 52 4f 4d 20 54 65 73 74 43 61  T ID FROM TestCa
9520: 73 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  se";..        cm
9530: 64 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a 20 20  d.Prepare();..  
9540: 20 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20        dtStart = 
9550: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
9560: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
9570: 6e 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20 20  nCount = 0;..   
9580: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
9590: 74 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d  taReader rd = cm
95a0: 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
95b0: 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ))..        {.. 
95c0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28           while (
95d0: 72 64 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20  rd.Read())..    
95e0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
95f0: 20 20 20 20 20 6e 20 3d 20 72 64 2e 47 65 74 49       n = rd.GetI
9600: 6e 74 36 34 28 30 29 3b 0d 0a 20 20 20 20 20 20  nt64(0);..      
9610: 20 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b 0d        nCount++;.
9620: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
9630: 20 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20          dtEnd = 
9640: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
9650: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
9660: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
9670: 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n String.Format(
9680: 22 52 61 77 20 69 74 65 72 61 74 69 6f 6e 20 6f  "Raw iteration o
9690: 66 20 7b 30 7d 20 72 65 63 6f 72 64 73 20 69 6e  f {0} records in
96a0: 20 7b 31 7d 20 6d 73 22 2c 20 6e 43 6f 75 6e 74   {1} ms", nCount
96b0: 2c 20 28 64 74 45 6e 64 20 2d 20 64 74 53 74 61  , (dtEnd - dtSta
96c0: 72 74 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  rt));..      }..
96d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
96e0: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
96f0: 6c 20 73 74 72 69 6e 67 20 49 74 65 72 61 74 69  l string Iterati
9700: 6f 6e 54 65 73 74 33 28 29 0d 0a 20 20 20 20 7b  onTest3()..    {
9710: 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67 42 75  ..      StringBu
9720: 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20 3d 20  ilder builder = 
9730: 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65  new StringBuilde
9740: 72 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e  r();..      usin
9750: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
9760: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
9770: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
9780: 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  {..        int d
9790: 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20  tStart;..       
97a0: 20 69 6e 74 20 64 74 45 6e 64 3b 0d 0a 20 20 20   int dtEnd;..   
97b0: 20 20 20 20 20 69 6e 74 20 6e 43 6f 75 6e 74 3b       int nCount;
97c0: 0d 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6e  ..        long n
97d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ;....        cmd
97e0: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
97f0: 53 45 4c 45 43 54 20 41 42 53 28 49 44 29 20 46  SELECT ABS(ID) F
9800: 52 4f 4d 20 54 65 73 74 43 61 73 65 22 3b 0d 0a  ROM TestCase";..
9810: 20 20 20 20 20 20 20 20 63 6d 64 2e 50 72 65 70          cmd.Prep
9820: 61 72 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  are();..        
9830: 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f  dtStart = Enviro
9840: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
9850: 0d 0a 20 20 20 20 20 20 20 20 6e 43 6f 75 6e 74  ..        nCount
9860: 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 75   = 0;..        u
9870: 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64  sing (DbDataRead
9880: 65 72 20 72 64 20 3d 20 63 6d 64 2e 45 78 65 63  er rd = cmd.Exec
9890: 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20  uteReader())..  
98a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
98b0: 20 20 20 77 68 69 6c 65 20 28 72 64 2e 52 65 61     while (rd.Rea
98c0: 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  d())..          
98d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  {..            n
98e0: 20 3d 20 72 64 2e 47 65 74 49 6e 74 36 34 28 30   = rd.GetInt64(0
98f0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
9900: 6e 43 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 20 20 20  nCount++;..     
9910: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9920: 20 20 64 74 45 6e 64 20 3d 20 45 6e 76 69 72 6f    dtEnd = Enviro
9930: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
9940: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9950: 20 20 20 20 20 72 65 74 75 72 6e 20 53 74 72 69       return Stri
9960: 6e 67 2e 46 6f 72 6d 61 74 28 22 49 6e 74 72 69  ng.Format("Intri
9970: 6e 73 69 63 20 46 75 6e 63 74 69 6f 6e 20 69 74  nsic Function it
9980: 65 72 61 74 69 6f 6e 20 6f 66 20 7b 30 7d 20 72  eration of {0} r
9990: 65 63 6f 72 64 73 20 69 6e 20 7b 31 7d 20 6d 73  ecords in {1} ms
99a0: 22 2c 20 6e 43 6f 75 6e 74 2c 20 28 64 74 45 6e  ", nCount, (dtEn
99b0: 64 20 2d 20 64 74 53 74 61 72 74 29 29 3b 0d 0a  d - dtStart));..
99c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
99d0: 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75  ..    [Test(Sequ
99e0: 65 6e 63 65 3d 32 31 29 5d 0d 0a 20 20 20 20 69  ence=21)]..    i
99f0: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 4b 65 79  nternal void Key
9a00: 49 6e 66 6f 54 65 73 74 28 29 0d 0a 20 20 20 20  InfoTest()..    
9a10: 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  {..      using (
9a20: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
9a30: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
9a40: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
9a50: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
9a60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9a70: 20 20 2f 2f 20 46 69 72 73 74 20 74 65 73 74 20    // First test 
9a80: 61 67 61 69 6e 73 74 20 69 6e 74 65 67 65 72 20  against integer 
9a90: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 6f 70 74  primary key (opt
9aa0: 69 6d 69 7a 65 64 29 20 6b 65 79 69 6e 66 6f 20  imized) keyinfo 
9ab0: 66 65 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  fetch..         
9ac0: 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28   droptables.Add(
9ad0: 22 6b 65 79 69 6e 66 6f 74 65 73 74 22 29 3b 0d  "keyinfotest");.
9ae0: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43  .          cmd.C
9af0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 72  ommandText = "Cr
9b00: 65 61 74 65 20 74 61 62 6c 65 20 6b 65 79 69 6e  eate table keyin
9b10: 66 6f 74 65 73 74 20 28 69 64 20 69 6e 74 65 67  fotest (id integ
9b20: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  er primary key, 
9b30: 6d 79 75 6e 69 71 75 65 76 61 6c 75 65 20 69 6e  myuniquevalue in
9b40: 74 65 67 65 72 20 75 6e 69 71 75 65 20 6e 6f 74  teger unique not
9b50: 20 6e 75 6c 6c 2c 20 6d 79 76 61 6c 75 65 20 76   null, myvalue v
9b60: 61 72 63 68 61 72 28 35 30 29 29 22 3b 0d 0a 20  archar(50))";.. 
9b70: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
9b80: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
9b90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ...          cmd
9ba0: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
9bb0: 53 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 6b 65  Select * from ke
9bc0: 79 69 6e 66 6f 74 65 73 74 22 3b 0d 0a 20 20 20  yinfotest";..   
9bd0: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
9be0: 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65  DataReader reade
9bf0: 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  r = cmd.ExecuteR
9c00: 65 61 64 65 72 28 43 6f 6d 6d 61 6e 64 42 65 68  eader(CommandBeh
9c10: 61 76 69 6f 72 2e 4b 65 79 49 6e 66 6f 20 7c 20  avior.KeyInfo | 
9c20: 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e  CommandBehavior.
9c30: 53 63 68 65 6d 61 4f 6e 6c 79 29 29 0d 0a 20 20  SchemaOnly))..  
9c40: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
9c50: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 61         using (Da
9c60: 74 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 72 65  taTable tbl = re
9c70: 61 64 65 72 2e 47 65 74 53 63 68 65 6d 61 54 61  ader.GetSchemaTa
9c80: 62 6c 65 28 29 29 0d 0a 20 20 20 20 20 20 20 20  ble())..        
9c90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9ca0: 20 20 20 20 20 69 66 20 28 74 62 6c 2e 52 6f 77       if (tbl.Row
9cb0: 73 2e 43 6f 75 6e 74 20 21 3d 20 33 29 20 74 68  s.Count != 3) th
9cc0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
9cd0: 6e 28 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20  n("Wrong number 
9ce0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  of columns retur
9cf0: 6e 65 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ned");..        
9d00: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
9d10: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
9d20: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
9d30: 3d 20 22 53 45 4c 45 43 54 20 4d 79 56 61 6c 75  = "SELECT MyValu
9d40: 65 20 46 52 4f 4d 20 6b 65 79 69 6e 66 6f 74 65  e FROM keyinfote
9d50: 73 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  st";..          
9d60: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
9d70: 64 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64  der reader = cmd
9d80: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 43  .ExecuteReader(C
9d90: 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 4b  ommandBehavior.K
9da0: 65 79 49 6e 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64  eyInfo | Command
9db0: 42 65 68 61 76 69 6f 72 2e 53 63 68 65 6d 61 4f  Behavior.SchemaO
9dc0: 6e 6c 79 29 29 0d 0a 20 20 20 20 20 20 20 20 20  nly))..         
9dd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9de0: 75 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65  using (DataTable
9df0: 20 74 62 6c 20 3d 20 72 65 61 64 65 72 2e 47 65   tbl = reader.Ge
9e00: 74 53 63 68 65 6d 61 54 61 62 6c 65 28 29 29 0d  tSchemaTable()).
9e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9e30: 20 28 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74   (tbl.Rows.Count
9e40: 20 21 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77   != 2) throw new
9e50: 20 45 78 63 65 70 74 69 6f 6e 28 22 57 72 6f 6e   Exception("Wron
9e60: 67 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  g number of colu
9e70: 6d 6e 73 20 72 65 74 75 72 6e 65 64 22 29 3b 0d  mns returned");.
9e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
9e90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9ea0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9eb0: 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20  finally..       
9ec0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   {..        }...
9ed0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
9ee0: 6d 61 6e 64 54 65 78 74 20 3d 20 22 44 52 4f 50  mandText = "DROP
9ef0: 20 54 41 42 4c 45 20 6b 65 79 69 6e 66 6f 74 65   TABLE keyinfote
9f00: 73 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  st";..        cm
9f10: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
9f20: 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y();....        
9f30: 64 72 6f 70 74 61 62 6c 65 73 2e 52 65 6d 6f 76  droptables.Remov
9f40: 65 28 22 6b 65 79 69 6e 66 6f 74 65 73 74 22 29  e("keyinfotest")
9f50: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79  ;....        try
9f60: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
9f70: 20 20 20 20 20 20 20 2f 2f 20 4e 6f 77 20 74 65         // Now te
9f80: 73 74 20 61 67 61 69 6e 73 74 20 6e 6f 6e 2d 69  st against non-i
9f90: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
9fa0: 65 79 20 28 75 6e 6f 70 74 69 6d 69 7a 65 64 29  ey (unoptimized)
9fb0: 20 73 75 62 71 75 65 72 79 20 6b 65 79 69 6e 66   subquery keyinf
9fc0: 6f 20 66 65 74 63 68 0d 0a 20 20 20 20 20 20 20  o fetch..       
9fd0: 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64     droptables.Ad
9fe0: 64 28 22 6b 65 79 69 6e 66 6f 74 65 73 74 22 29  d("keyinfotest")
9ff0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ;..          cmd
a000: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
a010: 43 72 65 61 74 65 20 74 61 62 6c 65 20 6b 65 79  Create table key
a020: 69 6e 66 6f 74 65 73 74 20 28 69 64 20 63 68 61  infotest (id cha
a030: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 6d  r primary key, m
a040: 79 75 6e 69 71 75 65 76 61 6c 75 65 20 69 6e 74  yuniquevalue int
a050: 65 67 65 72 20 75 6e 69 71 75 65 20 6e 6f 74 20  eger unique not 
a060: 6e 75 6c 6c 2c 20 6d 79 76 61 6c 75 65 20 76 61  null, myvalue va
a070: 72 63 68 61 72 28 35 30 29 29 22 3b 0d 0a 20 20  rchar(50))";..  
a080: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
a090: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
a0a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  ..          cmd.
a0b0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
a0c0: 45 4c 45 43 54 20 4d 79 56 61 6c 75 65 20 46 52  ELECT MyValue FR
a0d0: 4f 4d 20 6b 65 79 69 6e 66 6f 74 65 73 74 22 3b  OM keyinfotest";
a0e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e  ..          usin
a0f0: 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20  g (DbDataReader 
a100: 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65  reader = cmd.Exe
a110: 63 75 74 65 52 65 61 64 65 72 28 43 6f 6d 6d 61  cuteReader(Comma
a120: 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65 79 49 6e  ndBehavior.KeyIn
a130: 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64 42 65 68 61  fo | CommandBeha
a140: 76 69 6f 72 2e 53 63 68 65 6d 61 4f 6e 6c 79 29  vior.SchemaOnly)
a150: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
a160: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
a170: 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c  g (DataTable tbl
a180: 20 3d 20 72 65 61 64 65 72 2e 47 65 74 53 63 68   = reader.GetSch
a190: 65 6d 61 54 61 62 6c 65 28 29 29 0d 0a 20 20 20  emaTable())..   
a1a0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
a1b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 62            if (tb
a1c0: 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d 20  l.Rows.Count != 
a1d0: 32 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  2) throw new Exc
a1e0: 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e 75  eption("Wrong nu
a1f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a200: 72 65 74 75 72 6e 65 64 22 29 3b 0d 0a 20 20 20  returned");..   
a210: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a220: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a230: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
a240: 54 65 78 74 20 3d 20 22 53 65 6c 65 63 74 20 2a  Text = "Select *
a250: 20 66 72 6f 6d 20 6b 65 79 69 6e 66 6f 74 65 73   from keyinfotes
a260: 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  t";..          u
a270: 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64  sing (DbDataRead
a280: 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e  er reader = cmd.
a290: 45 78 65 63 75 74 65 52 65 61 64 65 72 28 43 6f  ExecuteReader(Co
a2a0: 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65  mmandBehavior.Ke
a2b0: 79 49 6e 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64 42  yInfo | CommandB
a2c0: 65 68 61 76 69 6f 72 2e 53 63 68 65 6d 61 4f 6e  ehavior.SchemaOn
a2d0: 6c 79 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ly))..          
a2e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  {..            u
a2f0: 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20  sing (DataTable 
a300: 74 62 6c 20 3d 20 72 65 61 64 65 72 2e 47 65 74  tbl = reader.Get
a310: 53 63 68 65 6d 61 54 61 62 6c 65 28 29 29 0d 0a  SchemaTable())..
a320: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
a340: 28 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 20  (tbl.Rows.Count 
a350: 21 3d 20 33 29 20 74 68 72 6f 77 20 6e 65 77 20  != 3) throw new 
a360: 45 78 63 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67  Exception("Wrong
a370: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
a380: 6e 73 20 72 65 74 75 72 6e 65 64 22 29 3b 0d 0a  ns returned");..
a390: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
a3a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
a3b0: 20 20 20 20 20 20 20 20 2f 2f 20 4d 61 6b 65 20          // Make 
a3c0: 73 75 72 65 20 63 6f 6d 6d 61 6e 64 62 75 69 6c  sure commandbuil
a3d0: 64 65 72 20 63 61 6e 20 67 65 6e 65 72 61 74 65  der can generate
a3e0: 20 61 6e 20 75 70 64 61 74 65 20 63 6f 6d 6d 61   an update comma
a3f0: 6e 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  nd with the corr
a400: 65 63 74 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ect parameter co
a410: 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 75  unt..          u
a420: 73 69 6e 67 20 28 44 62 44 61 74 61 41 64 61 70  sing (DbDataAdap
a430: 74 65 72 20 61 64 70 20 3d 20 5f 66 61 63 74 2e  ter adp = _fact.
a440: 43 72 65 61 74 65 44 61 74 61 41 64 61 70 74 65  CreateDataAdapte
a450: 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  r())..          
a460: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
a470: 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20  Builder builder 
a480: 3d 20 5f 66 61 63 74 2e 43 72 65 61 74 65 43 6f  = _fact.CreateCo
a490: 6d 6d 61 6e 64 42 75 69 6c 64 65 72 28 29 29 0d  mmandBuilder()).
a4a0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
a4b0: 20 20 20 20 20 20 20 20 20 20 61 64 70 2e 53 65            adp.Se
a4c0: 6c 65 63 74 43 6f 6d 6d 61 6e 64 20 3d 20 63 6d  lectCommand = cm
a4d0: 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d;..            
a4e0: 62 75 69 6c 64 65 72 2e 44 61 74 61 41 64 61 70  builder.DataAdap
a4f0: 74 65 72 20 3d 20 61 64 70 3b 0d 0a 20 20 20 20  ter = adp;..    
a500: 20 20 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e          builder.
a510: 43 6f 6e 66 6c 69 63 74 4f 70 74 69 6f 6e 20 3d  ConflictOption =
a520: 20 43 6f 6e 66 6c 69 63 74 4f 70 74 69 6f 6e 2e   ConflictOption.
a530: 4f 76 65 72 77 72 69 74 65 43 68 61 6e 67 65 73  OverwriteChanges
a540: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
a550: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
a560: 64 20 75 70 64 61 74 65 63 6d 64 20 3d 20 62 75  d updatecmd = bu
a570: 69 6c 64 65 72 2e 47 65 74 55 70 64 61 74 65 43  ilder.GetUpdateC
a580: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
a590: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
a5a0: 20 20 20 20 20 20 20 20 69 66 20 28 75 70 64 61          if (upda
a5b0: 74 65 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73  tecmd.Parameters
a5c0: 2e 43 6f 75 6e 74 20 21 3d 20 34 29 0d 0a 20 20  .Count != 4)..  
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
a5e0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
a5f0: 6e 28 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20  n("Wrong number 
a600: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  of parameters in
a610: 20 75 70 64 61 74 65 20 63 6f 6d 6d 61 6e 64 21   update command!
a620: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
a630: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
a640: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
a650: 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20      finally..   
a660: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
a670: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
a680: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  }....    [Test].
a690: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
a6a0: 69 64 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72  id ConnectionStr
a6b0: 69 6e 67 42 75 69 6c 64 65 72 28 29 0d 0a 20 20  ingBuilder()..  
a6c0: 20 20 7b 0d 0a 20 20 20 20 20 20 44 62 43 6f 6e    {..      DbCon
a6d0: 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 42 75 69  nectionStringBui
a6e0: 6c 64 65 72 20 62 75 69 6c 64 65 72 20 3d 20 5f  lder builder = _
a6f0: 66 61 63 74 2e 43 72 65 61 74 65 43 6f 6e 6e 65  fact.CreateConne
a700: 63 74 69 6f 6e 53 74 72 69 6e 67 42 75 69 6c 64  ctionStringBuild
a710: 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  er();..      if 
a720: 28 62 75 69 6c 64 65 72 20 69 73 20 53 51 4c 69  (builder is SQLi
a730: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  teConnectionStri
a740: 6e 67 42 75 69 6c 64 65 72 29 0d 0a 20 20 20 20  ngBuilder)..    
a750: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 62 6f 6f    {..        boo
a760: 6c 20 70 6f 6f 6c 20 3d 20 28 28 53 51 4c 69 74  l pool = ((SQLit
a770: 65 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e  eConnectionStrin
a780: 67 42 75 69 6c 64 65 72 29 62 75 69 6c 64 65 72  gBuilder)builder
a790: 29 2e 50 6f 6f 6c 69 6e 67 3b 0d 0a 20 20 20 20  ).Pooling;..    
a7a0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
a7b0: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
a7c0: 74 65 72 6e 61 6c 20 76 6f 69 64 20 4c 65 61 6b  ternal void Leak
a7d0: 79 43 6f 6d 6d 61 6e 64 73 28 29 0d 0a 20 20 20  yCommands()..   
a7e0: 20 7b 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69   {..      for (i
a7f0: 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30  nt n = 0; n < 10
a800: 30 30 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  0000; n++)..    
a810: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 62 43    {..        DbC
a820: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
a830: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
a840: 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  );..        cmd.
a850: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
a860: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
a870: 69 74 65 5f 6d 61 73 74 65 72 22 3b 0d 0a 20 20  ite_master";..  
a880: 20 20 20 20 20 20 63 6d 64 2e 50 72 65 70 61 72        cmd.Prepar
a890: 65 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  e();..      }.. 
a8a0: 20 20 20 20 20 43 68 65 63 6b 4c 6f 63 6b 65 64       CheckLocked
a8b0: 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ();..    }....  
a8c0: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
a8d0: 20 3d 20 36 30 29 5d 0d 0a 20 20 20 20 69 6e 74   = 60)]..    int
a8e0: 65 72 6e 61 6c 20 76 6f 69 64 20 4c 6f 63 6b 54  ernal void LockT
a8f0: 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
a900: 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28      CheckSQLite(
a910: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e  );....      usin
a920: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
a930: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
a940: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
a950: 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  {..        cmd.C
a960: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
a970: 4c 45 43 54 20 46 69 65 6c 64 36 20 46 52 4f 4d  LECT Field6 FROM
a980: 20 54 65 73 74 43 61 73 65 20 57 48 45 52 45 20   TestCase WHERE 
a990: 46 69 65 6c 64 36 20 49 53 20 4e 4f 54 20 4e 55  Field6 IS NOT NU
a9a0: 4c 4c 22 3b 0d 0a 20 20 20 20 20 20 20 20 62 79  LL";..        by
a9b0: 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20 62 79 74  te[] b = new byt
a9c0: 65 5b 34 30 30 30 5d 3b 0d 0a 0d 0a 20 20 20 20  e[4000];....    
a9d0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
a9e0: 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64  aReader rd = cmd
a9f0: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29  .ExecuteReader()
aa00: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
aa10: 20 20 20 20 20 20 20 20 69 66 20 28 72 64 2e 52          if (rd.R
aa20: 65 61 64 28 29 20 3d 3d 20 66 61 6c 73 65 29 20  ead() == false) 
aa30: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
aa40: 69 6f 6e 28 22 4e 6f 20 64 61 74 61 20 74 6f 20  ion("No data to 
aa50: 72 65 61 64 21 22 29 3b 0d 0a 0d 0a 20 20 20 20  read!");....    
aa60: 20 20 20 20 20 20 72 64 2e 47 65 74 42 79 74 65        rd.GetByte
aa70: 73 28 30 2c 20 30 2c 20 62 2c 20 30 2c 20 34 30  s(0, 0, b, 0, 40
aa80: 30 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  00);....        
aa90: 20 20 69 66 20 28 62 5b 30 5d 20 21 3d 20 31 29    if (b[0] != 1)
aaa0: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
aab0: 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61 6c  tion("Binary val
aac0: 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74  ue non-match byt
aad0: 65 20 30 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  e 0");..        
aae0: 20 20 69 66 20 28 62 5b 31 30 30 5d 20 21 3d 20    if (b[100] != 
aaf0: 32 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  2) throw new Exc
ab00: 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76  eption("Binary v
ab10: 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62  alue non-match b
ab20: 79 74 65 20 31 30 30 22 29 3b 0d 0a 20 20 20 20  yte 100");..    
ab30: 20 20 20 20 20 20 69 66 20 28 62 5b 31 30 30 30        if (b[1000
ab40: 5d 20 21 3d 20 33 29 20 74 68 72 6f 77 20 6e 65  ] != 3) throw ne
ab50: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e  w Exception("Bin
ab60: 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61  ary value non-ma
ab70: 74 63 68 20 62 79 74 65 20 31 30 30 30 22 29 3b  tch byte 1000");
ab80: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
ab90: 62 5b 32 30 30 30 5d 20 21 3d 20 34 29 20 74 68  b[2000] != 4) th
aba0: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
abb0: 6e 28 22 42 69 6e 61 72 79 20 76 61 6c 75 65 20  n("Binary value 
abc0: 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65 20 32  non-match byte 2
abd0: 30 30 30 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  000");..        
abe0: 20 20 69 66 20 28 62 5b 33 30 30 30 5d 20 21 3d    if (b[3000] !=
abf0: 20 35 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78   5) throw new Ex
ac00: 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20  ception("Binary 
ac10: 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20  value non-match 
ac20: 62 79 74 65 20 33 30 30 30 22 29 3b 0d 0a 0d 0a  byte 3000");....
ac30: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
ac40: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  (DbConnection cl
ac50: 6f 6e 65 20 3d 20 28 44 62 43 6f 6e 6e 65 63 74  one = (DbConnect
ac60: 69 6f 6e 29 28 28 49 43 6c 6f 6e 65 61 62 6c 65  ion)((ICloneable
ac70: 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 29 0d  )_cnn).Clone()).
ac80: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
ac90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6c            if (cl
aca0: 6f 6e 65 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e  one.State != Con
acb0: 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65  nectionState.Ope
acc0: 6e 29 20 63 6c 6f 6e 65 2e 4f 70 65 6e 28 29 3b  n) clone.Open();
acd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
ace0: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 6e  ing (DbCommand n
acf0: 65 77 63 6d 64 20 3d 20 63 6c 6f 6e 65 2e 43 72  ewcmd = clone.Cr
ad00: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
ad30: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
ad40: 3d 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 54  = "DELETE FROM T
ad50: 65 73 74 43 61 73 65 20 57 48 45 52 45 20 46 69  estCase WHERE Fi
ad60: 65 6c 64 36 20 49 53 20 4e 55 4c 4c 22 3b 0d 0a  eld6 IS NULL";..
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
ad80: 77 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 69 6d 65  wcmd.CommandTime
ad90: 6f 75 74 20 3d 20 32 3b 0d 0a 20 20 20 20 20 20  out = 2;..      
ada0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6d 64 53          int cmdS
adb0: 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65  tart = Environme
adc0: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20  nt.TickCount;.. 
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
ade0: 20 63 6d 64 45 6e 64 3b 0d 0a 0d 0a 20 20 20 20   cmdEnd;....    
adf0: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 6e 65 77 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f  newcmd.ExecuteNo
ae30: 6e 51 75 65 72 79 28 29 3b 20 2f 2f 20 73 68 6f  nQuery(); // sho
ae40: 75 6c 64 20 66 61 69 6c 20 62 65 63 61 75 73 65  uld fail because
ae50: 20 74 68 65 72 65 27 73 20 61 20 72 65 61 64 65   there's a reade
ae60: 72 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  r on the databas
ae70: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
ae80: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67     throw new Arg
ae90: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22  umentException("
aea0: 53 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  Should not have 
aeb0: 61 6c 6c 6f 77 65 64 20 61 6e 20 65 78 65 63 75  allowed an execu
aec0: 74 65 20 77 69 74 68 20 61 6e 20 6f 70 65 6e 20  te with an open 
aed0: 72 65 61 64 65 72 22 29 3b 20 2f 2f 20 49 66 20  reader"); // If 
aee0: 77 65 20 67 6f 74 20 68 65 72 65 2c 20 74 68 65  we got here, the
aef0: 20 74 65 73 74 20 66 61 69 6c 65 64 0d 0a 20 20   test failed..  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
af20: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29  ch (Exception e)
af30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
af40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
af50: 20 20 20 69 66 20 28 65 20 69 73 20 41 72 67 75     if (e is Argu
af60: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 29 20 74  mentException) t
af70: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
af80: 6f 6e 28 65 2e 4d 65 73 73 61 67 65 29 3b 0d 0a  on(e.Message);..
af90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
afa0: 20 20 63 6d 64 45 6e 64 20 3d 20 45 6e 76 69 72    cmdEnd = Envir
afb0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
afc0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
afd0: 20 20 20 69 66 20 28 63 6d 64 45 6e 64 20 2d 20     if (cmdEnd - 
afe0: 63 6d 64 53 74 61 72 74 20 3c 20 32 30 30 30 20  cmdStart < 2000 
aff0: 7c 7c 20 63 6d 64 45 6e 64 20 2d 20 63 6d 64 53  || cmdEnd - cmdS
b000: 74 61 72 74 20 3e 20 33 30 30 30 29 0d 0a 20 20  tart > 3000)..  
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
b030: 69 6f 6e 28 22 44 69 64 20 6e 6f 74 20 67 69 76  ion("Did not giv
b040: 65 20 75 70 20 74 68 65 20 6c 6f 63 6b 20 61 74  e up the lock at
b050: 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 21   the right time!
b060: 22 29 3b 20 2f 2f 20 44 69 64 6e 27 74 20 77 61  "); // Didn't wa
b070: 69 74 20 74 68 65 20 72 69 67 68 74 20 61 6d 6f  it the right amo
b080: 75 6e 74 20 6f 66 20 74 69 6d 65 0d 0a 0d 0a 20  unt of time.... 
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
b0b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
b0c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
b0d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
b0e0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
b0f0: 2f 2f 2f 20 45 78 65 63 75 74 65 20 6d 75 6c 74  /// Execute mult
b100: 69 70 6c 65 20 73 74 65 70 73 20 69 6e 20 61 20  iple steps in a 
b110: 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 76 65 72 69  command and veri
b120: 66 79 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  fy the results. 
b130: 20 4d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   Makes sure that
b140: 20 63 6f 6d 6d 61 6e 64 73 20 61 66 74 65 72 20   commands after 
b150: 61 20 73 65 6c 65 63 74 20 73 74 69 6c 6c 0d 0a  a select still..
b160: 20 20 20 20 2f 2f 2f 20 67 65 74 20 65 78 65 63      /// get exec
b170: 75 74 65 64 20 65 76 65 6e 20 69 66 20 4d 6f 76  uted even if Mov
b180: 65 4e 65 78 74 28 29 20 69 73 6e 27 74 20 63 61  eNext() isn't ca
b190: 6c 6c 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  lled explicitly 
b1a0: 74 6f 20 6d 6f 76 65 20 74 68 69 6e 67 73 20 61  to move things a
b1b0: 6c 6f 6e 67 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  long...    /// <
b1c0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b  /summary>..    [
b1d0: 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72  Test]..    inter
b1e0: 6e 61 6c 20 76 6f 69 64 20 4d 75 6c 74 69 53 74  nal void MultiSt
b1f0: 65 70 52 65 61 64 65 72 54 65 73 74 28 29 0d 0a  epReaderTest()..
b200: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69      {..      usi
b210: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
b220: 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
b230: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
b240: 20 7b 0d 0a 20 20 20 20 20 20 20 20 64 72 6f 70   {..        drop
b250: 74 61 62 6c 65 73 2e 41 64 64 28 22 73 74 65 70  tables.Add("step
b260: 72 65 61 64 65 72 22 29 3b 0d 0a 20 20 20 20 20  reader");..     
b270: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
b280: 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41 42  xt = "CREATE TAB
b290: 4c 45 20 73 74 65 70 72 65 61 64 65 72 20 28 69  LE stepreader (i
b2a0: 64 20 69 6e 74 20 70 72 69 6d 61 72 79 20 6b 65  d int primary ke
b2b0: 79 29 3b 49 4e 53 45 52 54 20 49 4e 54 4f 20 73  y);INSERT INTO s
b2c0: 74 65 70 72 65 61 64 65 72 20 76 61 6c 75 65 73  tepreader values
b2d0: 28 31 29 3b 53 45 4c 45 43 54 20 2a 20 46 52 4f  (1);SELECT * FRO
b2e0: 4d 20 73 74 65 70 72 65 61 64 65 72 3b 55 50 44  M stepreader;UPD
b2f0: 41 54 45 20 73 74 65 70 72 65 61 64 65 72 20 73  ATE stepreader s
b300: 65 74 20 69 64 20 3d 20 69 64 20 2b 20 31 3b 22  et id = id + 1;"
b310: 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ;..        using
b320: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
b330: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
b340: 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20  uteReader())..  
b350: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
b360: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 52 65     if (reader.Re
b370: 61 64 28 29 20 3d 3d 20 66 61 6c 73 65 29 20 74  ad() == false) t
b380: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
b390: 6f 6e 28 22 46 61 69 6c 65 64 20 74 6f 20 72 65  on("Failed to re
b3a0: 61 64 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ad from the tabl
b3b0: 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e");..          
b3c0: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 49 6e  if (reader.GetIn
b3d0: 74 33 32 28 30 29 20 21 3d 20 31 29 20 74 68 72  t32(0) != 1) thr
b3e0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
b3f0: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
b400: 45 78 70 65 63 74 65 64 20 7b 30 7d 20 67 6f 74  Expected {0} got
b410: 20 7b 31 7d 22 2c 20 31 2c 20 72 65 61 64 65 72   {1}", 1, reader
b420: 2e 47 65 74 49 6e 74 33 32 28 30 29 29 29 3b 0d  .GetInt32(0)));.
b430: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b440: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
b450: 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20  ext = "SELECT * 
b460: 46 52 4f 4d 20 73 74 65 70 72 65 61 64 65 72 22  FROM stepreader"
b470: 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ;..        using
b480: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
b490: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
b4a0: 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20  uteReader())..  
b4b0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
b4c0: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 52 65     if (reader.Re
b4d0: 61 64 28 29 20 3d 3d 20 66 61 6c 73 65 29 20 74  ad() == false) t
b4e0: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
b4f0: 6f 6e 28 22 46 61 69 6c 65 64 20 74 6f 20 72 65  on("Failed to re
b500: 61 64 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ad from the tabl
b510: 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e");..          
b520: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 49 6e  if (reader.GetIn
b530: 74 33 32 28 30 29 20 21 3d 20 32 29 20 74 68 72  t32(0) != 2) thr
b540: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
b550: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
b560: 45 78 70 65 63 74 65 64 20 7b 30 7d 20 67 6f 74  Expected {0} got
b570: 20 7b 31 7d 22 2c 20 32 2c 20 72 65 61 64 65 72   {1}", 2, reader
b580: 2e 47 65 74 49 6e 74 33 32 28 30 29 29 29 3b 0d  .GetInt32(0)));.
b590: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b5a0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
b5b0: 20 20 69 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73    internal class
b5c0: 20 4d 54 54 65 73 74 0d 0a 20 20 20 20 7b 0d 0a   MTTest..    {..
b5d0: 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 44        internal D
b5e0: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 3b  bConnection cnn;
b5f0: 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c  ..      internal
b600: 20 45 78 63 65 70 74 69 6f 6e 20 65 3b 0d 0a 20   Exception e;.. 
b610: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 79       internal Sy
b620: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54  stem.Threading.T
b630: 68 72 65 61 64 20 74 3b 0d 0a 20 20 20 20 20 20  hread t;..      
b640: 69 6e 74 65 72 6e 61 6c 20 69 6e 74 20 76 61 6c  internal int val
b650: 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ue;..    }....  
b660: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
b670: 3d 31 31 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72  =11)]..    inter
b680: 6e 61 6c 20 76 6f 69 64 20 4d 75 6c 74 69 74 68  nal void Multith
b690: 72 65 61 64 69 6e 67 54 65 73 74 28 29 0d 0a 20  readingTest().. 
b6a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e     {..      usin
b6b0: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
b6c0: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
b6d0: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
b6e0: 7b 0d 0a 20 20 20 20 20 20 20 20 64 72 6f 70 74  {..        dropt
b6f0: 61 62 6c 65 73 2e 41 64 64 28 22 4d 75 6c 74 69  ables.Add("Multi
b700: 54 68 72 65 61 64 65 64 54 65 73 74 22 29 3b 0d  ThreadedTest");.
b710: 0a 20 20 20 20 20 20 20 20 69 66 20 28 5f 66 61  .        if (_fa
b720: 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d  ct.GetType().Nam
b730: 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74  e.IndexOf("SQLit
b740: 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  e", StringCompar
b750: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
b760: 72 65 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a  reCase) == -1)..
b770: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
b780: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45  mmandText = "CRE
b790: 41 54 45 20 54 41 42 4c 45 20 4d 75 6c 74 69 54  ATE TABLE MultiT
b7a0: 68 72 65 61 64 65 64 54 65 73 74 28 49 44 20 69  hreadedTest(ID i
b7b0: 6e 74 65 67 65 72 20 69 64 65 6e 74 69 74 79 20  nteger identity 
b7c0: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 54 68 72  primary key, Thr
b7d0: 65 61 64 49 64 20 69 6e 74 65 67 65 72 2c 20 4d  eadId integer, M
b7e0: 79 56 61 6c 75 65 20 69 6e 74 65 67 65 72 29 22  yValue integer)"
b7f0: 3b 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d  ;..        else.
b800: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43  .          cmd.C
b810: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52  ommandText = "CR
b820: 45 41 54 45 20 54 41 42 4c 45 20 4d 75 6c 74 69  EATE TABLE Multi
b830: 54 68 72 65 61 64 65 64 54 65 73 74 28 49 44 20  ThreadedTest(ID 
b840: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
b850: 6b 65 79 2c 20 54 68 72 65 61 64 49 64 20 69 6e  key, ThreadId in
b860: 74 65 67 65 72 2c 20 4d 79 56 61 6c 75 65 20 69  teger, MyValue i
b870: 6e 74 65 67 65 72 29 22 3b 0d 0a 0d 0a 20 20 20  nteger)";....   
b880: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
b890: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
b8a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 4d 54     }....      MT
b8b0: 54 65 73 74 5b 5d 20 61 72 72 20 3d 20 6e 65 77  Test[] arr = new
b8c0: 20 4d 54 54 65 73 74 5b 38 5d 3b 0d 0a 0d 0a 20   MTTest[8];.... 
b8d0: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
b8e0: 3d 20 30 3b 20 6e 20 3c 20 61 72 72 2e 4c 65 6e  = 0; n < arr.Len
b8f0: 67 74 68 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20  gth; n++)..     
b900: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b   {..        arr[
b910: 6e 5d 20 3d 20 6e 65 77 20 4d 54 54 65 73 74 28  n] = new MTTest(
b920: 29 3b 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b  );..        arr[
b930: 6e 5d 2e 74 20 3d 20 6e 65 77 20 53 79 73 74 65  n].t = new Syste
b940: 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
b950: 61 64 28 6e 65 77 20 53 79 73 74 65 6d 2e 54 68  ad(new System.Th
b960: 72 65 61 64 69 6e 67 2e 50 61 72 61 6d 65 74 65  reading.Paramete
b970: 72 69 7a 65 64 54 68 72 65 61 64 53 74 61 72 74  rizedThreadStart
b980: 28 4d 75 6c 74 69 74 68 72 65 61 64 65 64 54 65  (MultithreadedTe
b990: 73 74 54 68 72 65 61 64 29 29 3b 0d 0a 20 20 20  stThread));..   
b9a0: 20 20 20 20 20 61 72 72 5b 6e 5d 2e 74 2e 49 73       arr[n].t.Is
b9b0: 42 61 63 6b 67 72 6f 75 6e 64 20 3d 20 74 72 75  Background = tru
b9c0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 61 72 72 5b  e;..        arr[
b9d0: 6e 5d 2e 63 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e  n].cnn = ((IClon
b9e0: 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e  eable)_cnn).Clon
b9f0: 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74  e() as DbConnect
ba00: 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 61 72  ion;..        ar
ba10: 72 5b 6e 5d 2e 74 2e 53 74 61 72 74 28 61 72 72  r[n].t.Start(arr
ba20: 5b 6e 5d 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  [n]);..      }..
ba30: 0d 0a 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54  ..      System.T
ba40: 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e  hreading.Thread.
ba50: 53 6c 65 65 70 28 38 30 30 30 29 3b 0d 0a 20 20  Sleep(8000);..  
ba60: 20 20 20 20 62 6f 6f 6c 20 66 61 69 6c 65 64 20      bool failed 
ba70: 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  = false;..      
ba80: 45 78 63 65 70 74 69 6f 6e 20 65 20 3d 20 6e 75  Exception e = nu
ba90: 6c 6c 3b 0d 0a 20 20 20 20 20 20 66 6f 72 20 28  ll;..      for (
baa0: 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 61  int n = 0; n < a
bab0: 72 72 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0d  rr.Length; n++).
bac0: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
bad0: 20 20 69 66 20 28 61 72 72 5b 6e 5d 2e 74 2e 4a    if (arr[n].t.J
bae0: 6f 69 6e 28 30 29 20 3d 3d 20 66 61 6c 73 65 29  oin(0) == false)
baf0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
bb00: 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
bb10: 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
bb20: 20 61 72 72 5b 6e 5d 2e 74 2e 41 62 6f 72 74 28   arr[n].t.Abort(
bb30: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
bb40: 20 20 20 20 20 20 20 69 66 20 28 61 72 72 5b 6e         if (arr[n
bb50: 5d 2e 65 20 21 3d 20 6e 75 6c 6c 29 20 65 20 3d  ].e != null) e =
bb60: 20 61 72 72 5b 6e 5d 2e 65 3b 0d 0a 20 20 20 20   arr[n].e;..    
bb70: 20 20 20 20 61 72 72 5b 6e 5d 2e 63 6e 6e 2e 44      arr[n].cnn.D
bb80: 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20  ispose();..     
bb90: 20 7d 0d 0a 20 20 20 20 20 20 69 66 20 28 66 61   }..      if (fa
bba0: 69 6c 65 64 29 20 74 68 72 6f 77 20 6e 65 77 20  iled) throw new 
bbb0: 45 78 63 65 70 74 69 6f 6e 28 22 4f 6e 65 20 6f  Exception("One o
bbc0: 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 64  r more threads d
bbd0: 65 61 64 6c 6f 63 6b 65 64 22 29 3b 0d 0a 20 20  eadlocked");..  
bbe0: 20 20 20 20 69 66 20 28 65 20 21 3d 20 6e 75 6c      if (e != nul
bbf0: 6c 29 20 0d 0a 20 20 20 20 20 20 20 20 74 68 72  l) ..        thr
bc00: 6f 77 20 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ow e;..    }....
bc10: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
bc20: 64 20 4d 75 6c 74 69 74 68 72 65 61 64 65 64 54  d MultithreadedT
bc30: 65 73 74 54 68 72 65 61 64 28 6f 62 6a 65 63 74  estThread(object
bc40: 20 6f 62 6a 29 0d 0a 20 20 20 20 7b 0d 0a 20 20   obj)..    {..  
bc50: 20 20 20 20 4d 54 54 65 73 74 20 74 65 73 74 20      MTTest test 
bc60: 3d 20 6f 62 6a 20 61 73 20 4d 54 54 65 73 74 3b  = obj as MTTest;
bc70: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 74 65  ....      if (te
bc80: 73 74 2e 63 6e 6e 2e 53 74 61 74 65 20 21 3d 20  st.cnn.State != 
bc90: 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e  ConnectionState.
bca0: 4f 70 65 6e 29 0d 0a 20 20 20 20 20 20 20 20 74  Open)..        t
bcb0: 65 73 74 2e 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d  est.cnn.Open();.
bcc0: 0a 0d 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  ...      int sta
bcd0: 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  rt = Environment
bce0: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
bcf0: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 7b 0d     try..      {.
bd00: 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28  .        using (
bd10: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
bd20: 74 65 73 74 2e 63 6e 6e 2e 43 72 65 61 74 65 43  test.cnn.CreateC
bd30: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
bd40: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
bd50: 77 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65  while (Environme
bd60: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 73  nt.TickCount - s
bd70: 74 61 72 74 20 3c 20 32 30 30 30 29 0d 0a 20 20  tart < 2000)..  
bd80: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
bd90: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
bda0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 74 72 61 6e  Transaction tran
bdb0: 73 20 3d 20 74 65 73 74 2e 63 6e 6e 2e 42 65 67  s = test.cnn.Beg
bdc0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29  inTransaction())
bdd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
bde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
bdf0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
be00: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
be10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 4d 75  SELECT * FROM Mu
be20: 6c 74 69 54 68 72 65 61 64 65 64 54 65 73 74 20  ltiThreadedTest 
be30: 57 48 45 52 45 20 54 68 72 65 61 64 49 64 20 3d  WHERE ThreadId =
be40: 20 7b 30 7d 22 2c 20 74 65 73 74 2e 74 2e 4d 61   {0}", test.t.Ma
be50: 6e 61 67 65 64 54 68 72 65 61 64 49 64 29 3b 0d  nagedThreadId);.
be60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
be70: 6d 64 2e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  md.Transaction =
be80: 20 74 72 61 6e 73 3b 0d 0a 20 20 20 20 20 20 20   trans;..       
be90: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
bea0: 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65  DataReader reade
beb0: 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  r = cmd.ExecuteR
bec0: 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20  eader())..      
bed0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
bee0: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
bef0: 20 28 72 65 61 64 65 72 2e 52 65 61 64 28 29 29   (reader.Read())
bf00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf10: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
bf20: 20 20 20 20 20 20 20 74 65 73 74 2e 76 61 6c 75         test.valu
bf30: 65 20 2b 3d 20 43 6f 6e 76 65 72 74 2e 54 6f 49  e += Convert.ToI
bf40: 6e 74 33 32 28 72 65 61 64 65 72 5b 32 5d 29 3b  nt32(reader[2]);
bf50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf60: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
bf70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
bf80: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
bf90: 65 78 74 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ext = String.For
bfa0: 6d 61 74 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  mat("INSERT INTO
bfb0: 20 4d 75 6c 74 69 54 68 72 65 61 64 65 64 54 65   MultiThreadedTe
bfc0: 73 74 28 54 68 72 65 61 64 49 64 2c 20 4d 79 56  st(ThreadId, MyV
bfd0: 61 6c 75 65 29 20 56 41 4c 55 45 53 28 7b 30 7d  alue) VALUES({0}
bfe0: 2c 20 7b 31 7d 29 22 2c 20 74 65 73 74 2e 74 2e  , {1})", test.t.
bff0: 4d 61 6e 61 67 65 64 54 68 72 65 61 64 49 64 2c  ManagedThreadId,
c000: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
c010: 6b 43 6f 75 6e 74 29 3b 0d 0a 20 20 20 20 20 20  kCount);..      
c020: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
c030: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
c040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c050: 74 72 61 6e 73 2e 43 6f 6d 6d 69 74 28 29 3b 0d  trans.Commit();.
c060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
c070: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
c080: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
c090: 0a 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78  .      catch (Ex
c0a0: 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ception e)..    
c0b0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 65 73    {..        tes
c0c0: 74 2e 65 20 3d 20 65 3b 0d 0a 20 20 20 20 20 20  t.e = e;..      
c0d0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
c0e0: 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65  [Test]..    inte
c0f0: 72 6e 61 6c 20 76 6f 69 64 20 50 61 72 61 6d 65  rnal void Parame
c100: 74 65 72 69 7a 65 64 49 6e 73 65 72 74 28 29 0d  terizedInsert().
c110: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73  .    {..      us
c120: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
c130: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
c140: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
c150: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64    {..        cmd
c160: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
c170: 49 4e 53 45 52 54 20 49 4e 54 4f 20 54 65 73 74  INSERT INTO Test
c180: 43 61 73 65 28 46 69 65 6c 64 31 2c 20 46 69 65  Case(Field1, Fie
c190: 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d 2c 20  ld2, [Fi..ld3], 
c1a0: 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65 6c 64  [Fi..ld4], Field
c1b0: 35 29 20 56 41 4c 55 45 53 28 40 70 31 2c 40 70  5) VALUES(@p1,@p
c1c0: 32 2c 40 70 33 2c 40 70 34 2c 40 70 35 29 22 3b  2,@p3,@p4,@p5)";
c1d0: 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61  ..        DbPara
c1e0: 6d 65 74 65 72 20 46 69 65 6c 64 31 20 3d 20 63  meter Field1 = c
c1f0: 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74  md.CreateParamet
c200: 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 44  er();..        D
c210: 62 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64  bParameter Field
c220: 32 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61  2 = cmd.CreatePa
c230: 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20  rameter();..    
c240: 20 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20      DbParameter 
c250: 46 69 65 6c 64 33 20 3d 20 63 6d 64 2e 43 72 65  Field3 = cmd.Cre
c260: 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0d  ateParameter();.
c270: 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d  .        DbParam
c280: 65 74 65 72 20 46 69 65 6c 64 34 20 3d 20 63 6d  eter Field4 = cm
c290: 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  d.CreateParamete
c2a0: 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 44 62  r();..        Db
c2b0: 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 35  Parameter Field5
c2c0: 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72   = cmd.CreatePar
c2d0: 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20  ameter();....   
c2e0: 20 20 20 20 20 46 69 65 6c 64 31 2e 50 61 72 61       Field1.Para
c2f0: 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 31  meterName = "@p1
c300: 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c  ";..        Fiel
c310: 64 32 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65  d2.ParameterName
c320: 20 3d 20 22 40 70 32 22 3b 0d 0a 20 20 20 20 20   = "@p2";..     
c330: 20 20 20 46 69 65 6c 64 33 2e 50 61 72 61 6d 65     Field3.Parame
c340: 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 33 22 3b  terName = "@p3";
c350: 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 34  ..        Field4
c360: 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d  .ParameterName =
c370: 20 22 40 70 34 22 3b 0d 0a 20 20 20 20 20 20 20   "@p4";..       
c380: 20 46 69 65 6c 64 35 2e 50 61 72 61 6d 65 74 65   Field5.Paramete
c390: 72 4e 61 6d 65 20 3d 20 22 40 70 35 22 3b 0d 0a  rName = "@p5";..
c3a0: 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 31  ..        Field1
c3b0: 2e 56 61 6c 75 65 20 3d 20 32 3b 0d 0a 20 20 20  .Value = 2;..   
c3c0: 20 20 20 20 20 46 69 65 6c 64 32 2e 56 61 6c 75       Field2.Valu
c3d0: 65 20 3d 20 33 2e 31 34 31 35 39 3b 0d 0a 20 20  e = 3.14159;..  
c3e0: 20 20 20 20 20 20 46 69 65 6c 64 33 2e 56 61 6c        Field3.Val
c3f0: 75 65 20 3d 20 22 50 61 72 61 6d 20 46 69 65 6c  ue = "Param Fiel
c400: 64 33 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  d3";..        Fi
c410: 65 6c 64 34 2e 56 61 6c 75 65 20 3d 20 22 46 69  eld4.Value = "Fi
c420: 65 6c 64 34 20 50 61 72 22 3b 0d 0a 20 20 20 20  eld4 Par";..    
c430: 20 20 20 20 46 69 65 6c 64 35 2e 56 61 6c 75 65      Field5.Value
c440: 20 3d 20 44 61 74 65 54 69 6d 65 2e 4e 6f 77 3b   = DateTime.Now;
c450: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
c460: 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46  Parameters.Add(F
c470: 69 65 6c 64 31 29 3b 0d 0a 20 20 20 20 20 20 20  ield1);..       
c480: 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e   cmd.Parameters.
c490: 41 64 64 28 46 69 65 6c 64 32 29 3b 0d 0a 20 20  Add(Field2);..  
c4a0: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
c4b0: 74 65 72 73 2e 41 64 64 28 46 69 65 6c 64 33 29  ters.Add(Field3)
c4c0: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ;..        cmd.P
c4d0: 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69  arameters.Add(Fi
c4e0: 65 6c 64 34 29 3b 0d 0a 20 20 20 20 20 20 20 20  eld4);..        
c4f0: 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41  cmd.Parameters.A
c500: 64 64 28 46 69 65 6c 64 35 29 3b 0d 0a 0d 0a 20  dd(Field5);.... 
c510: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
c520: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20  teNonQuery();.. 
c530: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
c540: 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20  .    [Test]..   
c550: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 50   internal void P
c560: 61 72 61 6d 65 74 65 72 69 7a 65 64 49 6e 73 65  arameterizedInse
c570: 72 74 4d 69 73 73 69 6e 67 50 61 72 61 6d 73 28  rtMissingParams(
c580: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
c590: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
c5a0: 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
c5b0: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
c5c0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
c5d0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
c5e0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 54 65   "INSERT INTO Te
c5f0: 73 74 43 61 73 65 28 46 69 65 6c 64 31 2c 20 46  stCase(Field1, F
c600: 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d  ield2, [Fi..ld3]
c610: 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65  , [Fi..ld4], Fie
c620: 6c 64 35 29 20 56 41 4c 55 45 53 28 40 70 31 2c  ld5) VALUES(@p1,
c630: 40 70 32 2c 40 70 33 2c 40 70 34 2c 40 70 35 29  @p2,@p3,@p4,@p5)
c640: 22 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61  ";..        DbPa
c650: 72 61 6d 65 74 65 72 20 46 69 65 6c 64 31 20 3d  rameter Field1 =
c660: 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d   cmd.CreateParam
c670: 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  eter();..       
c680: 20 44 62 50 61 72 61 6d 65 74 65 72 20 46 69 65   DbParameter Fie
c690: 6c 64 32 20 3d 20 63 6d 64 2e 43 72 65 61 74 65  ld2 = cmd.Create
c6a0: 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20  Parameter();..  
c6b0: 20 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65        DbParamete
c6c0: 72 20 46 69 65 6c 64 33 20 3d 20 63 6d 64 2e 43  r Field3 = cmd.C
c6d0: 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29  reateParameter()
c6e0: 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61 72  ;..        DbPar
c6f0: 61 6d 65 74 65 72 20 46 69 65 6c 64 34 20 3d 20  ameter Field4 = 
c700: 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65  cmd.CreateParame
c710: 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ter();..        
c720: 44 62 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c  DbParameter Fiel
c730: 64 35 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50  d5 = cmd.CreateP
c740: 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20  arameter();.... 
c750: 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e 50 61         Field1.Pa
c760: 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40  rameterName = "@
c770: 70 31 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  p1";..        Fi
c780: 65 6c 64 32 2e 50 61 72 61 6d 65 74 65 72 4e 61  eld2.ParameterNa
c790: 6d 65 20 3d 20 22 40 70 32 22 3b 0d 0a 20 20 20  me = "@p2";..   
c7a0: 20 20 20 20 20 46 69 65 6c 64 33 2e 50 61 72 61       Field3.Para
c7b0: 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 33  meterName = "@p3
c7c0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c  ";..        Fiel
c7d0: 64 34 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65  d4.ParameterName
c7e0: 20 3d 20 22 40 70 34 22 3b 0d 0a 20 20 20 20 20   = "@p4";..     
c7f0: 20 20 20 46 69 65 6c 64 35 2e 50 61 72 61 6d 65     Field5.Parame
c800: 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 35 22 3b  terName = "@p5";
c810: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c  ....        Fiel
c820: 64 31 2e 44 62 54 79 70 65 20 3d 20 53 79 73 74  d1.DbType = Syst
c830: 65 6d 2e 44 61 74 61 2e 44 62 54 79 70 65 2e 49  em.Data.DbType.I
c840: 6e 74 33 32 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  nt32;....       
c850: 20 46 69 65 6c 64 31 2e 56 61 6c 75 65 20 3d 20   Field1.Value = 
c860: 32 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c  2;..        Fiel
c870: 64 32 2e 56 61 6c 75 65 20 3d 20 33 2e 31 34 31  d2.Value = 3.141
c880: 35 39 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65  59;..        Fie
c890: 6c 64 33 2e 56 61 6c 75 65 20 3d 20 22 46 69 65  ld3.Value = "Fie
c8a0: 6c 64 33 20 50 61 72 61 6d 22 3b 0d 0a 20 20 20  ld3 Param";..   
c8b0: 20 20 20 20 20 46 69 65 6c 64 34 2e 56 61 6c 75       Field4.Valu
c8c0: 65 20 3d 20 22 46 69 65 6c 64 34 20 50 61 72 22  e = "Field4 Par"
c8d0: 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64  ;..        Field
c8e0: 35 2e 56 61 6c 75 65 20 3d 20 44 61 74 65 54 69  5.Value = DateTi
c8f0: 6d 65 2e 4e 6f 77 3b 0d 0a 0d 0a 20 20 20 20 20  me.Now;....     
c900: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
c910: 73 2e 41 64 64 28 46 69 65 6c 64 31 29 3b 0d 0a  s.Add(Field1);..
c920: 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61          cmd.Para
c930: 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c 64  meters.Add(Field
c940: 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  2);..        cmd
c950: 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28  .Parameters.Add(
c960: 46 69 65 6c 64 33 29 3b 0d 0a 20 20 20 20 20 20  Field3);..      
c970: 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73    cmd.Parameters
c980: 2e 41 64 64 28 46 69 65 6c 64 34 29 3b 0d 0a 0d  .Add(Field4);...
c990: 0a 20 20 20 20 20 20 20 20 2f 2f 20 41 73 73 65  .        // Asse
c9a0: 72 74 69 6f 6e 20 68 65 72 65 2c 20 6e 6f 74 20  rtion here, not 
c9b0: 65 6e 6f 75 67 68 20 70 61 72 61 6d 65 74 65 72  enough parameter
c9c0: 73 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a  s..        try..
c9d0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
c9e0: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
c9f0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
ca00: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
ca10: 20 45 78 63 65 70 74 69 6f 6e 28 22 45 78 65 63   Exception("Exec
ca20: 75 74 65 64 20 77 69 74 68 20 61 20 6d 69 73 73  uted with a miss
ca30: 69 6e 67 20 70 61 72 61 6d 65 74 65 72 22 29 3b  ing parameter");
ca40: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
ca50: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
ca60: 70 74 69 6f 6e 29 20 2f 2f 20 45 78 70 65 63 74  ption) // Expect
ca70: 65 64 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ed..        {.. 
ca80: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ca90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
caa0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
cab0: 20 20 20 2f 2f 2f 20 43 61 6c 6c 20 50 72 65 70     /// Call Prep
cac0: 61 72 65 28 29 20 6f 6e 20 61 20 6d 75 6c 74 69  are() on a multi
cad0: 2d 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 6d 61  -statement comma
cae0: 6e 64 20 74 65 78 74 20 77 68 65 72 65 20 74 68  nd text where th
caf0: 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64  e second command
cb00: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
cb10: 65 78 69 73 74 65 6e 63 65 20 6f 66 20 74 68 65  existence of the
cb20: 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 2f 2f 2f   first...    ///
cb30: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
cb40: 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74   [Test]..    int
cb50: 65 72 6e 61 6c 20 76 6f 69 64 20 50 72 65 70 61  ernal void Prepa
cb60: 72 65 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  reTest()..    {.
cb70: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
cb80: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
cb90: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
cba0: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
cbb0: 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
cbc0: 2e 41 64 64 28 22 6e 6f 6e 65 78 69 73 74 65 6e  .Add("nonexisten
cbd0: 74 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  t");..        cm
cbe0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
cbf0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 6e 6f  "CREATE TABLE no
cc00: 6e 65 78 69 73 74 65 6e 74 28 69 64 20 69 6e 74  nexistent(id int
cc10: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 3b 53 45   primary key);SE
cc20: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 6e 6f 6e  LECT id FROM non
cc30: 65 78 69 73 74 65 6e 74 20 55 4e 49 4f 4e 20 53  existent UNION S
cc40: 45 4c 45 43 54 20 31 22 3b 0d 0a 20 20 20 20 20  ELECT 1";..     
cc50: 20 20 20 63 6d 64 2e 50 72 65 70 61 72 65 28 29     cmd.Prepare()
cc60: 3b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ;..        objec
cc70: 74 20 6f 62 20 3d 20 63 6d 64 2e 45 78 65 63 75  t ob = cmd.Execu
cc80: 74 65 53 63 61 6c 61 72 28 29 3b 0d 0a 0d 0a 20  teScalar();.... 
cc90: 20 20 20 20 20 20 20 69 66 20 28 6f 62 20 3d 3d         if (ob ==
cca0: 20 6e 75 6c 6c 20 7c 7c 20 6f 62 20 3d 3d 20 44   null || ob == D
ccb0: 42 4e 75 6c 6c 2e 56 61 6c 75 65 29 20 74 68 72  BNull.Value) thr
ccc0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
ccd0: 28 22 4d 75 6c 74 69 70 6c 65 20 73 74 61 74 65  ("Multiple state
cce0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 62 65  ments may not be
ccf0: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0d 0a 20   supported");.. 
cd00: 20 20 20 20 20 20 20 69 66 20 28 43 6f 6e 76 65         if (Conve
cd10: 72 74 2e 54 6f 49 6e 74 33 32 28 6f 62 29 20 21  rt.ToInt32(ob) !
cd20: 3d 20 31 29 20 74 68 72 6f 77 20 6e 65 77 20 45  = 1) throw new E
cd30: 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e  xception(String.
cd40: 46 6f 72 6d 61 74 28 22 45 78 70 65 63 74 65 64  Format("Expected
cd50: 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22 2c 20 31   {0} got {1}", 1
cd60: 2c 20 6f 62 29 29 3b 0d 0a 20 20 20 20 20 20 7d  , ob));..      }
cd70: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
cd80: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
cd90: 20 20 2f 2f 2f 20 43 68 65 63 6b 73 20 74 6f 20    /// Checks to 
cda0: 6d 61 6b 65 20 73 75 72 65 20 74 72 61 6e 73 61  make sure transa
cdb0: 63 74 69 6f 6e 73 20 61 72 65 20 72 6f 6c 6c 65  ctions are rolle
cdc0: 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 61 20  d back before a 
cdd0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 67 6f 65 73 20  connection goes 
cde0: 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20 70 6f  back onto the po
cdf0: 6f 6c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ol..    /// </su
ce00: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73  mmary>..    [Tes
ce10: 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
ce20: 20 76 6f 69 64 20 50 6f 6f 6c 69 6e 67 57 69 74   void PoolingWit
ce30: 68 53 74 65 61 6c 74 68 54 72 61 6e 73 61 63 74  hStealthTransact
ce40: 69 6f 6e 54 65 73 74 28 29 0d 0a 20 20 20 20 7b  ionTest()..    {
ce50: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76  ..      object v
ce60: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 69 66 20  alue;..      if 
ce70: 28 5f 63 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47  (_cnnstring.TryG
ce80: 65 74 56 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67  etValue("Pooling
ce90: 22 2c 20 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d  ", out value) ==
cea0: 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65   false) throw ne
ceb0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f  w Exception("Poo
cec0: 6c 69 6e 67 20 6e 6f 74 20 70 72 65 73 65 6e 74  ling not present
ced0: 20 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73   in connection s
cee0: 74 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20  tring");..      
cef0: 69 66 20 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20  if ((bool)value 
cf00: 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20  == false) throw 
cf10: 6e 65 77 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65  new Inconclusive
cf20: 45 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69  Exception("Pooli
cf30: 6e 67 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69  ng not enabled i
cf40: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
cf50: 20 73 74 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20   string");....  
cf60: 20 20 20 20 6d 61 79 64 72 6f 70 74 61 62 6c 65      maydroptable
cf70: 2e 41 64 64 28 22 50 6f 6f 6c 54 65 73 74 22 29  .Add("PoolTest")
cf80: 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 28  ;....      for (
cf90: 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31  int n = 0; n < 1
cfa0: 30 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20  00; n++)..      
cfb0: 7b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  {..        using
cfc0: 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e   (DbConnection n
cfd0: 65 77 63 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65  ewcnn = ((IClone
cfe0: 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65  able)_cnn).Clone
cff0: 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69  () as DbConnecti
d000: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  on)..        {..
d010: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 65            if (ne
d020: 77 63 6e 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f  wcnn.State != Co
d030: 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70  nnectionState.Op
d040: 65 6e 29 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28  en) newcnn.Open(
d050: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73  );..          us
d060: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
d070: 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e 43 72 65 61  md = newcnn.Crea
d080: 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
d090: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d0a0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
d0b0: 6e 64 54 65 78 74 20 3d 20 22 42 45 47 49 4e 20  ndText = "BEGIN 
d0c0: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 0d 0a 20  TRANSACTION";.. 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45             cmd.E
d0e0: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
d0f0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
d100: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
d110: 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   = "CREATE TABLE
d120: 20 50 6f 6f 6c 54 65 73 74 28 49 44 20 69 6e 74   PoolTest(ID int
d130: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 22 3b 0d   primary key)";.
d140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
d150: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
d160: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ();..          }
d170: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
d180: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
d190: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
d1a0: 0d 0a 20 20 20 20 2f 2f 2f 20 43 68 65 63 6b 73  ..    /// Checks
d1b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 72   to make sure tr
d1c0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 72  ansactions are r
d1d0: 6f 6c 6c 65 64 20 62 61 63 6b 20 62 65 66 6f 72  olled back befor
d1e0: 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 67  e a connection g
d1f0: 6f 65 73 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68  oes back onto th
d200: 65 20 70 6f 6f 6c 0d 0a 20 20 20 20 2f 2f 2f 20  e pool..    /// 
d210: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
d220: 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65  [Test]..    inte
d230: 72 6e 61 6c 20 76 6f 69 64 20 50 6f 6f 6c 69 6e  rnal void Poolin
d240: 67 57 69 74 68 54 72 61 6e 73 61 63 74 69 6f 6e  gWithTransaction
d250: 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  Test()..    {.. 
d260: 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
d270: 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 5f 63  e;..      if (_c
d280: 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47 65 74 56  nnstring.TryGetV
d290: 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67 22 2c 20  alue("Pooling", 
d2a0: 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d 20 66 61  out value) == fa
d2b0: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
d2c0: 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e  xception("Poolin
d2d0: 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  g not present in
d2e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
d2f0: 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  ng");..      if 
d300: 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20 3d 3d 20  ((bool)value == 
d310: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
d320: 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78 63   InconclusiveExc
d330: 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20  eption("Pooling 
d340: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69 6e 20 74  not enabled in t
d350: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
d360: 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  ring");....     
d370: 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64   maydroptable.Ad
d380: 64 28 22 50 6f 6f 6c 54 65 73 74 22 29 3b 0d 0a  d("PoolTest");..
d390: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e        for (int n
d3a0: 20 3d 20 30 3b 20 6e 20 3c 20 31 30 30 3b 20 6e   = 0; n < 100; n
d3b0: 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ++)..      {..  
d3c0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
d3d0: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63 6e 6e  onnection newcnn
d3e0: 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29   = ((ICloneable)
d3f0: 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61 73  _cnn).Clone() as
d400: 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29 0d 0a   DbConnection)..
d410: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d420: 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e       if (newcnn.
d430: 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74  State != Connect
d440: 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 6e  ionState.Open) n
d450: 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20  ewcnn.Open();.. 
d460: 20 20 20 20 20 20 20 20 20 44 62 54 72 61 6e 73           DbTrans
d470: 61 63 74 69 6f 6e 20 74 72 61 6e 73 20 3d 20 6e  action trans = n
d480: 65 77 63 6e 6e 2e 42 65 67 69 6e 54 72 61 6e 73  ewcnn.BeginTrans
d490: 61 63 74 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 20  action();..     
d4a0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
d4b0: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65 77 63  mmand cmd = newc
d4c0: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
d4d0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ())..          {
d4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
d4f0: 64 2e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  d.Transaction = 
d500: 74 72 61 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20  trans;..        
d510: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
d520: 65 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41  ext = "CREATE TA
d530: 42 4c 45 20 50 6f 6f 6c 54 65 73 74 28 49 44 20  BLE PoolTest(ID 
d540: 69 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79 29  int primary key)
d550: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
d560: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
d570: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
d580: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d590: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
d5a0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
d5b0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 68 65  ry>..    /// Che
d5c0: 63 6b 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cks to make sure
d5d0: 20 77 65 20 63 61 6e 20 6f 70 65 6e 20 44 42 20   we can open DB 
d5e0: 72 65 61 64 20 6f 6e 6c 79 2e 0d 0a 20 20 20 20  read only...    
d5f0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
d600: 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20      [Test]..    
d610: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 52 65  internal void Re
d620: 61 64 4f 6e 6c 79 54 65 73 74 28 29 0d 0a 20 20  adOnlyTest()..  
d630: 20 20 7b 0d 0a 20 20 20 20 20 20 73 74 72 69 6e    {..      strin
d640: 67 20 52 4f 5f 63 6f 6e 6e 65 63 74 69 6f 6e 53  g RO_connectionS
d650: 74 72 69 6e 67 20 3d 20 5f 63 6e 6e 73 74 72 69  tring = _cnnstri
d660: 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72  ng.ConnectionStr
d670: 69 6e 67 3b 0d 0a 20 20 20 20 20 20 6f 62 6a 65  ing;..      obje
d680: 63 74 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  ct value;..     
d690: 20 69 66 20 28 5f 63 6e 6e 73 74 72 69 6e 67 2e   if (_cnnstring.
d6a0: 54 72 79 47 65 74 56 61 6c 75 65 28 22 52 65 61  TryGetValue("Rea
d6b0: 64 20 4f 6e 6c 79 22 2c 20 6f 75 74 20 76 61 6c  d Only", out val
d6c0: 75 65 29 20 3d 3d 20 66 61 6c 73 65 29 0d 0a 20  ue) == false).. 
d6d0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
d6e0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
d6f0: 69 6f 6e 28 22 52 65 61 64 20 4f 6e 6c 79 20 6e  ion("Read Only n
d700: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
d710: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
d720: 67 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  g");..      }.. 
d730: 20 20 20 20 20 69 66 20 28 28 62 6f 6f 6c 29 76       if ((bool)v
d740: 61 6c 75 65 20 3d 3d 20 66 61 6c 73 65 29 0d 0a  alue == false)..
d750: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
d760: 20 2f 2f 20 22 52 65 61 64 20 4f 6e 6c 79 22 20   // "Read Only" 
d770: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 63  not present in c
d780: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
d790: 20 2d 20 61 64 64 20 69 74 0d 0a 20 20 20 20 20   - add it..     
d7a0: 20 20 20 52 4f 5f 63 6f 6e 6e 65 63 74 69 6f 6e     RO_connection
d7b0: 53 74 72 69 6e 67 20 2b 3d 20 22 3b 52 65 61 64  String += ";Read
d7c0: 20 4f 6e 6c 79 3d 74 72 75 65 22 3b 0d 0a 20 20   Only=true";..  
d7d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6d      }....      m
d7e0: 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64 64 28  aydroptable.Add(
d7f0: 22 52 65 61 64 4f 6e 6c 79 54 65 73 74 22 29 3b  "ReadOnlyTest");
d800: 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  ....      using 
d810: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65  (DbConnection ne
d820: 77 63 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61  wcnn = ((IClonea
d830: 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28  ble)_cnn).Clone(
d840: 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f  ) as DbConnectio
d850: 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  n)..      {..   
d860: 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e       if (newcnn.
d870: 53 74 61 74 65 20 3d 3d 20 43 6f 6e 6e 65 63 74  State == Connect
d880: 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 0d  ionState.Open) .
d890: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
d8a0: 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e 43 6c 6f        newcnn.Clo
d8b0: 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  se();..        }
d8c0: 0d 0a 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e  ..        newcnn
d8d0: 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e  .ConnectionStrin
d8e0: 67 20 3d 20 52 4f 5f 63 6f 6e 6e 65 63 74 69 6f  g = RO_connectio
d8f0: 6e 53 74 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20  nString;..      
d900: 20 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b    newcnn.Open();
d910: 0d 0a 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e  ..        newcnn
d920: 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20  .Dispose();..   
d930: 20 20 20 7d 20 0d 0a 20 20 20 20 7d 0d 0a 0d 0a     } ..    }....
d940: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
d950: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 68 65 63 6b  >..    /// Check
d960: 73 20 74 6f 20 65 78 74 65 6e 64 65 64 20 65 72  s to extended er
d970: 72 6f 72 20 63 6f 64 65 20 72 65 73 75 6c 74 20  ror code result 
d980: 73 75 70 70 6f 72 74 2e 0d 0a 20 20 20 20 2f 2f  support...    //
d990: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
d9a0: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
d9b0: 74 65 72 6e 61 6c 20 76 6f 69 64 20 45 78 74 65  ternal void Exte
d9c0: 6e 64 65 64 52 65 73 75 6c 74 43 6f 64 65 73 54  ndedResultCodesT
d9d0: 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
d9e0: 20 20 20 20 69 66 20 28 5f 66 61 63 74 2e 47 65      if (_fact.Ge
d9f0: 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64  tType().Name.Ind
da00: 65 78 4f 66 28 22 53 51 4c 69 74 65 22 2c 20 53  exOf("SQLite", S
da10: 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e  tringComparison.
da20: 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73  OrdinalIgnoreCas
da30: 65 29 20 3e 20 2d 31 29 0d 0a 20 20 20 20 20 20  e) > -1)..      
da40: 7b 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  {..        SQLit
da50: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 20  eConnection cnn 
da60: 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e  = new SQLiteConn
da70: 65 63 74 69 6f 6e 28 5f 63 6e 6e 73 74 72 69 6e  ection(_cnnstrin
da80: 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  g.ConnectionStri
da90: 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ng);....        
daa0: 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  cnn.Open();.... 
dab0: 20 20 20 20 20 20 20 2f 2f 20 54 75 72 6e 20 6f         // Turn o
dac0: 6e 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  n extended resul
dad0: 74 20 63 6f 64 65 73 0d 0a 20 20 20 20 20 20 20  t codes..       
dae0: 20 63 6e 6e 2e 53 65 74 45 78 74 65 6e 64 65 64   cnn.SetExtended
daf0: 52 65 73 75 6c 74 43 6f 64 65 73 28 74 72 75 65  ResultCodes(true
db00: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e  );....        in
db10: 74 20 72 63 20 3d 20 63 6e 6e 2e 52 65 73 75 6c  t rc = cnn.Resul
db20: 74 43 6f 64 65 28 29 3b 0d 0a 20 20 20 20 20 20  tCode();..      
db30: 20 20 69 6e 74 20 78 72 63 20 3d 20 63 6e 6e 2e    int xrc = cnn.
db40: 45 78 74 65 6e 64 65 64 52 65 73 75 6c 74 43 6f  ExtendedResultCo
db50: 64 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  de();....       
db60: 20 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20   cnn.Close();.. 
db70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
db80: 0a 20 20 20 20 2f 2f 4c 6f 67 67 69 6e 67 20 45  .    //Logging E
db90: 76 65 6e 74 48 61 6e 64 6c 65 72 0d 0a 20 20 20  ventHandler..   
dba0: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 4f 6e 4c   public void OnL
dbb0: 6f 67 45 76 65 6e 74 28 6f 62 6a 65 63 74 20 73  ogEvent(object s
dbc0: 65 6e 64 65 72 2c 20 4c 6f 67 45 76 65 6e 74 41  ender, LogEventA
dbd0: 72 67 73 20 6c 6f 67 45 76 65 6e 74 29 0d 0a 20  rgs logEvent).. 
dbe0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e     {..        in
dbf0: 74 20 65 72 72 5f 63 6f 64 65 20 3d 20 6c 6f 67  t err_code = log
dc00: 45 76 65 6e 74 2e 45 72 72 6f 72 43 6f 64 65 3b  Event.ErrorCode;
dc10: 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ..        string
dc20: 20 65 72 72 5f 6d 73 67 20 3d 20 6c 6f 67 45 76   err_msg = logEv
dc30: 65 6e 74 2e 4d 65 73 73 61 67 65 3b 0d 0a 20 20  ent.Message;..  
dc40: 20 20 20 20 20 20 6c 6f 67 65 76 65 6e 74 73 2b        logevents+
dc50: 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  +;..    }....   
dc60: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
dc70: 20 20 20 20 2f 2f 2f 20 54 65 73 74 73 20 53 51      /// Tests SQ
dc80: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 20  LITE_CONFIG_LOG 
dc90: 73 75 70 70 6f 72 74 2e 0d 0a 20 20 20 20 2f 2f  support...    //
dca0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
dcb0: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
dcc0: 74 65 72 6e 61 6c 20 76 6f 69 64 20 53 65 74 4c  ternal void SetL
dcd0: 6f 67 43 61 6c 6c 62 61 63 6b 54 65 73 74 28 29  ogCallbackTest()
dce0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
dcf0: 20 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79   if (_fact.GetTy
dd00: 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f  pe().Name.IndexO
dd10: 66 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69  f("SQLite", Stri
dd20: 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64  ngComparison.Ord
dd30: 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20  inalIgnoreCase) 
dd40: 3e 20 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 7b  > -1)..        {
dd50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ..            SQ
dd60: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  LiteConnection c
dd70: 6e 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43  nn = new SQLiteC
dd80: 6f 6e 6e 65 63 74 69 6f 6e 28 5f 63 6e 6e 73 74  onnection(_cnnst
dd90: 72 69 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53  ring.ConnectionS
dda0: 74 72 69 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20  tring);....     
ddb0: 20 20 20 20 20 20 20 2f 2f 20 63 72 65 61 74 65         // create
ddc0: 20 61 6e 64 20 61 64 64 20 61 20 6c 6f 67 20 65   and add a log e
ddd0: 76 65 6e 74 20 68 61 6e 64 6c 65 72 0d 0a 20 20  vent handler..  
dde0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
ddf0: 4c 6f 67 45 76 65 6e 74 48 61 6e 64 6c 65 72 20  LogEventHandler 
de00: 6c 6f 67 48 61 6e 64 6c 65 72 20 3d 20 6e 65 77  logHandler = new
de10: 20 53 51 4c 69 74 65 4c 6f 67 45 76 65 6e 74 48   SQLiteLogEventH
de20: 61 6e 64 6c 65 72 28 4f 6e 4c 6f 67 45 76 65 6e  andler(OnLogEven
de30: 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
de40: 20 53 51 4c 69 74 65 46 61 63 74 6f 72 79 20 73   SQLiteFactory s
de50: 71 6c 69 74 65 5f 66 61 63 74 20 3d 20 28 53 51  qlite_fact = (SQ
de60: 4c 69 74 65 46 61 63 74 6f 72 79 29 5f 66 61 63  LiteFactory)_fac
de70: 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  t;....          
de80: 20 20 73 71 6c 69 74 65 5f 66 61 63 74 2e 4c 6f    sqlite_fact.Lo
de90: 67 20 2b 3d 20 6c 6f 67 48 61 6e 64 6c 65 72 3b  g += logHandler;
dea0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
deb0: 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20  cnn.Open();.... 
dec0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 65 76             logev
ded0: 65 6e 74 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20  ents = 0;....   
dee0: 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 4c 6f 67           cnn.Log
def0: 4d 65 73 73 61 67 65 28 31 2c 20 22 74 65 73 74  Message(1, "test
df00: 20 6c 6f 67 20 65 76 65 6e 74 22 29 3b 0d 0a 0d   log event");...
df10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
df20: 28 6c 6f 67 65 76 65 6e 74 73 20 21 3d 20 31 29  (logevents != 1)
df30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df40: 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65    throw new Exce
df50: 70 74 69 6f 6e 28 22 4c 6f 67 20 65 76 65 6e 74  ption("Log event
df60: 20 63 6f 75 6e 74 20 69 6e 63 6f 72 72 65 63 74   count incorrect
df70: 2e 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .");....        
df80: 20 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b      cnn.Close();
df90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
dfa0: 2f 2f 20 72 65 6d 6f 76 65 20 74 68 65 20 6c 6f  // remove the lo
dfb0: 67 20 68 61 6e 64 6c 65 72 20 62 65 66 6f 72 65  g handler before
dfc0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
dfd0: 69 73 20 63 6c 6f 73 65 64 2e 0d 0a 20 20 20 20  is closed...    
dfe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 66          sqlite_f
dff0: 61 63 74 2e 4c 6f 67 20 2d 3d 20 6c 6f 67 48 61  act.Log -= logHa
e000: 6e 64 6c 65 72 3b 0d 0a 0d 0a 20 20 20 20 20 20  ndler;....      
e010: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
e020: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
e030: 0a 20 20 20 20 2f 2f 2f 20 4f 70 65 6e 20 61 20  .    /// Open a 
e040: 72 65 61 64 65 72 20 61 6e 64 20 74 68 65 6e 20  reader and then 
e050: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
e060: 20 74 6f 20 74 65 73 74 20 74 68 65 20 77 72 69   to test the wri
e070: 74 65 72 27 73 20 63 6f 6d 6d 61 6e 64 20 74 69  ter's command ti
e080: 6d 65 6f 75 74 20 70 72 6f 70 65 72 74 79 0d 0a  meout property..
e090: 20 20 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20 64      /// SQLite d
e0a0: 6f 65 73 6e 27 74 20 61 6c 6c 6f 77 20 61 20 77  oesn't allow a w
e0b0: 72 69 74 65 20 77 68 65 6e 20 61 20 72 65 61 64  rite when a read
e0c0: 65 72 20 69 73 20 61 63 74 69 76 65 2e 0d 0a 20  er is active... 
e0d0: 20 20 20 2f 2f 2f 20 2a 2a 2a 20 4e 4f 54 45 20     /// *** NOTE 
e0e0: 41 53 20 4f 46 20 33 2e 33 2e 38 20 74 68 69 73  AS OF 3.3.8 this
e0f0: 20 74 65 73 74 20 6e 6f 20 6c 6f 6e 67 65 72 20   test no longer 
e100: 62 6c 6f 63 6b 73 20 62 65 63 61 75 73 65 20 53  blocks because S
e110: 51 4c 69 74 65 20 6e 6f 77 20 61 6c 6c 6f 77 73  QLite now allows
e120: 20 79 6f 75 20 74 6f 20 75 70 64 61 74 65 20 74   you to update t
e130: 61 62 6c 65 28 73 29 0d 0a 20 20 20 20 2f 2f 2f  able(s)..    ///
e140: 20 77 68 69 6c 65 20 61 20 72 65 61 64 65 72 20   while a reader 
e150: 69 73 20 61 63 74 69 76 65 20 6f 6e 20 74 68 65  is active on the
e160: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
e170: 2e 20 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  .  Therefore the
e180: 20 74 69 6d 65 6f 75 74 20 74 65 73 74 20 69 73   timeout test is
e190: 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 2f 2f   invalid..    //
e1a0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
e1b0: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
e1c0: 54 69 6d 65 6f 75 74 54 65 73 74 28 29 0d 0a 20  TimeoutTest().. 
e1d0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63     {..      Chec
e1e0: 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 0d 0a 20 20  kSQLite();....  
e1f0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
e200: 6d 61 6e 64 20 63 6d 64 52 65 61 64 20 3d 20 5f  mand cmdRead = _
e210: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
e220: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
e230: 20 20 20 20 20 20 20 63 6d 64 52 65 61 64 2e 43         cmdRead.C
e240: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
e250: 4c 45 43 54 20 49 44 20 46 52 4f 4d 20 54 65 73  LECT ID FROM Tes
e260: 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20 20 20  tCase";..       
e270: 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65   using (DbDataRe
e280: 61 64 65 72 20 72 64 20 3d 20 63 6d 64 52 65 61  ader rd = cmdRea
e290: 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
e2a0: 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ))..        {.. 
e2b0: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
e2c0: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 77 72 69  DbCommand cmdwri
e2d0: 74 65 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  te = _cnn.Create
e2e0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
e2f0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
e300: 20 20 20 20 20 63 6d 64 77 72 69 74 65 2e 43 6f       cmdwrite.Co
e310: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 55 50 44  mmandText = "UPD
e320: 41 54 45 20 5b 4b 65 79 49 6e 66 6f 54 65 73 74  ATE [KeyInfoTest
e330: 5d 20 53 45 54 20 5b 49 44 5d 20 3d 20 5b 49 44  ] SET [ID] = [ID
e340: 5d 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]";..           
e350: 20 63 6d 64 77 72 69 74 65 2e 43 6f 6d 6d 61 6e   cmdwrite.Comman
e360: 64 54 69 6d 65 6f 75 74 20 3d 20 35 3b 0d 0a 0d  dTimeout = 5;...
e370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
e380: 20 64 77 74 69 63 6b 20 3d 20 45 6e 76 69 72 6f   dwtick = Enviro
e390: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
e3a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
e3b0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  y..            {
e3c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e3d0: 63 6d 64 77 72 69 74 65 2e 45 78 65 63 75 74 65  cmdwrite.Execute
e3e0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
e3f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e400: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
e410: 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20  xception)..     
e420: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
e430: 20 20 20 20 20 20 20 20 64 77 74 69 63 6b 20 3d          dwtick =
e440: 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69   (Environment.Ti
e450: 63 6b 43 6f 75 6e 74 20 2d 20 64 77 74 69 63 6b  ckCount - dwtick
e460: 29 20 2f 20 31 30 30 30 3b 0d 0a 20 20 20 20 20  ) / 1000;..     
e470: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 77 74           if (dwt
e480: 69 63 6b 20 3c 20 35 20 7c 7c 20 64 77 74 69 63  ick < 5 || dwtic
e490: 6b 20 3e 20 36 29 0d 0a 20 20 20 20 20 20 20 20  k > 6)..        
e4a0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
e4b0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 54 69 6d  w Exception("Tim
e4c0: 65 6f 75 74 20 64 69 64 6e 27 74 20 77 61 69 74  eout didn't wait
e4d0: 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 21 22 29 3b   long enough!");
e4e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e4f0: 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20    return;..     
e500: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e510: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
e520: 45 78 63 65 70 74 69 6f 6e 28 22 4f 70 65 72 61  Exception("Opera
e530: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65  tion should have
e540: 20 66 61 69 6c 65 64 20 62 75 74 20 63 6f 6d 70   failed but comp
e550: 6c 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  leted successful
e560: 6c 79 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ly");..         
e570: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
e580: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
e590: 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65  .    [Test(Seque
e5a0: 6e 63 65 20 3d 20 34 31 29 5d 0d 0a 20 20 20 20  nce = 41)]..    
e5b0: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 54 72  internal void Tr
e5c0: 61 6e 73 61 63 74 69 6f 6e 53 63 6f 70 65 54 65  ansactionScopeTe
e5d0: 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  st()..    {..   
e5e0: 20 20 20 75 73 69 6e 67 20 28 54 72 61 6e 73 61     using (Transa
e5f0: 63 74 69 6f 6e 53 63 6f 70 65 20 73 63 6f 70 65  ctionScope scope
e600: 20 3d 20 6e 65 77 20 54 72 61 6e 73 61 63 74 69   = new Transacti
e610: 6f 6e 53 63 6f 70 65 28 29 29 0d 0a 20 20 20 20  onScope())..    
e620: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 73 69    {..        usi
e630: 6e 67 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  ng (DbConnection
e640: 20 63 6e 6e 32 20 3d 20 28 28 49 43 6c 6f 6e 65   cnn2 = ((IClone
e650: 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65  able)_cnn).Clone
e660: 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69  () as DbConnecti
e670: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  on)..        {..
e680: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6e            if (cn
e690: 6e 32 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e  n2.State != Conn
e6a0: 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e  ectionState.Open
e6b0: 29 20 63 6e 6e 32 2e 4f 70 65 6e 28 29 3b 0d 0a  ) cnn2.Open();..
e6c0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
e6d0: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
e6e0: 20 63 6e 6e 32 2e 43 72 65 61 74 65 43 6f 6d 6d   cnn2.CreateComm
e6f0: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20  and())..        
e700: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
e710: 20 2f 2f 20 43 72 65 61 74 65 64 20 61 20 74 61   // Created a ta
e720: 62 6c 65 20 69 6e 73 69 64 65 20 74 68 65 20 74  ble inside the t
e730: 72 61 6e 73 61 63 74 69 6f 6e 20 73 63 6f 70 65  ransaction scope
e740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
e750: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
e760: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 56 6f  "CREATE TABLE Vo
e770: 6c 61 74 69 6c 65 54 61 62 6c 65 20 28 49 44 20  latileTable (ID 
e780: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
e790: 4b 45 59 2c 20 4d 79 56 61 6c 75 65 20 56 41 52  KEY, MyValue VAR
e7a0: 43 48 41 52 28 35 30 29 29 22 3b 0d 0a 20 20 20  CHAR(50))";..   
e7b0: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
e7c0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
e7d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ...            m
e7e0: 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64 64 28  aydroptable.Add(
e7f0: 22 56 6f 6c 61 74 69 6c 65 54 61 62 6c 65 22 29  "VolatileTable")
e800: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
e810: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
e820: 64 20 63 6d 64 32 20 3d 20 63 6e 6e 32 2e 43 72  d cmd2 = cnn2.Cr
e830: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
e840: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
e860: 6e 67 20 28 63 6d 64 32 2e 54 72 61 6e 73 61 63  ng (cmd2.Transac
e870: 74 69 6f 6e 20 3d 20 63 6e 6e 32 2e 42 65 67 69  tion = cnn2.Begi
e880: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 0d  nTransaction()).
e890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
e8a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e8b0: 20 20 2f 2f 20 49 6e 73 65 72 74 69 6e 67 20 61    // Inserting a
e8c0: 20 76 61 6c 75 65 20 69 6e 73 69 64 65 20 74 68   value inside th
e8d0: 65 20 74 61 62 6c 65 2c 20 69 6e 73 69 64 65 20  e table, inside 
e8e0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68  a transaction wh
e8f0: 69 63 68 20 69 73 20 69 6e 73 69 64 65 20 74 68  ich is inside th
e900: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 63  e transaction sc
e910: 6f 70 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ope..           
e920: 20 20 20 20 20 63 6d 64 32 2e 43 6f 6d 6d 61 6e       cmd2.Comman
e930: 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20  dText = "INSERT 
e940: 49 4e 54 4f 20 56 6f 6c 61 74 69 6c 65 54 61 62  INTO VolatileTab
e950: 6c 65 20 28 49 44 2c 20 4d 79 56 61 6c 75 65 29  le (ID, MyValue)
e960: 20 56 41 4c 55 45 53 28 31 2c 20 27 48 65 6c 6c   VALUES(1, 'Hell
e970: 6f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  o')";..         
e980: 20 20 20 20 20 20 20 63 6d 64 32 2e 45 78 65 63         cmd2.Exec
e990: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 63 6d 64 32 2e 54 72 61 6e 73 61 63 74 69 6f 6e  cmd2.Transaction
e9c0: 2e 43 6f 6d 6d 69 74 28 29 3b 0d 0a 20 20 20 20  .Commit();..    
e9d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
e9e0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e9f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
ea00: 20 20 20 2f 2f 20 43 6f 6e 6e 65 63 74 69 6f 6e     // Connection
ea10: 20 69 73 20 64 69 73 70 6f 73 65 64 20 62 65 66   is disposed bef
ea20: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
ea30: 69 6f 6e 73 63 6f 70 65 20 6c 65 61 76 65 73 2c  ionscope leaves,
ea40: 20 74 68 65 72 65 62 79 20 66 6f 72 63 69 6e 67   thereby forcing
ea50: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
ea60: 74 6f 20 73 74 61 79 20 6f 70 65 6e 0d 0a 20 20  to stay open..  
ea70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
ea80: 20 2f 2f 20 45 78 69 74 20 74 68 65 20 74 72 61   // Exit the tra
ea90: 6e 73 61 63 74 69 6f 6e 73 63 6f 70 65 20 77 69  nsactionscope wi
eaa0: 74 68 6f 75 74 20 63 6f 6d 6d 69 74 74 69 6e 67  thout committing
eab0: 20 69 74 2c 20 63 61 75 73 69 6e 67 20 61 20 72   it, causing a r
eac0: 6f 6c 6c 62 61 63 6b 20 6f 66 20 62 6f 74 68 20  ollback of both 
ead0: 74 68 65 20 63 72 65 61 74 65 20 74 61 62 6c 65  the create table
eae0: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 0d   and the insert.
eaf0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
eb00: 20 20 2f 2f 20 56 65 72 69 66 79 20 74 68 61 74    // Verify that
eb10: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
eb20: 6e 6f 74 20 65 78 69 73 74 0d 0a 20 20 20 20 20  not exist..     
eb30: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
eb40: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
eb50: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
eb60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
eb70: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
eb80: 3d 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28  = "SELECT COUNT(
eb90: 2a 29 20 46 52 4f 4d 20 56 6f 6c 61 74 69 6c 65  *) FROM Volatile
eba0: 54 61 62 6c 65 22 3b 0d 0a 20 20 20 20 20 20 20  Table";..       
ebb0: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d   try..        {.
ebc0: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
ebd0: 74 20 6f 20 3d 20 63 6d 64 2e 45 78 65 63 75 74  t o = cmd.Execut
ebe0: 65 53 63 61 6c 61 72 28 29 3b 0d 0a 20 20 20 20  eScalar();..    
ebf0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
ec00: 64 54 65 78 74 20 3d 20 22 44 52 4f 50 20 54 41  dText = "DROP TA
ec10: 42 4c 45 20 56 6f 6c 61 74 69 6c 65 54 61 62 6c  BLE VolatileTabl
ec20: 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  e";..          c
ec30: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
ec40: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
ec50: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
ec60: 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  idOperationExcep
ec70: 74 69 6f 6e 28 22 54 72 61 6e 73 61 63 74 69 6f  tion("Transactio
ec80: 6e 20 66 61 69 6c 65 64 21 20 54 68 65 20 74 61  n failed! The ta
ec90: 62 6c 65 20 65 78 69 73 74 73 21 22 29 3b 0d 0a  ble exists!");..
eca0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
ecb0: 20 20 20 63 61 74 63 68 28 45 78 63 65 70 74 69     catch(Excepti
ecc0: 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 7b  on e)..        {
ecd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
ece0: 65 20 69 73 20 49 6e 76 61 6c 69 64 4f 70 65 72  e is InvalidOper
ecf0: 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 29 20  ationException) 
ed00: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
ed10: 69 6f 6e 28 65 2e 4d 65 73 73 61 67 65 29 3b 0d  ion(e.Message);.
ed20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ed30: 6e 3b 20 2f 2f 20 53 75 63 63 65 65 64 65 64 2c  n; // Succeeded,
ed40: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
ed50: 64 20 6e 6f 74 20 68 61 76 65 20 65 78 69 73 74  d not have exist
ed60: 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ed..        }.. 
ed70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
ed80: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
ed90: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 61 75 73  y>..    /// Caus
eda0: 65 73 20 74 68 65 20 75 73 65 72 2d 64 65 66 69  es the user-defi
edb0: 6e 65 64 20 61 67 67 72 65 67 61 74 65 20 74 6f  ned aggregate to
edc0: 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68 72   be iterated thr
edd0: 6f 75 67 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ough..    /// </
ede0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
edf0: 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74  / <returns></ret
ee00: 75 72 6e 73 3e 0d 0a 20 20 20 20 5b 54 65 73 74  urns>..    [Test
ee10: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
ee20: 73 74 72 69 6e 67 20 55 73 65 72 41 67 67 72 65  string UserAggre
ee30: 67 61 74 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  gate()..    {.. 
ee40: 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65       CheckSQLite
ee50: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 53 74 72  ();....      Str
ee60: 69 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c 64  ingBuilder build
ee70: 65 72 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42  er = new StringB
ee80: 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20  uilder();..     
ee90: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
eea0: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
eeb0: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
eec0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
eed0: 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 20 20  int dtStart;..  
eee0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
eef0: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ..        int nC
ef00: 6f 75 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ount;....       
ef10: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
ef20: 20 3d 20 22 53 45 4c 45 43 54 20 4d 79 43 6f 75   = "SELECT MyCou
ef30: 6e 74 28 2a 29 20 46 52 4f 4d 20 54 65 73 74 43  nt(*) FROM TestC
ef40: 61 73 65 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ase";....       
ef50: 20 6e 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20   nCount = 0;..  
ef60: 20 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20        dtStart = 
ef70: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
ef80: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
ef90: 77 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65  while (Environme
efa0: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64  nt.TickCount - d
efb0: 74 53 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a  tStart < 1000)..
efc0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
efd0: 20 20 20 20 20 6e 20 3d 20 43 6f 6e 76 65 72 74       n = Convert
efe0: 2e 54 6f 49 6e 74 33 32 28 63 6d 64 2e 45 78 65  .ToInt32(cmd.Exe
eff0: 63 75 74 65 53 63 61 6c 61 72 28 29 29 3b 0d 0a  cuteScalar());..
f000: 20 20 20 20 20 20 20 20 20 20 6e 43 6f 75 6e 74            nCount
f010: 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ++;..        }..
f020: 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 21 3d          if (n !=
f030: 20 31 32 30 30 30 33 29 20 74 68 72 6f 77 20 6e   120003) throw n
f040: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 55 6e  ew Exception("Un
f050: 65 78 70 65 63 74 65 64 20 63 6f 75 6e 74 22 29  expected count")
f060: 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64  ;..        build
f070: 65 72 2e 41 70 70 65 6e 64 28 53 74 72 69 6e 67  er.Append(String
f080: 2e 46 6f 72 6d 61 74 28 22 55 73 65 72 41 67 67  .Format("UserAgg
f090: 72 65 67 61 74 65 20 65 78 65 63 75 74 65 64 20  regate executed 
f0a0: 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73  {0} times in 1 s
f0b0: 65 63 6f 6e 64 2e 22 2c 20 6e 43 6f 75 6e 74 29  econd.", nCount)
f0c0: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
f0d0: 20 20 20 72 65 74 75 72 6e 20 62 75 69 6c 64 65     return builde
f0e0: 72 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 20  r.ToString();.. 
f0f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
f100: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
f110: 2f 2f 20 43 61 75 73 65 73 20 74 68 65 20 75 73  // Causes the us
f120: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  er-defined colla
f130: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 6f  tion sequence to
f140: 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68 72   be iterated thr
f150: 6f 75 67 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ough..    /// </
f160: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54  summary>..    [T
f170: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
f180: 61 6c 20 76 6f 69 64 20 55 73 65 72 43 6f 6c 6c  al void UserColl
f190: 61 74 69 6f 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a  ation()..    {..
f1a0: 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74        CheckSQLit
f1b0: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73  e();....      us
f1c0: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
f1d0: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
f1e0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
f1f0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20    {..        // 
f200: 55 73 69 6e 67 20 61 20 64 65 66 61 75 6c 74 20  Using a default 
f210: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f220: 63 65 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  ce in descending
f230: 20 6f 72 64 65 72 2c 20 22 50 61 72 61 6d 20 46   order, "Param F
f240: 69 65 6c 64 33 22 20 77 69 6c 6c 20 61 70 70 65  ield3" will appe
f250: 61 72 20 61 74 20 74 68 65 20 74 6f 70 0d 0a 20  ar at the top.. 
f260: 20 20 20 20 20 20 20 2f 2f 20 61 6e 64 20 22 46         // and "F
f270: 69 65 6c 64 33 22 20 77 69 6c 6c 20 62 65 20 6e  ield3" will be n
f280: 65 78 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  ext, followed by
f290: 20 61 20 4e 55 4c 4c 2e 20 20 4f 75 72 20 75 73   a NULL.  Our us
f2a0: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  er-defined colla
f2b0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69  ting sequence wi
f2c0: 6c 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  ll ..        // 
f2d0: 64 65 6c 69 62 65 72 61 74 65 6c 79 20 70 6c 61  deliberately pla
f2e0: 63 65 20 74 68 65 6d 20 6f 75 74 20 6f 66 20 6f  ce them out of o
f2f0: 72 64 65 72 20 73 6f 20 46 69 65 6c 64 33 20 69  rder so Field3 i
f300: 73 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20  s first...      
f310: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
f320: 74 20 3d 20 22 53 45 4c 45 43 54 20 5b 46 69 c3  t = "SELECT [Fi.
f330: ab 6c 64 33 5d 20 46 52 4f 4d 20 54 65 73 74 43  .ld3] FROM TestC
f340: 61 73 65 20 4f 52 44 45 52 20 42 59 20 5b 46 69  ase ORDER BY [Fi
f350: c3 ab 6c 64 33 5d 20 43 4f 4c 4c 41 54 45 20 4d  ..ld3] COLLATE M
f360: 59 53 45 51 55 45 4e 43 45 20 44 45 53 43 22 3b  YSEQUENCE DESC";
f370: 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ..        string
f380: 20 73 20 3d 20 28 73 74 72 69 6e 67 29 63 6d 64   s = (string)cmd
f390: 2e 45 78 65 63 75 74 65 53 63 61 6c 61 72 28 29  .ExecuteScalar()
f3a0: 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  ;..        if (s
f3b0: 20 21 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20 74   != "Fi..ld3") t
f3c0: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
f3d0: 6f 6e 28 22 4d 79 53 65 71 75 65 6e 63 65 20 64  on("MySequence d
f3e0: 69 64 6e 27 74 20 73 6f 72 74 20 70 72 6f 70 65  idn't sort prope
f3f0: 72 6c 79 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  rly");..      }.
f400: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
f410: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
f420: 20 2f 2f 2f 20 43 61 75 73 65 73 20 74 68 65 20   /// Causes the 
f430: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
f440: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 6c 6c  ction to be call
f450: 65 64 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ed..    /// </su
f460: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
f470: 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72  <returns></retur
f480: 6e 73 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  ns>..    [Test].
f490: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
f4a0: 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f  ring UserFunctio
f4b0: 6e 31 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n1()..    {..   
f4c0: 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29     CheckSQLite()
f4d0: 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  ;..      using (
f4e0: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
f4f0: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
f500: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
f510: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d          int nTim
f520: 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  es;..        int
f530: 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20   dtStart;....   
f540: 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b       nTimes = 0;
f550: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
f560: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
f570: 45 43 54 20 46 6f 6f 28 27 65 65 27 2c 27 66 6f  ECT Foo('ee','fo
f580: 6f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 64  o')";..        d
f590: 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e  tStart = Environ
f5a0: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d  ment.TickCount;.
f5b0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28  .        while (
f5c0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
f5d0: 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74 20  Count - dtStart 
f5e0: 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20 20 20  < 1000)..       
f5f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d   {..          cm
f600: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
f610: 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  y();..          
f620: 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20 20  nTimes++;..     
f630: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
f640: 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d  turn String.Form
f650: 61 74 28 22 55 73 65 72 20 28 74 65 78 74 29 20  at("User (text) 
f660: 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64  command executed
f670: 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
f680: 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73  second.", nTimes
f690: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
f6a0: 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d   }....    [Test]
f6b0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
f6c0: 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69  tring UserFuncti
f6d0: 6f 6e 32 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on2()..    {..  
f6e0: 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28      CheckSQLite(
f6f0: 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  );..      using 
f700: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
f710: 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d   _cnn.CreateComm
f720: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d  and())..      {.
f730: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69  .        int nTi
f740: 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e  mes;..        in
f750: 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20  t dtStart;....  
f760: 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30        nTimes = 0
f770: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
f780: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
f790: 4c 45 43 54 20 46 6f 6f 28 31 30 2c 31 31 29 22  LECT Foo(10,11)"
f7a0: 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53 74 61  ;..        dtSta
f7b0: 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  rt = Environment
f7c0: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
f7d0: 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e 76 69       while (Envi
f7e0: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
f7f0: 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20 31 30  t - dtStart < 10
f800: 30 30 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  00)..        {..
f810: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
f820: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
f830: 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69 6d  ..          nTim
f840: 65 73 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d  es++;..        }
f850: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f860: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
f870: 55 73 65 72 46 75 6e 63 74 69 6f 6e 20 63 6f 6d  UserFunction com
f880: 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20 7b 30  mand executed {0
f890: 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73 65 63  } times in 1 sec
f8a0: 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29 3b 0d  ond.", nTimes);.
f8b0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
f8c0: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20  ...    [Test].. 
f8d0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69     internal stri
f8e0: 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f 6e 33  ng UserFunction3
f8f0: 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
f900: 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d   CheckSQLite();.
f910: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
f920: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
f930: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
f940: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
f950: 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 73        int nTimes
f960: 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  ;..        int d
f970: 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20 20 20  tStart;....     
f980: 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b 0d 0a     nTimes = 0;..
f990: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
f9a0: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
f9b0: 54 20 41 42 53 28 31 29 22 3b 0d 0a 20 20 20 20  T ABS(1)";..    
f9c0: 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e      dtStart = En
f9d0: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
f9e0: 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77 68  unt;..        wh
f9f0: 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74  ile (Environment
fa00: 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53  .TickCount - dtS
fa10: 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20 20  tart < 1000)..  
fa20: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
fa30: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
fa40: 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
fa50: 20 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a       nTimes++;..
fa60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
fa70: 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
fa80: 2e 46 6f 72 6d 61 74 28 22 49 6e 74 72 69 6e 73  .Format("Intrins
fa90: 69 63 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  ic command execu
faa0: 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e  ted {0} times in
fab0: 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69   1 second.", nTi
fac0: 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mes);..      }..
fad0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
fae0: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
faf0: 6c 20 73 74 72 69 6e 67 20 55 73 65 72 46 75 6e  l string UserFun
fb00: 63 74 69 6f 6e 34 28 29 0d 0a 20 20 20 20 7b 0d  ction4()..    {.
fb10: 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69  .      CheckSQLi
fb20: 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69  te();..      usi
fb30: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
fb40: 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
fb50: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
fb60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20   {..        int 
fb70: 6e 54 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20  nTimes;..       
fb80: 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d   int dtStart;...
fb90: 0a 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 20  .        nTimes 
fba0: 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  = 0;..        cm
fbb0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
fbc0: 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 27 46  "SELECT lower('F
fbd0: 4f 4f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20  OO')";..        
fbe0: 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f  dtStart = Enviro
fbf0: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
fc00: 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ..        while 
fc10: 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63  (Environment.Tic
fc20: 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74  kCount - dtStart
fc30: 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20 20   < 1000)..      
fc40: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63    {..          c
fc50: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
fc60: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
fc70: 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20   nTimes++;..    
fc80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
fc90: 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72  eturn String.For
fca0: 6d 61 74 28 22 49 6e 74 72 69 6e 20 28 74 78 74  mat("Intrin (txt
fcb0: 29 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74  ) command execut
fcc0: 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20  ed {0} times in 
fcd0: 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d  1 second.", nTim
fce0: 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  es);..      }.. 
fcf0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
fd00: 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
fd10: 20 73 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63   string UserFunc
fd20: 74 69 6f 6e 35 28 29 0d 0a 20 20 20 20 7b 0d 0a  tion5()..    {..
fd30: 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74        CheckSQLit
fd40: 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e  e();..      usin
fd50: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
fd60: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
fd70: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
fd80: 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  {..        int n
fd90: 54 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20  Times;..        
fda0: 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a  int dtStart;....
fdb0: 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d          nTimes =
fdc0: 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64   0;..        cmd
fdd0: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
fde0: 53 45 4c 45 43 54 20 31 22 3b 0d 0a 20 20 20 20  SELECT 1";..    
fdf0: 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e      dtStart = En
fe00: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
fe10: 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77 68  unt;..        wh
fe20: 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74  ile (Environment
fe30: 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53  .TickCount - dtS
fe40: 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20 20  tart < 1000)..  
fe50: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
fe60: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
fe70: 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
fe80: 20 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a       nTimes++;..
fe90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
fea0: 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
feb0: 2e 46 6f 72 6d 61 74 28 22 52 61 77 20 56 61 6c  .Format("Raw Val
fec0: 75 65 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  ue command execu
fed0: 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e  ted {0} times in
fee0: 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69   1 second.", nTi
fef0: 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mes);..      }..
ff00: 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 20 20 20      }..    ..   
ff10: 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20   [Test(Sequence 
ff20: 3d 20 34 32 29 5d 0d 0a 20 20 20 20 69 6e 74 65  = 42)]..    inte
ff30: 72 6e 61 6c 20 76 6f 69 64 20 56 65 72 69 66 79  rnal void Verify
ff40: 42 69 6e 61 72 79 44 61 74 61 28 29 0d 0a 20 20  BinaryData()..  
ff50: 20 20 7b 0d 0a 20 20 20 20 20 20 42 69 6e 61 72    {..      Binar
ff60: 79 49 6e 73 65 72 74 28 29 3b 0d 0a 20 20 20 20  yInsert();..    
ff70: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
ff80: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
ff90: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
ffa0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
ffb0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
ffc0: 20 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c 64   = "SELECT Field
ffd0: 36 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65 20  6 FROM TestCase 
ffe0: 57 48 45 52 45 20 46 69 65 6c 64 36 20 49 53 20  WHERE Field6 IS 
fff0: 4e 4f 54 20 4e 55 4c 4c 22 3b 0d 0a 20 20 20 20  NOT NULL";..    
10000 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e      byte[] b = n
10010 65 77 20 62 79 74 65 5b 34 30 30 30 5d 3b 0d 0a  ew byte[4000];..
10020 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ..        using 
10030 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64  (DbDataReader rd
10040 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
10050 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
10060 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
10070 20 28 72 64 2e 52 65 61 64 28 29 20 3d 3d 20 66   (rd.Read() == f
10080 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20  alse) throw new 
10090 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61  Exception("No da
100a0 74 61 20 74 6f 20 72 65 61 64 21 22 29 3b 0d 0a  ta to read!");..
100b0 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67  ..          long
100c0 20 6e 20 3d 20 72 64 2e 47 65 74 42 79 74 65 73   n = rd.GetBytes
100d0 28 30 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c 20  (0, 0, null, 0, 
100e0 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  0);..          i
100f0 66 20 28 6e 20 21 3d 20 34 30 30 30 29 20 74 68  f (n != 4000) th
10100 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
10110 6e 28 22 49 6e 76 61 6c 69 64 20 62 79 74 65 20  n("Invalid byte 
10120 6c 65 6e 67 74 68 21 22 29 3b 0d 0a 0d 0a 20 20  length!");....  
10130 20 20 20 20 20 20 20 20 72 64 2e 47 65 74 42 79          rd.GetBy
10140 74 65 73 28 30 2c 20 30 2c 20 62 2c 20 30 2c 20  tes(0, 0, b, 0, 
10150 34 30 30 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  4000);....      
10160 20 20 20 20 69 66 20 28 62 5b 30 5d 20 21 3d 20      if (b[0] != 
10170 31 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  1) throw new Exc
10180 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76  eption("Binary v
10190 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62  alue non-match b
101a0 79 74 65 20 30 22 29 3b 0d 0a 20 20 20 20 20 20  yte 0");..      
101b0 20 20 20 20 69 66 20 28 62 5b 31 30 30 5d 20 21      if (b[100] !
101c0 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77 20 45  = 2) throw new E
101d0 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79  xception("Binary
101e0 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68   value non-match
101f0 20 62 79 74 65 20 31 30 30 22 29 3b 0d 0a 20 20   byte 100");..  
10200 20 20 20 20 20 20 20 20 69 66 20 28 62 5b 31 30          if (b[10
10210 30 30 5d 20 21 3d 20 33 29 20 74 68 72 6f 77 20  00] != 3) throw 
10220 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 42  new Exception("B
10230 69 6e 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d  inary value non-
10240 6d 61 74 63 68 20 62 79 74 65 20 31 30 30 30 22  match byte 1000"
10250 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
10260 20 28 62 5b 32 30 30 30 5d 20 21 3d 20 34 29 20   (b[2000] != 4) 
10270 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
10280 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61 6c 75  ion("Binary valu
10290 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65  e non-match byte
102a0 20 32 30 30 30 22 29 3b 0d 0a 20 20 20 20 20 20   2000");..      
102b0 20 20 20 20 69 66 20 28 62 5b 33 30 30 30 5d 20      if (b[3000] 
102c0 21 3d 20 35 29 20 74 68 72 6f 77 20 6e 65 77 20  != 5) throw new 
102d0 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72  Exception("Binar
102e0 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  y value non-matc
102f0 68 20 62 79 74 65 20 33 30 30 30 22 29 3b 0d 0a  h byte 3000");..
10300 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10310 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
10320 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74   [Test]..    int
10330 65 72 6e 61 6c 20 76 6f 69 64 20 44 65 63 69 6d  ernal void Decim
10340 61 6c 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  alTest()..    {.
10350 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
10360 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
10370 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
10380 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
10390 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
103a0 2e 41 64 64 28 22 44 45 43 54 45 53 54 22 29 3b  .Add("DECTEST");
103b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
103c0 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43  CommandText = "C
103d0 52 45 41 54 45 20 54 41 42 4c 45 20 44 45 43 54  REATE TABLE DECT
103e0 45 53 54 28 78 20 44 45 43 49 4d 41 4c 28 33 38  EST(x DECIMAL(38
103f0 2c 31 38 29 29 22 3b 0d 0a 20 20 20 20 20 20 20  ,18))";..       
10400 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51   cmd.ExecuteNonQ
10410 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  uery();....     
10420 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
10430 78 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54  xt = "INSERT INT
10440 4f 20 44 45 43 54 45 53 54 28 78 29 20 56 41 4c  O DECTEST(x) VAL
10450 55 45 53 28 30 2e 30 30 30 30 31 29 22 3b 0d 0a  UES(0.00001)";..
10460 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
10470 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
10480 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20          ..      
10490 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
104a0 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20 46 52  t = "SELECT * FR
104b0 4f 4d 20 44 45 43 54 45 53 54 22 3b 0d 0a 20 20  OM DECTEST";..  
104c0 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44        using (DbD
104d0 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72  ataReader reader
104e0 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
104f0 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
10500 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
10510 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20  ader.Read();..  
10520 20 20 20 20 20 20 20 20 64 65 63 69 6d 61 6c 20          decimal 
10530 64 20 3d 20 28 64 65 63 69 6d 61 6c 29 72 65 61  d = (decimal)rea
10540 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30 29 3b  der.GetValue(0);
10550 0d 0a 20 20 20 20 20 20 20 20 20 20 64 20 3d 20  ..          d = 
10560 72 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61  reader.GetDecima
10570 6c 28 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  l(0);..        }
10580 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
10590 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65  ....    [Test(Se
105a0 71 75 65 6e 63 65 20 3d 20 33 30 29 5d 0d 0a 20  quence = 30)].. 
105b0 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
105c0 20 56 65 72 69 66 79 49 6e 73 65 72 74 28 29 0d   VerifyInsert().
105d0 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73  .    {..      us
105e0 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
105f0 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
10600 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
10610 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64    {..        cmd
10620 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
10630 53 45 4c 45 43 54 20 46 69 65 6c 64 31 2c 20 46  SELECT Field1, F
10640 69 65 6c 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d  ield2, [Fi..ld3]
10650 2c 20 5b 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65  , [Fi..ld4], Fie
10660 6c 64 35 20 46 52 4f 4d 20 54 65 73 74 43 61 73  ld5 FROM TestCas
10670 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  e";..        cmd
10680 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a 20 20 20  .Prepare();..   
10690 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
106a0 74 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d  taReader rd = cm
106b0 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
106c0 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ))..        {.. 
106d0 20 20 20 20 20 20 20 20 20 69 66 20 28 72 64 2e           if (rd.
106e0 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20 20 20  Read())..       
106f0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
10700 20 20 69 6e 74 20 46 69 65 6c 64 31 20 3d 20 72    int Field1 = r
10710 64 2e 47 65 74 49 6e 74 33 32 28 30 29 3b 0d 0a  d.GetInt32(0);..
10720 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 75 62              doub
10730 6c 65 20 46 69 65 6c 64 32 20 3d 20 72 64 2e 47  le Field2 = rd.G
10740 65 74 44 6f 75 62 6c 65 28 31 29 3b 0d 0a 20 20  etDouble(1);..  
10750 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
10760 20 46 69 65 6c 64 33 20 3d 20 72 64 2e 47 65 74   Field3 = rd.Get
10770 53 74 72 69 6e 67 28 32 29 3b 0d 0a 20 20 20 20  String(2);..    
10780 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 46          string F
10790 69 65 6c 64 34 20 3d 20 72 64 2e 47 65 74 53 74  ield4 = rd.GetSt
107a0 72 69 6e 67 28 33 29 2e 54 72 69 6d 45 6e 64 28  ring(3).TrimEnd(
107b0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
107c0 44 61 74 65 54 69 6d 65 20 46 69 65 6c 64 35 20  DateTime Field5 
107d0 3d 20 72 64 2e 47 65 74 44 61 74 65 54 69 6d 65  = rd.GetDateTime
107e0 28 34 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  (4);....        
107f0 20 20 20 20 69 66 20 28 46 69 65 6c 64 31 20 21      if (Field1 !
10800 3d 20 31 29 20 74 68 72 6f 77 20 6e 65 77 20 45  = 1) throw new E
10810 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e  xception(String.
10820 46 6f 72 6d 61 74 28 22 46 69 65 6c 64 31 20 7b  Format("Field1 {
10830 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68  0} did not match
10840 20 7b 31 7d 22 2c 20 46 69 65 6c 64 31 2c 20 31   {1}", Field1, 1
10850 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ));..           
10860 20 69 66 20 28 46 69 65 6c 64 32 20 21 3d 20 33   if (Field2 != 3
10870 2e 31 34 31 35 39 29 20 74 68 72 6f 77 20 6e 65  .14159) throw ne
10880 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69  w Exception(Stri
10890 6e 67 2e 46 6f 72 6d 61 74 28 22 46 69 65 6c 64  ng.Format("Field
108a0 32 20 7b 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61  2 {0} did not ma
108b0 74 63 68 20 7b 31 7d 22 2c 20 46 69 65 6c 64 32  tch {1}", Field2
108c0 2c 20 33 2e 31 34 31 35 39 29 29 3b 0d 0a 20 20  , 3.14159));..  
108d0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 46 69            if (Fi
108e0 65 6c 64 33 20 21 3d 20 22 46 69 c3 ab 6c 64 33  eld3 != "Fi..ld3
108f0 22 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  ") throw new Exc
10900 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f  eption(String.Fo
10910 72 6d 61 74 28 22 46 69 65 6c 64 33 20 7b 30 7d  rmat("Field3 {0}
10920 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 7b   did not match {
10930 31 7d 22 2c 20 46 69 65 6c 64 33 2c 20 22 46 69  1}", Field3, "Fi
10940 c3 ab 6c 64 33 22 29 29 3b 0d 0a 20 20 20 20 20  ..ld3"));..     
10950 20 20 20 20 20 20 20 69 66 20 28 46 69 65 6c 64         if (Field
10960 34 20 21 3d 20 22 46 69 c3 a6 6c 64 34 22 29 20  4 != "Fi..ld4") 
10970 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
10980 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ion(String.Forma
10990 74 28 22 46 69 65 6c 64 34 20 7b 30 7d 20 64 69  t("Field4 {0} di
109a0 64 20 6e 6f 74 20 6d 61 74 63 68 20 7b 31 7d 22  d not match {1}"
109b0 2c 20 46 69 65 6c 64 34 2c 20 22 46 69 c3 a6 6c  , Field4, "Fi..l
109c0 64 34 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  d4"));..        
109d0 20 20 20 20 69 66 20 28 46 69 65 6c 64 35 2e 43      if (Field5.C
109e0 6f 6d 70 61 72 65 54 6f 28 44 61 74 65 54 69 6d  ompareTo(DateTim
109f0 65 2e 50 61 72 73 65 28 22 32 30 30 35 2d 30 31  e.Parse("2005-01
10a00 2d 30 31 20 31 33 3a 34 39 3a 30 30 22 29 29 20  -01 13:49:00")) 
10a10 21 3d 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20  != 0) throw new 
10a20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
10a30 2e 46 6f 72 6d 61 74 28 22 46 69 65 6c 64 35 20  .Format("Field5 
10a40 7b 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61 74 63  {0} did not matc
10a50 68 20 7b 31 7d 22 2c 20 46 69 65 6c 64 34 2c 20  h {1}", Field4, 
10a60 44 61 74 65 54 69 6d 65 2e 50 61 72 73 65 28 22  DateTime.Parse("
10a70 32 30 30 35 2d 30 31 2d 30 31 20 31 33 3a 34 39  2005-01-01 13:49
10a80 3a 30 30 22 29 29 29 3b 0d 0a 0d 0a 20 20 20 20  :00")));....    
10a90 20 20 20 20 20 20 20 20 69 66 20 28 72 64 2e 47          if (rd.G
10aa0 65 74 4e 61 6d 65 28 30 29 20 21 3d 20 22 46 69  etName(0) != "Fi
10ab0 65 6c 64 31 22 29 20 74 68 72 6f 77 20 6e 65 77  eld1") throw new
10ac0 20 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 6e 2d   Exception("Non-
10ad0 4d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d  Match column nam
10ae0 65 20 46 69 65 6c 64 31 22 29 3b 0d 0a 20 20 20  e Field1");..   
10af0 20 20 20 20 20 20 20 20 20 69 66 20 28 72 64 2e           if (rd.
10b00 47 65 74 4e 61 6d 65 28 31 29 20 21 3d 20 22 46  GetName(1) != "F
10b10 69 65 6c 64 32 22 29 20 74 68 72 6f 77 20 6e 65  ield2") throw ne
10b20 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 6e  w Exception("Non
10b30 2d 4d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  -Match column na
10b40 6d 65 20 46 69 65 6c 64 32 22 29 3b 0d 0a 20 20  me Field2");..  
10b50 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 64            if (rd
10b60 2e 47 65 74 4e 61 6d 65 28 32 29 20 21 3d 20 22  .GetName(2) != "
10b70 46 69 c3 ab 6c 64 33 22 29 20 74 68 72 6f 77 20  Fi..ld3") throw 
10b80 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4e  new Exception("N
10b90 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  on-Match column 
10ba0 6e 61 6d 65 20 46 69 65 6c 64 33 22 29 3b 0d 0a  name Field3");..
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
10bc0 72 64 2e 47 65 74 4e 61 6d 65 28 33 29 20 21 3d  rd.GetName(3) !=
10bd0 20 22 46 69 c3 a6 6c 64 34 22 29 20 74 68 72 6f   "Fi..ld4") thro
10be0 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
10bf0 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d  "Non-Match colum
10c00 6e 20 6e 61 6d 65 20 46 69 65 6c 64 34 22 29 3b  n name Field4");
10c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
10c20 20 28 72 64 2e 47 65 74 4e 61 6d 65 28 34 29 20   (rd.GetName(4) 
10c30 21 3d 20 22 46 69 65 6c 64 35 22 29 20 74 68 72  != "Field5") thr
10c40 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
10c50 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75  ("Non-Match colu
10c60 6d 6e 20 6e 61 6d 65 20 46 69 65 6c 64 35 22 29  mn name Field5")
10c70 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
10c80 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 74            else t
10c90 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
10ca0 6f 6e 28 22 4e 6f 20 64 61 74 61 20 69 6e 20 74  on("No data in t
10cb0 61 62 6c 65 22 29 3b 0d 0a 20 20 20 20 20 20 20  able");..       
10cc0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
10cd0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f   }..  }....  ///
10ce0 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f   <summary>..  //
10cf0 2f 20 53 63 61 6c 61 72 20 75 73 65 72 2d 64 65  / Scalar user-de
10d00 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e 20  fined function. 
10d10 20 49 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65   In this example
10d20 2c 20 74 68 65 20 73 61 6d 65 20 63 6c 61 73 73  , the same class
10d30 20 69 73 20 64 65 63 6c 61 72 65 64 20 74 77 69   is declared twi
10d40 63 65 20 77 69 74 68 20 0d 0a 20 20 2f 2f 2f 20  ce with ..  /// 
10d50 64 69 66 66 65 72 65 6e 74 20 66 75 6e 63 74 69  different functi
10d60 6f 6e 20 6e 61 6d 65 73 20 74 6f 20 64 65 6d 6f  on names to demo
10d70 6e 73 74 72 61 74 65 20 68 6f 77 20 74 6f 20 75  nstrate how to u
10d80 73 65 20 61 6c 69 61 73 20 6e 61 6d 65 73 20 66  se alias names f
10d90 6f 72 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  or user-defined 
10da0 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20 20 2f 2f  functions...  //
10db0 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
10dc0 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28  [SQLiteFunction(
10dd0 4e 61 6d 65 20 3d 20 22 46 6f 6f 22 2c 20 41 72  Name = "Foo", Ar
10de0 67 75 6d 65 6e 74 73 20 3d 20 32 2c 20 46 75 6e  guments = 2, Fun
10df0 63 54 79 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e  cType = Function
10e00 54 79 70 65 2e 53 63 61 6c 61 72 29 5d 0d 0a 20  Type.Scalar)].. 
10e10 20 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e   [SQLiteFunction
10e20 28 4e 61 6d 65 20 3d 20 22 54 65 73 74 46 75 6e  (Name = "TestFun
10e30 63 22 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d 20  c", Arguments = 
10e40 32 2c 20 46 75 6e 63 54 79 70 65 20 3d 20 46 75  2, FuncType = Fu
10e50 6e 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61  nctionType.Scala
10e60 72 29 5d 0d 0a 20 20 63 6c 61 73 73 20 54 65 73  r)]..  class Tes
10e70 74 46 75 6e 63 20 3a 20 53 51 4c 69 74 65 46 75  tFunc : SQLiteFu
10e80 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20  nction..  {..   
10e90 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
10ea0 20 6f 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f   object Invoke(o
10eb0 62 6a 65 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20  bject[] args).. 
10ec0 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28     {..      if (
10ed0 61 72 67 73 5b 30 5d 2e 47 65 74 54 79 70 65 28  args[0].GetType(
10ee0 29 20 21 3d 20 74 79 70 65 6f 66 28 69 6e 74 29  ) != typeof(int)
10ef0 29 20 72 65 74 75 72 6e 20 61 72 67 73 5b 30 5d  ) return args[0]
10f00 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 6e 74 20 50  ;....      int P
10f10 61 72 61 6d 31 20 3d 20 43 6f 6e 76 65 72 74 2e  aram1 = Convert.
10f20 54 6f 49 6e 74 33 32 28 61 72 67 73 5b 30 5d 29  ToInt32(args[0])
10f30 3b 20 2f 2f 20 46 69 72 73 74 20 70 61 72 61 6d  ; // First param
10f40 65 74 65 72 0d 0a 20 20 20 20 20 20 69 6e 74 20  eter..      int 
10f50 50 61 72 61 6d 32 20 3d 20 43 6f 6e 76 65 72 74  Param2 = Convert
10f60 2e 54 6f 49 6e 74 33 32 28 61 72 67 73 5b 31 5d  .ToInt32(args[1]
10f70 29 3b 20 2f 2f 20 53 65 63 6f 6e 64 20 70 61 72  ); // Second par
10f80 61 6d 65 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  ameter....      
10f90 72 65 74 75 72 6e 20 50 61 72 61 6d 31 20 2b 20  return Param1 + 
10fa0 50 61 72 61 6d 32 3b 0d 0a 20 20 20 20 7d 0d 0a  Param2;..    }..
10fb0 20 20 7d 0d 0a 0d 0a 20 20 5b 53 51 4c 69 74 65    }....  [SQLite
10fc0 46 75 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20  Function(Name = 
10fd0 22 43 41 53 45 54 45 53 54 22 2c 20 41 72 67 75  "CASETEST", Argu
10fe0 6d 65 6e 74 73 20 3d 20 32 2c 20 46 75 6e 63 54  ments = 2, FuncT
10ff0 79 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79  ype = FunctionTy
11000 70 65 2e 53 63 61 6c 61 72 29 5d 0d 0a 20 20 63  pe.Scalar)]..  c
11010 6c 61 73 73 20 43 61 73 65 54 65 73 74 46 75 6e  lass CaseTestFun
11020 63 20 3a 20 53 51 4c 69 74 65 46 75 6e 63 74 69  c : SQLiteFuncti
11030 6f 6e 45 78 0d 0a 20 20 7b 0d 0a 20 20 20 20 70  onEx..  {..    p
11040 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f  ublic override o
11050 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a  bject Invoke(obj
11060 65 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20 20 20  ect[] args)..   
11070 20 7b 0d 0a 20 20 20 20 20 20 43 6f 6c 6c 61 74   {..      Collat
11080 69 6f 6e 53 65 71 75 65 6e 63 65 20 73 65 71 20  ionSequence seq 
11090 3d 20 47 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65  = GetCollationSe
110a0 71 75 65 6e 63 65 28 29 3b 0d 0a 20 20 20 20 20  quence();..     
110b0 20 72 65 74 75 72 6e 20 73 65 71 2e 43 6f 6d 70   return seq.Comp
110c0 61 72 65 28 61 72 67 73 5b 30 5d 2e 54 6f 53 74  are(args[0].ToSt
110d0 72 69 6e 67 28 29 2c 20 61 72 67 73 5b 31 5d 2e  ring(), args[1].
110e0 54 6f 53 74 72 69 6e 67 28 29 29 3b 0d 0a 20 20  ToString());..  
110f0 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f    }..  }....  //
11100 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f  / <summary>..  /
11110 2f 2f 20 41 67 67 72 65 67 61 74 65 20 75 73 65  // Aggregate use
11120 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
11130 6f 6e 2e 20 20 41 72 67 75 6d 65 6e 74 73 20 3d  on.  Arguments =
11140 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75   -1 means any nu
11150 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
11160 73 20 69 73 20 61 63 63 65 70 74 61 62 6c 65 0d  s is acceptable.
11170 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
11180 3e 0d 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e 63  >..  [SQLiteFunc
11190 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 4d 79 43  tion(Name = "MyC
111a0 6f 75 6e 74 22 2c 20 41 72 67 75 6d 65 6e 74 73  ount", Arguments
111b0 20 3d 20 2d 31 2c 20 46 75 6e 63 54 79 70 65 20   = -1, FuncType 
111c0 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 41  = FunctionType.A
111d0 67 67 72 65 67 61 74 65 29 5d 0d 0a 20 20 63 6c  ggregate)]..  cl
111e0 61 73 73 20 4d 79 43 6f 75 6e 74 20 3a 20 53 51  ass MyCount : SQ
111f0 4c 69 74 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20  LiteFunction..  
11200 7b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  {..    public ov
11210 65 72 72 69 64 65 20 76 6f 69 64 20 53 74 65 70  erride void Step
11220 28 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 2c 20  (object[] args, 
11230 69 6e 74 20 6e 53 74 65 70 2c 20 72 65 66 20 6f  int nStep, ref o
11240 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74  bject contextDat
11250 61 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  a)..    {..     
11260 20 69 66 20 28 63 6f 6e 74 65 78 74 44 61 74 61   if (contextData
11270 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
11280 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   {..        cont
11290 65 78 74 44 61 74 61 20 3d 20 31 3b 0d 0a 20 20  extData = 1;..  
112a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73      }..      els
112b0 65 0d 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  e..        conte
112c0 78 74 44 61 74 61 20 3d 20 28 69 6e 74 29 63 6f  xtData = (int)co
112d0 6e 74 65 78 74 44 61 74 61 20 2b 20 31 3b 0d 0a  ntextData + 1;..
112e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
112f0 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f 62 6a  lic override obj
11300 65 63 74 20 46 69 6e 61 6c 28 6f 62 6a 65 63 74  ect Final(object
11310 20 63 6f 6e 74 65 78 74 44 61 74 61 29 0d 0a 20   contextData).. 
11320 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75     {..      retu
11330 72 6e 20 63 6f 6e 74 65 78 74 44 61 74 61 3b 0d  rn contextData;.
11340 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20  .    }..  }.... 
11350 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
11360 20 20 2f 2f 2f 20 53 61 6d 70 6c 65 20 72 65 67    /// Sample reg
11370 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
11380 66 75 6e 63 74 69 6f 6e 2e 20 20 45 78 61 6d 70  function.  Examp
11390 6c 65 20 55 73 61 67 65 3a 0d 0a 20 20 2f 2f 2f  le Usage:..  ///
113a0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66   SELECT * FROM f
113b0 6f 6f 20 57 48 45 52 45 20 6e 61 6d 65 20 52 45  oo WHERE name RE
113c0 47 45 58 50 20 27 24 62 61 72 27 0d 0a 20 20 2f  GEXP '$bar'..  /
113d0 2f 2f 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  // SELECT * FROM
113e0 20 66 6f 6f 20 57 48 45 52 45 20 52 45 47 45 58   foo WHERE REGEX
113f0 50 28 27 24 62 61 72 27 2c 20 6e 61 6d 65 29 0d  P('$bar', name).
11400 0a 20 20 2f 2f 2f 20 0d 0a 20 20 2f 2f 2f 20 3c  .  /// ..  /// <
11410 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 5b 53 51  /summary>..  [SQ
11420 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 4e 61 6d  LiteFunction(Nam
11430 65 20 3d 20 22 52 45 47 45 58 50 22 2c 20 41 72  e = "REGEXP", Ar
11440 67 75 6d 65 6e 74 73 20 3d 20 32 2c 20 46 75 6e  guments = 2, Fun
11450 63 54 79 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e  cType = Function
11460 54 79 70 65 2e 53 63 61 6c 61 72 29 5d 0d 0a 20  Type.Scalar)].. 
11470 20 63 6c 61 73 73 20 4d 79 52 65 67 45 78 20 3a   class MyRegEx :
11480 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 0d   SQLiteFunction.
11490 0a 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c 69 63  .  {..    public
114a0 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63 74   override object
114b0 20 49 6e 76 6f 6b 65 28 6f 62 6a 65 63 74 5b 5d   Invoke(object[]
114c0 20 61 72 67 73 29 0d 0a 20 20 20 20 7b 0d 0a 20   args)..    {.. 
114d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 79 73 74       return Syst
114e0 65 6d 2e 54 65 78 74 2e 52 65 67 75 6c 61 72 45  em.Text.RegularE
114f0 78 70 72 65 73 73 69 6f 6e 73 2e 52 65 67 65 78  xpressions.Regex
11500 2e 49 73 4d 61 74 63 68 28 43 6f 6e 76 65 72 74  .IsMatch(Convert
11510 2e 54 6f 53 74 72 69 6e 67 28 61 72 67 73 5b 31  .ToString(args[1
11520 5d 29 2c 20 43 6f 6e 76 65 72 74 2e 54 6f 53 74  ]), Convert.ToSt
11530 72 69 6e 67 28 61 72 67 73 5b 30 5d 29 29 3b 0d  ring(args[0]));.
11540 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20  .    }..  }.... 
11550 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
11560 20 20 2f 2f 2f 20 55 73 65 72 2d 64 65 66 69 6e    /// User-defin
11570 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
11580 75 65 6e 63 65 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f  uence...  /// </
11590 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 5b 53 51 4c  summary>..  [SQL
115a0 69 74 65 46 75 6e 63 74 69 6f 6e 28 4e 61 6d 65  iteFunction(Name
115b0 20 3d 20 22 4d 59 53 45 51 55 45 4e 43 45 22 2c   = "MYSEQUENCE",
115c0 20 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e 63   FuncType = Func
115d0 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69  tionType.Collati
115e0 6f 6e 29 5d 0d 0a 20 20 63 6c 61 73 73 20 4d 79  on)]..  class My
115f0 53 65 71 75 65 6e 63 65 20 3a 20 53 51 4c 69 74  Sequence : SQLit
11600 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a  eFunction..  {..
11610 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
11620 69 64 65 20 69 6e 74 20 43 6f 6d 70 61 72 65 28  ide int Compare(
11630 73 74 72 69 6e 67 20 70 61 72 61 6d 31 2c 20 73  string param1, s
11640 74 72 69 6e 67 20 70 61 72 61 6d 32 29 0d 0a 20  tring param2).. 
11650 20 20 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 4d     {..      // M
11660 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 72  ake sure the str
11670 69 6e 67 20 22 46 69 c3 ab 6c 64 33 22 20 69 73  ing "Fi..ld3" is
11680 20 73 6f 72 74 65 64 20 6f 75 74 20 6f 66 20 6f   sorted out of o
11690 72 64 65 72 0d 0a 20 20 20 20 20 20 69 66 20 28  rder..      if (
116a0 70 61 72 61 6d 31 20 3d 3d 20 22 46 69 c3 ab 6c  param1 == "Fi..l
116b0 64 33 22 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a  d3") return 1;..
116c0 20 20 20 20 20 20 69 66 20 28 70 61 72 61 6d 32        if (param2
116d0 20 3d 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20 72   == "Fi..ld3") r
116e0 65 74 75 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 20  eturn -1;..     
116f0 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 43   return String.C
11700 6f 6d 70 61 72 65 28 70 61 72 61 6d 31 2c 20 70  ompare(param1, p
11710 61 72 61 6d 32 2c 20 74 72 75 65 29 3b 0d 0a 20  aram2, true);.. 
11720 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 5b     }..  }....  [
11730 41 74 74 72 69 62 75 74 65 55 73 61 67 65 28 41  AttributeUsage(A
11740 74 74 72 69 62 75 74 65 54 61 72 67 65 74 73 2e  ttributeTargets.
11750 4d 65 74 68 6f 64 2c 20 49 6e 68 65 72 69 74 65  Method, Inherite
11760 64 20 3d 20 66 61 6c 73 65 2c 20 41 6c 6c 6f 77  d = false, Allow
11770 4d 75 6c 74 69 70 6c 65 20 3d 20 66 61 6c 73 65  Multiple = false
11780 29 5d 0d 0a 20 20 70 75 62 6c 69 63 20 73 65 61  )]..  public sea
11790 6c 65 64 20 63 6c 61 73 73 20 54 65 73 74 41 74  led class TestAt
117a0 74 72 69 62 75 74 65 20 3a 20 41 74 74 72 69 62  tribute : Attrib
117b0 75 74 65 2c 20 49 43 6f 6d 70 61 72 61 62 6c 65  ute, IComparable
117c0 3c 54 65 73 74 41 74 74 72 69 62 75 74 65 3e 0d  <TestAttribute>.
117d0 0a 20 20 7b 0d 0a 20 20 20 20 70 72 69 76 61 74  .  {..    privat
117e0 65 20 73 74 61 74 69 63 20 69 6e 74 20 5f 73 74  e static int _st
117f0 61 72 74 20 3d 20 36 35 35 33 35 3b 0d 0a 20 20  art = 65535;..  
11800 20 20 70 72 69 76 61 74 65 20 69 6e 74 20 5f 73    private int _s
11810 65 71 75 65 6e 63 65 3b 0d 0a 0d 0a 20 20 20 20  equence;....    
11820 70 75 62 6c 69 63 20 54 65 73 74 41 74 74 72 69  public TestAttri
11830 62 75 74 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  bute()..    {.. 
11840 20 20 20 20 20 5f 73 65 71 75 65 6e 63 65 20 3d       _sequence =
11850 20 5f 73 74 61 72 74 3b 0d 0a 20 20 20 20 20 20   _start;..      
11860 5f 73 74 61 72 74 2b 2b 3b 0d 0a 20 20 20 20 7d  _start++;..    }
11870 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69  ....    public i
11880 6e 74 20 53 65 71 75 65 6e 63 65 0d 0a 20 20 20  nt Sequence..   
11890 20 7b 0d 0a 20 20 20 20 20 20 67 65 74 20 7b 20   {..      get { 
118a0 72 65 74 75 72 6e 20 5f 73 65 71 75 65 6e 63 65  return _sequence
118b0 3b 20 7d 0d 0a 20 20 20 20 20 20 73 65 74 20 7b  ; }..      set {
118c0 20 5f 73 65 71 75 65 6e 63 65 20 3d 20 76 61 6c   _sequence = val
118d0 75 65 3b 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ue; }..    }....
118e0 20 20 20 20 23 72 65 67 69 6f 6e 20 49 43 6f 6d      #region ICom
118f0 70 61 72 61 62 6c 65 3c 54 65 73 74 41 74 74 72  parable<TestAttr
11900 69 62 75 74 65 3e 20 4d 65 6d 62 65 72 73 0d 0a  ibute> Members..
11910 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74  ..    public int
11920 20 43 6f 6d 70 61 72 65 54 6f 28 54 65 73 74 41   CompareTo(TestA
11930 74 74 72 69 62 75 74 65 20 6f 74 68 65 72 29 0d  ttribute other).
11940 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
11950 74 75 72 6e 20 5f 73 65 71 75 65 6e 63 65 2e 43  turn _sequence.C
11960 6f 6d 70 61 72 65 54 6f 28 6f 74 68 65 72 2e 5f  ompareTo(other._
11970 73 65 71 75 65 6e 63 65 29 3b 0d 0a 20 20 20 20  sequence);..    
11980 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 67 69 6f  }..    #endregio
11990 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 6e 74 65  n..  }....  inte
119a0 72 6e 61 6c 20 65 6e 75 6d 20 54 65 73 74 52 65  rnal enum TestRe
119b0 73 75 6c 74 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20  sultEnum..  {.. 
119c0 20 20 20 53 75 63 63 65 65 64 65 64 20 3d 20 30     Succeeded = 0
119d0 2c 0d 0a 20 20 20 20 46 61 69 6c 65 64 20 3d 20  ,..    Failed = 
119e0 31 2c 0d 0a 20 20 20 20 49 6e 63 6f 6e 63 6c 75  1,..    Inconclu
119f0 73 69 76 65 20 3d 20 32 2c 0d 0a 20 20 7d 0d 0a  sive = 2,..  }..
11a00 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20 63 6c 61  ..  internal cla
11a10 73 73 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45  ss InconclusiveE
11a20 78 63 65 70 74 69 6f 6e 20 3a 20 45 78 63 65 70  xception : Excep
11a30 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20 20 69  tion..  {..    i
11a40 6e 74 65 72 6e 61 6c 20 49 6e 63 6f 6e 63 6c 75  nternal Inconclu
11a50 73 69 76 65 45 78 63 65 70 74 69 6f 6e 28 29 0d  siveException().
11a60 0a 20 20 20 20 20 20 3a 20 62 61 73 65 28 29 0d  .      : base().
11a70 0a 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 0d  .    {..    }...
11a80 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e  .    internal In
11a90 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74  conclusiveExcept
11aa0 69 6f 6e 28 73 74 72 69 6e 67 20 6d 65 73 73 61  ion(string messa
11ab0 67 65 29 0d 0a 20 20 20 20 20 20 3a 20 62 61 73  ge)..      : bas
11ac0 65 28 6d 65 73 73 61 67 65 29 0d 0a 20 20 20 20  e(message)..    
11ad0 7b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  {..    }..  }...
11ae0 0a 20 20 69 6e 74 65 72 6e 61 6c 20 63 6c 61 73  .  internal clas
11af0 73 20 54 65 73 74 45 76 65 6e 74 41 72 67 73 20  s TestEventArgs 
11b00 3a 20 45 76 65 6e 74 41 72 67 73 0d 0a 20 20 7b  : EventArgs..  {
11b10 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 72 65 61  ..    public rea
11b20 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 54 65 73  donly string Tes
11b30 74 4e 61 6d 65 3b 0d 0a 20 20 20 20 70 75 62 6c  tName;..    publ
11b40 69 63 20 72 65 61 64 6f 6e 6c 79 20 54 65 73 74  ic readonly Test
11b50 52 65 73 75 6c 74 45 6e 75 6d 20 52 65 73 75 6c  ResultEnum Resul
11b60 74 3b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 72  t;..    public r
11b70 65 61 64 6f 6e 6c 79 20 45 78 63 65 70 74 69 6f  eadonly Exceptio
11b80 6e 20 45 78 63 65 70 74 69 6f 6e 3b 0d 0a 20 20  n Exception;..  
11b90 20 20 70 75 62 6c 69 63 20 72 65 61 64 6f 6e 6c    public readonl
11ba0 79 20 73 74 72 69 6e 67 20 4d 65 73 73 61 67 65  y string Message
11bb0 3b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 72 65  ;..    public re
11bc0 61 64 6f 6e 6c 79 20 69 6e 74 20 44 75 72 61 74  adonly int Durat
11bd0 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 69 6e 74 65  ion;....    inte
11be0 72 6e 61 6c 20 54 65 73 74 45 76 65 6e 74 41 72  rnal TestEventAr
11bf0 67 73 28 73 74 72 69 6e 67 20 74 65 73 74 4e 61  gs(string testNa
11c00 6d 65 2c 20 54 65 73 74 52 65 73 75 6c 74 45 6e  me, TestResultEn
11c10 75 6d 20 73 75 63 63 65 73 73 2c 20 69 6e 74 20  um success, int 
11c20 64 75 72 61 74 69 6f 6e 2c 20 45 78 63 65 70 74  duration, Except
11c30 69 6f 6e 20 65 2c 20 73 74 72 69 6e 67 20 6d 65  ion e, string me
11c40 73 73 61 67 65 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssage)..    {.. 
11c50 20 20 20 20 20 54 65 73 74 4e 61 6d 65 20 3d 20       TestName = 
11c60 74 65 73 74 4e 61 6d 65 3b 0d 0a 20 20 20 20 20  testName;..     
11c70 20 52 65 73 75 6c 74 20 3d 20 73 75 63 63 65 73   Result = succes
11c80 73 3b 0d 0a 20 20 20 20 20 20 45 78 63 65 70 74  s;..      Except
11c90 69 6f 6e 20 3d 20 65 3b 0d 0a 20 20 20 20 20 20  ion = e;..      
11ca0 4d 65 73 73 61 67 65 20 3d 20 6d 65 73 73 61 67  Message = messag
11cb0 65 3b 0d 0a 20 20 20 20 20 20 44 75 72 61 74 69  e;..      Durati
11cc0 6f 6e 20 3d 20 64 75 72 61 74 69 6f 6e 3b 0d 0a  on = duration;..
11cd0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
11ce0 64 65 6c 65 67 61 74 65 20 76 6f 69 64 20 54 65  delegate void Te
11cf0 73 74 43 6f 6d 70 6c 65 74 65 64 45 76 65 6e 74  stCompletedEvent
11d00 28 6f 62 6a 65 63 74 20 73 65 6e 64 65 72 2c 20  (object sender, 
11d10 54 65 73 74 45 76 65 6e 74 41 72 67 73 20 61 72  TestEventArgs ar
11d20 67 73 29 3b 0d 0a 20 20 64 65 6c 65 67 61 74 65  gs);..  delegate
11d30 20 76 6f 69 64 20 54 65 73 74 53 74 61 72 74 69   void TestStarti
11d40 6e 67 45 76 65 6e 74 28 6f 62 6a 65 63 74 20 73  ngEvent(object s
11d50 65 6e 64 65 72 2c 20 54 65 73 74 45 76 65 6e 74  ender, TestEvent
11d60 41 72 67 73 20 61 72 67 73 29 3b 0d 0a 0d 0a 20  Args args);.... 
11d70 20 69 6e 74 65 72 6e 61 6c 20 61 62 73 74 72 61   internal abstra
11d80 63 74 20 63 6c 61 73 73 20 54 65 73 74 43 61 73  ct class TestCas
11d90 65 42 61 73 65 0d 0a 20 20 7b 0d 0a 20 20 20 20  eBase..  {..    
11da0 70 72 6f 74 65 63 74 65 64 20 44 62 50 72 6f 76  protected DbProv
11db0 69 64 65 72 46 61 63 74 6f 72 79 20 5f 66 61 63  iderFactory _fac
11dc0 74 3b 0d 0a 20 20 20 20 70 72 6f 74 65 63 74 65  t;..    protecte
11dd0 64 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 5f  d DbConnection _
11de0 63 6e 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20  cnn = null;..   
11df0 20 70 72 6f 74 65 63 74 65 64 20 44 62 43 6f 6e   protected DbCon
11e00 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 42 75 69  nectionStringBui
11e10 6c 64 65 72 20 5f 63 6e 6e 73 74 72 69 6e 67 3b  lder _cnnstring;
11e20 0d 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20  ..    protected 
11e30 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e  Dictionary<strin
11e40 67 2c 20 62 6f 6f 6c 3e 20 5f 74 65 73 74 73 20  g, bool> _tests 
11e50 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61 72 79  = new Dictionary
11e60 3c 73 74 72 69 6e 67 2c 62 6f 6f 6c 3e 28 29 3b  <string,bool>();
11e70 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 65  ....    public e
11e80 76 65 6e 74 20 54 65 73 74 43 6f 6d 70 6c 65 74  vent TestComplet
11e90 65 64 45 76 65 6e 74 20 4f 6e 54 65 73 74 46 69  edEvent OnTestFi
11ea0 6e 69 73 68 65 64 3b 0d 0a 20 20 20 20 70 75 62  nished;..    pub
11eb0 6c 69 63 20 65 76 65 6e 74 20 54 65 73 74 53 74  lic event TestSt
11ec0 61 72 74 69 6e 67 45 76 65 6e 74 20 4f 6e 54 65  artingEvent OnTe
11ed0 73 74 53 74 61 72 74 69 6e 67 3b 0d 0a 20 20 20  stStarting;..   
11ee0 20 70 75 62 6c 69 63 20 65 76 65 6e 74 20 45 76   public event Ev
11ef0 65 6e 74 48 61 6e 64 6c 65 72 20 4f 6e 41 6c 6c  entHandler OnAll
11f00 54 65 73 74 73 44 6f 6e 65 3b 0d 0a 0d 0a 20 20  TestsDone;....  
11f10 20 20 70 72 6f 74 65 63 74 65 64 20 54 65 73 74    protected Test
11f20 43 61 73 65 42 61 73 65 28 29 0d 0a 20 20 20 20  CaseBase()..    
11f30 7b 0d 0a 20 20 20 20 20 20 53 6f 72 74 65 64 4c  {..      SortedL
11f40 69 73 74 3c 54 65 73 74 41 74 74 72 69 62 75 74  ist<TestAttribut
11f50 65 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63  e, System.Reflec
11f60 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f 3e  tion.MethodInfo>
11f70 20 69 74 65 6d 73 20 3d 20 6e 65 77 20 53 6f 72   items = new Sor
11f80 74 65 64 4c 69 73 74 3c 54 65 73 74 41 74 74 72  tedList<TestAttr
11f90 69 62 75 74 65 2c 20 53 79 73 74 65 6d 2e 52 65  ibute, System.Re
11fa0 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49  flection.MethodI
11fb0 6e 66 6f 3e 28 29 3b 0d 0a 20 20 20 20 20 20 66  nfo>();..      f
11fc0 6f 72 65 61 63 68 20 28 53 79 73 74 65 6d 2e 52  oreach (System.R
11fd0 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64  eflection.Method
11fe0 49 6e 66 6f 20 6d 69 20 69 6e 20 47 65 74 54 79  Info mi in GetTy
11ff0 70 65 28 29 2e 47 65 74 4d 65 74 68 6f 64 73 28  pe().GetMethods(
12000 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
12010 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 49  n.BindingFlags.I
12020 6e 73 74 61 6e 63 65 20 7c 20 53 79 73 74 65 6d  nstance | System
12030 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64  .Reflection.Bind
12040 69 6e 67 46 6c 61 67 73 2e 4e 6f 6e 50 75 62 6c  ingFlags.NonPubl
12050 69 63 20 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c  ic | System.Refl
12060 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c  ection.BindingFl
12070 61 67 73 2e 49 6e 76 6f 6b 65 4d 65 74 68 6f 64  ags.InvokeMethod
12080 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
12090 20 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 61 74       object[] at
120a0 74 20 3d 20 6d 69 2e 47 65 74 43 75 73 74 6f 6d  t = mi.GetCustom
120b0 41 74 74 72 69 62 75 74 65 73 28 74 79 70 65 6f  Attributes(typeo
120c0 66 28 54 65 73 74 41 74 74 72 69 62 75 74 65 29  f(TestAttribute)
120d0 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20  , false);..     
120e0 20 20 20 69 66 20 28 61 74 74 2e 4c 65 6e 67 74     if (att.Lengt
120f0 68 20 3d 3d 20 31 29 0d 0a 20 20 20 20 20 20 20  h == 1)..       
12100 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 74   {..          it
12110 65 6d 73 2e 41 64 64 28 28 54 65 73 74 41 74 74  ems.Add((TestAtt
12120 72 69 62 75 74 65 29 61 74 74 5b 30 5d 2c 20 6d  ribute)att[0], m
12130 69 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  i);..        }..
12140 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12150 20 66 6f 72 65 61 63 68 20 28 4b 65 79 56 61 6c   foreach (KeyVal
12160 75 65 50 61 69 72 3c 54 65 73 74 41 74 74 72 69  uePair<TestAttri
12170 62 75 74 65 2c 20 53 79 73 74 65 6d 2e 52 65 66  bute, System.Ref
12180 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e  lection.MethodIn
12190 66 6f 3e 20 70 61 69 72 20 69 6e 20 69 74 65 6d  fo> pair in item
121a0 73 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  s)..      {..   
121b0 20 20 20 20 20 5f 74 65 73 74 73 2e 41 64 64 28       _tests.Add(
121c0 70 61 69 72 2e 56 61 6c 75 65 2e 4e 61 6d 65 2c  pair.Value.Name,
121d0 20 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 7d   true);..      }
121e0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
121f0 72 6f 74 65 63 74 65 64 20 54 65 73 74 43 61 73  rotected TestCas
12200 65 42 61 73 65 28 44 62 50 72 6f 76 69 64 65 72  eBase(DbProvider
12210 46 61 63 74 6f 72 79 20 66 61 63 74 6f 72 79 2c  Factory factory,
12220 20 73 74 72 69 6e 67 20 63 6f 6e 6e 65 63 74 69   string connecti
12230 6f 6e 53 74 72 69 6e 67 29 0d 0a 20 20 20 20 7b  onString)..    {
12240 0d 0a 20 20 20 20 20 20 5f 66 61 63 74 20 3d 20  ..      _fact = 
12250 66 61 63 74 6f 72 79 3b 0d 0a 20 20 20 20 20 20  factory;..      
12260 5f 63 6e 6e 20 3d 20 5f 66 61 63 74 2e 43 72 65  _cnn = _fact.Cre
12270 61 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 29 3b  ateConnection();
12280 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 2e 43 6f 6e  ..      _cnn.Con
12290 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 20 3d 20  nectionString = 
122a0 63 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67  connectionString
122b0 3b 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 73 74 72  ;..      _cnnstr
122c0 69 6e 67 20 3d 20 5f 66 61 63 74 2e 43 72 65 61  ing = _fact.Crea
122d0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  teConnectionStri
122e0 6e 67 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20  ngBuilder();..  
122f0 20 20 20 20 5f 63 6e 6e 73 74 72 69 6e 67 2e 43      _cnnstring.C
12300 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 20  onnectionString 
12310 3d 20 63 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  = connectionStri
12320 6e 67 3b 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 2e  ng;..      _cnn.
12330 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a  Open();..    }..
12340 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 44  ..    internal D
12350 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67  ictionary<string
12360 2c 20 62 6f 6f 6c 3e 20 54 65 73 74 73 0d 0a 20  , bool> Tests.. 
12370 20 20 20 7b 0d 0a 20 20 20 20 20 20 67 65 74 0d     {..      get.
12380 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
12390 20 20 72 65 74 75 72 6e 20 5f 74 65 73 74 73 3b    return _tests;
123a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
123b0 20 73 65 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20   set..      {.. 
123c0 20 20 20 20 20 20 20 5f 74 65 73 74 73 20 3d 20         _tests = 
123d0 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 7d 0d  value;..      }.
123e0 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
123f0 74 65 72 6e 61 6c 20 76 6f 69 64 20 52 75 6e 28  ternal void Run(
12400 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
12410 53 6f 72 74 65 64 4c 69 73 74 3c 54 65 73 74 41  SortedList<TestA
12420 74 74 72 69 62 75 74 65 2c 20 53 79 73 74 65 6d  ttribute, System
12430 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68  .Reflection.Meth
12440 6f 64 49 6e 66 6f 3e 20 69 74 65 6d 73 20 3d 20  odInfo> items = 
12450 6e 65 77 20 53 6f 72 74 65 64 4c 69 73 74 3c 54  new SortedList<T
12460 65 73 74 41 74 74 72 69 62 75 74 65 2c 20 53 79  estAttribute, Sy
12470 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e  stem.Reflection.
12480 4d 65 74 68 6f 64 49 6e 66 6f 3e 28 29 3b 0d 0a  MethodInfo>();..
12490 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 53        foreach (S
124a0 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
124b0 2e 4d 65 74 68 6f 64 49 6e 66 6f 20 6d 69 20 69  .MethodInfo mi i
124c0 6e 20 47 65 74 54 79 70 65 28 29 2e 47 65 74 4d  n GetType().GetM
124d0 65 74 68 6f 64 73 28 53 79 73 74 65 6d 2e 52 65  ethods(System.Re
124e0 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67  flection.Binding
124f0 46 6c 61 67 73 2e 49 6e 73 74 61 6e 63 65 20 7c  Flags.Instance |
12500 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
12510 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e  on.BindingFlags.
12520 4e 6f 6e 50 75 62 6c 69 63 20 7c 20 53 79 73 74  NonPublic | Syst
12530 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69  em.Reflection.Bi
12540 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b  ndingFlags.Invok
12550 65 4d 65 74 68 6f 64 29 29 0d 0a 20 20 20 20 20  eMethod))..     
12560 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
12570 63 74 5b 5d 20 61 74 74 20 3d 20 6d 69 2e 47 65  ct[] att = mi.Ge
12580 74 43 75 73 74 6f 6d 41 74 74 72 69 62 75 74 65  tCustomAttribute
12590 73 28 74 79 70 65 6f 66 28 54 65 73 74 41 74 74  s(typeof(TestAtt
125a0 72 69 62 75 74 65 29 2c 20 66 61 6c 73 65 29 3b  ribute), false);
125b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 61 74  ..        if (at
125c0 74 2e 4c 65 6e 67 74 68 20 3d 3d 20 31 20 26 26  t.Length == 1 &&
125d0 20 5f 74 65 73 74 73 5b 6d 69 2e 4e 61 6d 65 5d   _tests[mi.Name]
125e0 20 3d 3d 20 74 72 75 65 29 0d 0a 20 20 20 20 20   == true)..     
125f0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
12600 69 74 65 6d 73 2e 41 64 64 28 28 54 65 73 74 41  items.Add((TestA
12610 74 74 72 69 62 75 74 65 29 61 74 74 5b 30 5d 2c  ttribute)att[0],
12620 20 6d 69 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d   mi);..        }
12630 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12640 20 20 20 66 6f 72 65 61 63 68 20 28 4b 65 79 56     foreach (KeyV
12650 61 6c 75 65 50 61 69 72 3c 54 65 73 74 41 74 74  aluePair<TestAtt
12660 72 69 62 75 74 65 2c 20 53 79 73 74 65 6d 2e 52  ribute, System.R
12670 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64  eflection.Method
12680 49 6e 66 6f 3e 20 70 61 69 72 20 69 6e 20 69 74  Info> pair in it
12690 65 6d 73 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ems)..      {.. 
126a0 20 20 20 20 20 20 20 69 66 20 28 4f 6e 54 65 73         if (OnTes
126b0 74 53 74 61 72 74 69 6e 67 20 21 3d 20 6e 75 6c  tStarting != nul
126c0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 4f 6e  l)..          On
126d0 54 65 73 74 53 74 61 72 74 69 6e 67 28 74 68 69  TestStarting(thi
126e0 73 2c 20 6e 65 77 20 54 65 73 74 45 76 65 6e 74  s, new TestEvent
126f0 41 72 67 73 28 70 61 69 72 2e 56 61 6c 75 65 2e  Args(pair.Value.
12700 4e 61 6d 65 2c 20 54 65 73 74 52 65 73 75 6c 74  Name, TestResult
12710 45 6e 75 6d 2e 49 6e 63 6f 6e 63 6c 75 73 69 76  Enum.Inconclusiv
12720 65 2c 20 30 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  e, 0, null, null
12730 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ));....        i
12740 6e 74 20 73 74 61 72 74 20 3d 20 45 6e 76 69 72  nt start = Envir
12750 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
12760 3b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a  ;..        try..
12770 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
12780 20 20 20 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20       object obj 
12790 3d 20 70 61 69 72 2e 56 61 6c 75 65 2e 49 6e 76  = pair.Value.Inv
127a0 6f 6b 65 28 74 68 69 73 2c 20 6e 75 6c 6c 29 3b  oke(this, null);
127b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ..          int 
127c0 64 75 72 61 74 69 6f 6e 20 3d 20 45 6e 76 69 72  duration = Envir
127d0 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
127e0 20 2d 20 73 74 61 72 74 3b 0d 0a 20 20 20 20 20   - start;..     
127f0 20 20 20 20 20 69 66 20 28 4f 6e 54 65 73 74 46       if (OnTestF
12800 69 6e 69 73 68 65 64 20 21 3d 20 6e 75 6c 6c 29  inished != null)
12810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 6e  ..            On
12820 54 65 73 74 46 69 6e 69 73 68 65 64 28 74 68 69  TestFinished(thi
12830 73 2c 20 6e 65 77 20 54 65 73 74 45 76 65 6e 74  s, new TestEvent
12840 41 72 67 73 28 70 61 69 72 2e 56 61 6c 75 65 2e  Args(pair.Value.
12850 4e 61 6d 65 2c 20 54 65 73 74 52 65 73 75 6c 74  Name, TestResult
12860 45 6e 75 6d 2e 53 75 63 63 65 65 64 65 64 2c 20  Enum.Succeeded, 
12870 64 75 72 61 74 69 6f 6e 2c 20 6e 75 6c 6c 2c 20  duration, null, 
12880 28 6f 62 6a 20 69 73 20 73 74 72 69 6e 67 29 20  (obj is string) 
12890 3f 20 28 73 74 72 69 6e 67 29 6f 62 6a 20 3a 20  ? (string)obj : 
128a0 53 74 72 69 6e 67 2e 45 6d 70 74 79 29 29 3b 0d  String.Empty));.
128b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
128c0 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65 70      catch (Excep
128d0 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20  tion e)..       
128e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e   {..          in
128f0 74 20 64 75 72 61 74 69 6f 6e 20 3d 20 45 6e 76  t duration = Env
12900 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
12910 6e 74 20 2d 20 73 74 61 72 74 3b 0d 0a 20 20 20  nt - start;..   
12920 20 20 20 20 20 20 20 45 78 63 65 70 74 69 6f 6e         Exception
12930 20 69 6e 6e 65 72 20 3d 20 65 2e 49 6e 6e 65 72   inner = e.Inner
12940 45 78 63 65 70 74 69 6f 6e 3b 0d 0a 0d 0a 20 20  Exception;....  
12950 20 20 20 20 20 20 20 20 69 66 20 28 4f 6e 54 65          if (OnTe
12960 73 74 46 69 6e 69 73 68 65 64 20 21 3d 20 6e 75  stFinished != nu
12970 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ll)..          {
12980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
12990 20 28 69 6e 6e 65 72 20 69 73 20 49 6e 63 6f 6e   (inner is Incon
129a0 63 6c 75 73 69 76 65 45 78 63 65 70 74 69 6f 6e  clusiveException
129b0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
129c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
129d0 4f 6e 54 65 73 74 46 69 6e 69 73 68 65 64 28 74  OnTestFinished(t
129e0 68 69 73 2c 20 6e 65 77 20 54 65 73 74 45 76 65  his, new TestEve
129f0 6e 74 41 72 67 73 28 70 61 69 72 2e 56 61 6c 75  ntArgs(pair.Valu
12a00 65 2e 4e 61 6d 65 2c 20 54 65 73 74 52 65 73 75  e.Name, TestResu
12a10 6c 74 45 6e 75 6d 2e 49 6e 63 6f 6e 63 6c 75 73  ltEnum.Inconclus
12a20 69 76 65 2c 20 64 75 72 61 74 69 6f 6e 2c 20 6e  ive, duration, n
12a30 75 6c 6c 2c 20 69 6e 6e 65 72 2e 4d 65 73 73 61  ull, inner.Messa
12a40 67 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ge));..         
12a50 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
12a60 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
12a70 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
12a80 20 20 20 20 20 4f 6e 54 65 73 74 46 69 6e 69 73       OnTestFinis
12a90 68 65 64 28 74 68 69 73 2c 20 6e 65 77 20 54 65  hed(this, new Te
12aa0 73 74 45 76 65 6e 74 41 72 67 73 28 70 61 69 72  stEventArgs(pair
12ab0 2e 56 61 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73  .Value.Name, Tes
12ac0 74 52 65 73 75 6c 74 45 6e 75 6d 2e 46 61 69 6c  tResultEnum.Fail
12ad0 65 64 2c 20 64 75 72 61 74 69 6f 6e 2c 20 69 6e  ed, duration, in
12ae0 6e 65 72 2c 20 6e 75 6c 6c 29 29 3b 0d 0a 20 20  ner, null));..  
12af0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
12b00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12b10 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
12b20 20 20 20 20 20 20 69 66 20 28 4f 6e 41 6c 6c 54        if (OnAllT
12b30 65 73 74 73 44 6f 6e 65 20 21 3d 20 6e 75 6c 6c  estsDone != null
12b40 29 0d 0a 20 20 20 20 20 20 20 20 4f 6e 41 6c 6c  )..        OnAll
12b50 54 65 73 74 73 44 6f 6e 65 28 74 68 69 73 2c 20  TestsDone(this, 
12b60 45 76 65 6e 74 41 72 67 73 2e 45 6d 70 74 79 29  EventArgs.Empty)
12b70 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d  ;..    }..  }..}
12b80 0d 0a                                            ..