System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c51dc952b020f5faa33635c11d96f8b87ef8f8b0:


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 0d   System.Text;...
00b0: 0a 6e 61 6d 65 73 70 61 63 65 20 74 65 73 74 0d  .namespace test.
00c0: 0a 7b 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20 63  .{..  internal c
00d0: 6c 61 73 73 20 54 65 73 74 43 61 73 65 73 20 3a  lass TestCases :
00e0: 20 54 65 73 74 43 61 73 65 42 61 73 65 0d 0a 20   TestCaseBase.. 
00f0: 20 7b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20   {..    private 
0100: 63 6f 6e 73 74 20 69 6e 74 20 4e 75 6d 54 68 72  const int NumThr
0110: 65 61 64 73 20 3d 20 38 3b 0d 0a 20 20 20 20 70  eads = 8;..    p
0120: 72 69 76 61 74 65 20 63 6f 6e 73 74 20 69 6e 74  rivate const int
0130: 20 54 68 72 65 61 64 54 69 6d 65 6f 75 74 20 3d   ThreadTimeout =
0140: 20 36 30 30 30 30 3b 0d 0a 0d 0a 20 20 20 20 70   60000;....    p
0150: 72 69 76 61 74 65 20 4c 69 73 74 3c 73 74 72 69  rivate List<stri
0160: 6e 67 3e 20 64 72 6f 70 74 61 62 6c 65 73 20 3d  ng> droptables =
0170: 20 6e 65 77 20 4c 69 73 74 3c 73 74 72 69 6e 67   new List<string
0180: 3e 28 29 3b 0d 0a 20 20 20 20 70 72 69 76 61 74  >();..    privat
0190: 65 20 4c 69 73 74 3c 73 74 72 69 6e 67 3e 20 6d  e List<string> m
01a0: 61 79 64 72 6f 70 74 61 62 6c 65 20 3d 20 6e 65  aydroptable = ne
01b0: 77 20 4c 69 73 74 3c 73 74 72 69 6e 67 3e 28 29  w List<string>()
01c0: 3b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 6c  ;..    private l
01d0: 6f 6e 67 20 6c 6f 67 65 76 65 6e 74 73 20 3d 20  ong logevents = 
01e0: 30 3b 0d 0a 20 20 20 20 0d 0a 0d 0a 20 20 20 20  0;..    ....    
01f0: 69 6e 74 65 72 6e 61 6c 20 54 65 73 74 43 61 73  internal TestCas
0200: 65 73 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  es()..    {..   
0210: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
0220: 61 6c 20 54 65 73 74 43 61 73 65 73 28 44 62 50  al TestCases(DbP
0230: 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 20 66  roviderFactory f
0240: 61 63 74 6f 72 79 2c 20 73 74 72 69 6e 67 20 63  actory, string c
0250: 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 29  onnectionString)
0260: 0d 0a 20 20 20 20 20 20 3a 20 62 61 73 65 28 66  ..      : base(f
0270: 61 63 74 6f 72 79 2c 20 63 6f 6e 6e 65 63 74 69  actory, connecti
0280: 6f 6e 53 74 72 69 6e 67 29 0d 0a 20 20 20 20 7b  onString)..    {
0290: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
02a0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
02b0: 20 20 2f 2f 2f 20 49 6e 73 65 72 74 73 20 62 69    /// Inserts bi
02c0: 6e 61 72 79 20 64 61 74 61 20 69 6e 74 6f 20 74  nary data into t
02d0: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
02e0: 67 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65  g a named parame
02f0: 74 65 72 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ter..    /// </s
0300: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 69 6e 74  ummary>..    int
0310: 65 72 6e 61 6c 20 76 6f 69 64 20 42 69 6e 61 72  ernal void Binar
0320: 79 49 6e 73 65 72 74 28 29 0d 0a 20 20 20 20 7b  yInsert()..    {
0330: 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
0340: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
0350: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
0360: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
0370: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
0380: 6e 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54  ndText = "INSERT
0390: 20 49 4e 54 4f 20 54 65 73 74 43 61 73 65 28 46   INTO TestCase(F
03a0: 69 65 6c 64 36 29 20 56 41 4c 55 45 53 28 40 62  ield6) VALUES(@b
03b0: 69 6e 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 44  in)";..        D
03c0: 62 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64  bParameter Field
03d0: 36 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61  6 = cmd.CreatePa
03e0: 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20  rameter();....  
03f0: 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d        byte[] b =
0400: 20 6e 65 77 20 62 79 74 65 5b 34 30 30 30 5d 3b   new byte[4000];
0410: 0d 0a 20 20 20 20 20 20 20 20 62 5b 30 5d 20 3d  ..        b[0] =
0420: 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 62 5b 31   1;..        b[1
0430: 30 30 5d 20 3d 20 32 3b 0d 0a 20 20 20 20 20 20  00] = 2;..      
0440: 20 20 62 5b 31 30 30 30 5d 20 3d 20 33 3b 0d 0a    b[1000] = 3;..
0450: 20 20 20 20 20 20 20 20 62 5b 32 30 30 30 5d 20          b[2000] 
0460: 3d 20 34 3b 0d 0a 20 20 20 20 20 20 20 20 62 5b  = 4;..        b[
0470: 33 30 30 30 5d 20 3d 20 35 3b 0d 0a 0d 0a 20 20  3000] = 5;....  
0480: 20 20 20 20 20 20 46 69 65 6c 64 36 2e 50 61 72        Field6.Par
0490: 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 62  ameterName = "@b
04a0: 69 6e 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  in";..        Fi
04b0: 65 6c 64 36 2e 56 61 6c 75 65 20 3d 20 62 3b 0d  eld6.Value = b;.
04c0: 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ...        cmd.P
04d0: 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69  arameters.Add(Fi
04e0: 65 6c 64 36 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  eld6);....      
04f0: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
0500: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
0510: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
0520: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 43 68  internal void Ch
0530: 65 63 6b 4c 6f 63 6b 65 64 28 29 0d 0a 20 20 20  eckLocked()..   
0540: 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 4c 65 74   {..      // Let
0550: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  s make sure the 
0560: 64 61 74 61 62 61 73 65 20 69 73 6e 27 74 20 6c  database isn't l
0570: 6f 63 6b 65 64 2e 20 20 49 66 20 69 74 20 69 73  ocked.  If it is
0580: 2c 20 77 65 27 76 65 20 66 61 69 6c 65 64 2e 0d  , we've failed..
0590: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
05a0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63 6e  Connection newcn
05b0: 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c 65  n = ((ICloneable
05c0: 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61  )_cnn).Clone() a
05d0: 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29 0d  s DbConnection).
05e0: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
05f0: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65  Command cmd = ne
0600: 77 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  wcnn.CreateComma
0610: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
0620: 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63          if (newc
0630: 6e 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e  nn.State != Conn
0640: 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e  ectionState.Open
0650: 29 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b  ) newcnn.Open();
0660: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
0670: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49  CommandText = "I
0680: 4e 53 45 52 54 20 49 4e 54 4f 20 54 65 73 74 43  NSERT INTO TestC
0690: 61 73 65 20 28 46 69 65 6c 64 31 29 20 53 45 4c  ase (Field1) SEL
06a0: 45 43 54 20 31 20 57 48 45 52 45 20 31 20 3d 20  ECT 1 WHERE 1 = 
06b0: 32 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  2";..        cmd
06c0: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
06d0: 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ();..      }..  
06e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
06f0: 6e 61 6c 20 76 6f 69 64 20 43 68 65 63 6b 53 51  nal void CheckSQ
0700: 4c 69 74 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  Lite()..    {.. 
0710: 20 20 20 20 20 69 66 20 28 5f 66 61 63 74 2e 47       if (_fact.G
0720: 65 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e  etType().Name.In
0730: 64 65 78 4f 66 28 22 53 51 4c 69 74 65 22 2c 20  dexOf("SQLite", 
0740: 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e  StringComparison
0750: 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61  .OrdinalIgnoreCa
0760: 73 65 29 20 3d 3d 20 2d 31 29 0d 0a 20 20 20 20  se) == -1)..    
0770: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6e      throw new In
0780: 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74  conclusiveExcept
0790: 69 6f 6e 28 22 4e 6f 74 20 61 20 53 51 4c 69 74  ion("Not a SQLit
07a0: 65 20 64 61 74 61 62 61 73 65 22 29 3b 0d 0a 20  e database");.. 
07b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
07c0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
07d0: 2f 2f 20 54 65 73 74 73 20 63 68 61 6e 67 69 6e  // Tests changin
07e0: 67 20 70 61 73 73 77 6f 72 64 20 6f 6e 20 61 6e  g password on an
07f0: 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
0800: 61 73 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ase...    /// </
0810: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54  summary>..    [T
0820: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
0830: 61 6c 20 76 6f 69 64 20 43 68 61 6e 67 65 50 61  al void ChangePa
0840: 73 73 77 6f 72 64 54 65 73 74 28 29 0d 0a 20 20  sswordTest()..  
0850: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20    {..        if 
0860: 28 5f 66 61 63 74 2e 47 65 74 54 79 70 65 28 29  (_fact.GetType()
0870: 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66 28 22 53  .Name.IndexOf("S
0880: 51 4c 69 74 65 22 2c 20 53 74 72 69 6e 67 43 6f  QLite", StringCo
0890: 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c  mparison.Ordinal
08a0: 49 67 6e 6f 72 65 43 61 73 65 29 20 3e 20 2d 31  IgnoreCase) > -1
08b0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
08c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4f 70 65            // Ope
08d0: 6e 73 20 61 6e 20 75 6e 65 6e 63 72 79 70 74 65  ns an unencrypte
08e0: 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20  d database..    
08f0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f          SQLiteCo
0900: 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 20 3d 20 6e  nnection cnn = n
0910: 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  ew SQLiteConnect
0920: 69 6f 6e 28 5f 63 6e 6e 73 74 72 69 6e 67 2e 43  ion(_cnnstring.C
0930: 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 29  onnectionString)
0940: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
0950: 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a   cnn.Open();....
0960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45              // E
0970: 6e 63 72 79 70 74 73 20 74 68 65 20 64 61 74 61  ncrypts the data
0980: 62 61 73 65 2e 20 54 68 65 20 63 6f 6e 6e 65 63  base. The connec
0990: 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 76 61 6c  tion remains val
09a0: 69 64 20 61 6e 64 20 75 73 61 62 6c 65 20 61 66  id and usable af
09b0: 74 65 72 77 61 72 64 73 2e 0d 0a 20 20 20 20 20  terwards...     
09c0: 20 20 20 20 20 20 20 63 6e 6e 2e 43 68 61 6e 67         cnn.Chang
09d0: 65 50 61 73 73 77 6f 72 64 28 22 6d 79 70 61 73  ePassword("mypas
09e0: 73 77 6f 72 64 22 29 3b 0d 0a 0d 0a 20 20 20 20  sword");....    
09f0: 20 20 20 20 20 20 20 20 6d 61 79 64 72 6f 70 74          maydropt
0a00: 61 62 6c 65 2e 41 64 64 28 22 43 68 61 6e 67 65  able.Add("Change
0a10: 50 61 73 73 77 6f 72 64 54 65 73 74 22 29 3b 0d  PasswordTest");.
0a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0a30: 28 63 6e 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f  (cnn.State != Co
0a40: 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70  nnectionState.Op
0a50: 65 6e 29 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d  en) cnn.Open();.
0a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69  .            usi
0a70: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
0a80: 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f  d = cnn.CreateCo
0a90: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
0aa0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0ab0: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d           cmd.Com
0ac0: 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41  mandText = "CREA
0ad0: 54 45 20 54 41 42 4c 45 20 43 68 61 6e 67 65 50  TE TABLE ChangeP
0ae0: 61 73 73 77 6f 72 64 54 65 73 74 28 49 44 20 69  asswordTest(ID i
0af0: 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79 29 22  nt primary key)"
0b00: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
0b10: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
0b20: 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
0b30: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
0b40: 20 20 20 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73          cnn.Clos
0b50: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
0b60: 20 20 20 20 2f 2f 20 54 72 79 20 72 65 2d 6f 70      // Try re-op
0b70: 65 6e 69 6e 67 20 77 69 74 68 20 62 61 64 20 70  ening with bad p
0b80: 61 73 73 77 6f 72 64 0d 0a 20 20 20 20 20 20 20  assword..       
0b90: 20 20 20 20 20 63 6e 6e 2e 53 65 74 50 61 73 73       cnn.SetPass
0ba0: 77 6f 72 64 28 22 21 6d 79 70 61 73 73 77 6f 72  word("!mypasswor
0bb0: 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  d");..          
0bc0: 20 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20    cnn.Open();.. 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 43             cnn.C
0be0: 6c 6f 73 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  lose();....     
0bf0: 20 20 20 20 20 20 20 2f 2f 20 54 72 79 20 72 65         // Try re
0c00: 2d 6f 70 65 6e 69 6e 67 20 77 69 74 68 20 67 6f  -opening with go
0c10: 6f 64 20 70 61 73 73 77 6f 72 64 0d 0a 20 20 20  od password..   
0c20: 20 20 20 20 20 20 20 20 20 63 6e 6e 2e 53 65 74           cnn.Set
0c30: 50 61 73 73 77 6f 72 64 28 22 6d 79 70 61 73 73  Password("mypass
0c40: 77 6f 72 64 22 29 3b 0d 0a 20 20 20 20 20 20 20  word");..       
0c50: 20 20 20 20 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b       cnn.Open();
0c60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0c70: 2f 2f 20 44 65 63 72 70 79 74 20 64 61 74 61 62  // Decrpyt datab
0c80: 61 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ase..           
0c90: 20 63 6e 6e 2e 43 68 61 6e 67 65 50 61 73 73 77   cnn.ChangePassw
0ca0: 6f 72 64 28 22 22 29 3b 0d 0a 0d 0a 20 20 20 20  ord("");....    
0cb0: 20 20 20 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73          cnn.Clos
0cc0: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
0cd0: 20 20 20 20 2f 2f 20 54 72 79 20 6f 70 65 6e 69      // Try openi
0ce0: 6e 67 20 6e 6f 77 20 77 69 74 68 6f 75 74 20 70  ng now without p
0cf0: 61 73 73 77 6f 72 64 0d 0a 20 20 20 20 20 20 20  assword..       
0d00: 20 20 20 20 20 63 6e 6e 2e 4f 70 65 6e 28 29 3b       cnn.Open();
0d10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ..            cn
0d20: 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a 0d 0a 20 20  n.Close();....  
0d30: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
0d40: 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75  ..    [Test(Sequ
0d50: 65 6e 63 65 3d 31 29 5d 0d 0a 20 20 20 20 69 6e  ence=1)]..    in
0d60: 74 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 56 65  ternal string Ve
0d70: 72 73 69 6f 6e 54 65 73 74 28 29 0d 0a 20 20 20  rsionTest()..   
0d80: 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53   {..      CheckS
0d90: 51 4c 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20  QLite();..      
0da0: 73 74 72 69 6e 67 5b 5d 20 76 65 72 73 69 6f 6e  string[] version
0db0: 20 3d 20 5f 63 6e 6e 2e 53 65 72 76 65 72 56 65   = _cnn.ServerVe
0dc0: 72 73 69 6f 6e 2e 53 70 6c 69 74 28 27 2e 27 29  rsion.Split('.')
0dd0: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 43 6f 6e  ;..      if (Con
0de0: 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 76 65 72  vert.ToInt32(ver
0df0: 73 69 6f 6e 5b 30 5d 29 20 3c 20 33 0d 0a 20 20  sion[0]) < 3..  
0e00: 20 20 20 20 20 20 7c 7c 20 28 43 6f 6e 76 65 72        || (Conver
0e10: 74 2e 54 6f 49 6e 74 33 32 28 76 65 72 73 69 6f  t.ToInt32(versio
0e20: 6e 5b 30 5d 29 20 3d 3d 20 33 20 26 26 20 43 6f  n[0]) == 3 && Co
0e30: 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 76 65  nvert.ToInt32(ve
0e40: 72 73 69 6f 6e 5b 31 5d 29 20 3c 20 36 29 0d 0a  rsion[1]) < 6)..
0e50: 20 20 20 20 20 20 20 20 7c 7c 20 28 43 6f 6e 76          || (Conv
0e60: 65 72 74 2e 54 6f 49 6e 74 33 32 28 76 65 72 73  ert.ToInt32(vers
0e70: 69 6f 6e 5b 30 5d 29 20 3d 3d 20 33 20 26 26 20  ion[0]) == 3 && 
0e80: 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32 28  Convert.ToInt32(
0e90: 76 65 72 73 69 6f 6e 5b 31 5d 29 20 3d 3d 20 36  version[1]) == 6
0ea0: 20 26 26 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e   && Convert.ToIn
0eb0: 74 33 32 28 76 65 72 73 69 6f 6e 5b 32 5d 29 20  t32(version[2]) 
0ec0: 3c 20 31 29 0d 0a 20 20 20 20 20 20 20 20 29 20  < 1)..        ) 
0ed0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
0ee0: 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ion(String.Forma
0ef0: 74 28 22 53 51 4c 69 74 65 20 45 6e 67 69 6e 65  t("SQLite Engine
0f00: 20 69 73 20 7b 30 7d 2e 20 20 4d 69 6e 69 6d 75   is {0}.  Minimu
0f10: 6d 20 73 75 70 70 6f 72 74 65 64 20 76 65 72 73  m supported vers
0f20: 69 6f 6e 20 69 73 20 33 2e 36 2e 31 22 2c 20 5f  ion is 3.6.1", _
0f30: 63 6e 6e 2e 53 65 72 76 65 72 56 65 72 73 69 6f  cnn.ServerVersio
0f40: 6e 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65  n));....      re
0f50: 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d  turn String.Form
0f60: 61 74 28 22 53 51 4c 69 74 65 20 45 6e 67 69 6e  at("SQLite Engin
0f70: 65 20 69 73 20 7b 30 7d 22 2c 20 5f 63 6e 6e 2e  e is {0}", _cnn.
0f80: 53 65 72 76 65 72 56 65 72 73 69 6f 6e 29 3b 0d  ServerVersion);.
0f90: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
0fa0: 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d  [Test(Sequence =
0fb0: 20 31 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e   1)]..    intern
0fc0: 61 6c 20 76 6f 69 64 20 50 61 72 73 65 54 65 73  al void ParseTes
0fd0: 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  t()..    {..    
0fe0: 20 20 44 61 74 61 54 61 62 6c 65 20 74 62 6c 20    DataTable tbl 
0ff0: 3d 20 5f 63 6e 6e 2e 47 65 74 53 63 68 65 6d 61  = _cnn.GetSchema
1000: 28 22 56 69 65 77 43 6f 6c 75 6d 6e 73 22 29 3b  ("ViewColumns");
1010: 0d 0a 20 20 20 20 20 20 44 61 74 61 54 61 62 6c  ..      DataTabl
1020: 65 20 74 62 6c 32 20 3d 20 5f 63 6e 6e 2e 47 65  e tbl2 = _cnn.Ge
1030: 74 53 63 68 65 6d 61 28 22 56 69 65 77 73 22 29  tSchema("Views")
1040: 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e 67  ;....      using
1050: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
1060: 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
1070: 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b  mand())..      {
1080: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61  ..        cmd.Pa
1090: 72 61 6d 65 74 65 72 73 2e 41 64 64 28 63 6d 64  rameters.Add(cmd
10a0: 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72  .CreateParameter
10b0: 28 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  ());..        cm
10c0: 64 2e 50 61 72 61 6d 65 74 65 72 73 5b 30 5d 2e  d.Parameters[0].
10d0: 56 61 6c 75 65 20 3d 20 31 3b 0d 0a 0d 0a 20 20  Value = 1;....  
10e0: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
10f0: 74 65 72 73 2e 41 64 64 28 63 6d 64 2e 43 72 65  ters.Add(cmd.Cre
1100: 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 29 3b  ateParameter());
1110: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61  ..        cmd.Pa
1120: 72 61 6d 65 74 65 72 73 5b 31 5d 2e 56 61 6c 75  rameters[1].Valu
1130: 65 20 3d 20 31 3b 0d 0a 0d 0a 20 20 20 20 20 20  e = 1;....      
1140: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
1150: 74 20 3d 20 22 73 65 6c 65 63 74 20 2a 20 66 72  t = "select * fr
1160: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
1170: 20 6c 69 6d 69 74 20 3f 20 6f 66 66 73 65 74 20   limit ? offset 
1180: 3f 22 3b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  ?";..        obj
1190: 65 63 74 20 6f 62 6a 20 3d 20 63 6d 64 2e 45 78  ect obj = cmd.Ex
11a0: 65 63 75 74 65 53 63 61 6c 61 72 28 29 3b 0d 0a  ecuteScalar();..
11b0: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
11c0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 40 22 0d 0a  mmandText = @"..
11d0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
11e0: 45 20 41 28 49 44 20 49 4e 54 45 47 45 52 2c 20  E A(ID INTEGER, 
11f0: 42 49 44 20 49 4e 54 45 47 45 52 29 3b 43 52 45  BID INTEGER);CRE
1200: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 42  ATE TEMP TABLE B
1210: 28 49 44 20 49 4e 54 45 47 45 52 2c 20 4d 59 56  (ID INTEGER, MYV
1220: 41 4c 20 56 41 52 43 48 41 52 29 3b 0d 0a 49 4e  AL VARCHAR);..IN
1230: 53 45 52 54 20 49 4e 54 4f 20 41 20 28 49 44 2c  SERT INTO A (ID,
1240: 20 42 49 44 29 20 56 41 4c 55 45 53 28 32 2c 20   BID) VALUES(2, 
1250: 31 29 3b 0d 0a 49 4e 53 45 52 54 20 49 4e 54 4f  1);..INSERT INTO
1260: 20 42 20 28 49 44 2c 20 4d 59 56 41 4c 29 20 56   B (ID, MYVAL) V
1270: 41 4c 55 45 53 28 31 2c 27 54 45 53 54 27 29 3b  ALUES(1,'TEST');
1280: 0d 0a 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  ..";..        cm
1290: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
12a0: 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 0d 0a  y();..        ..
12b0: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
12c0: 61 6e 64 54 65 78 74 20 3d 20 22 73 65 6c 65 63  andText = "selec
12d0: 74 20 2a 2c 20 28 73 65 6c 65 63 74 20 31 20 61  t *, (select 1 a
12e0: 73 20 63 20 66 72 6f 6d 20 62 20 77 68 65 72 65  s c from b where
12f0: 20 62 2e 69 64 20 3d 20 61 2e 62 69 64 29 20 66   b.id = a.bid) f
1300: 72 6f 6d 20 61 3b 22 3b 0d 0a 20 20 20 20 20 20  rom a;";..      
1310: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
1320: 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20 63  eader reader = c
1330: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
1340: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
1350: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65 72            reader
1360: 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20 20  .Read();..      
1370: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1380: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
1390: 20 22 73 65 6c 65 63 74 20 61 2e 69 64 20 61 73   "select a.id as
13a0: 20 61 61 20 66 72 6f 6d 20 61 20 77 68 65 72 65   aa from a where
13b0: 20 28 73 65 6c 65 63 74 20 31 20 66 72 6f 6d 20   (select 1 from 
13c0: 28 73 65 6c 65 63 74 20 31 20 77 68 65 72 65 20  (select 1 where 
13d0: 31 20 3d 20 61 61 29 29 3b 22 3b 0d 0a 20 20 20  1 = aa));";..   
13e0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
13f0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
1400: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
1410: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
1420: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 61  {..          rea
1430: 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20  der.Read();..   
1440: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1450: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
1460: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 73 65 6c  mmandText = "sel
1470: 65 63 74 20 2a 2c 20 28 73 65 6c 65 63 74 20 63  ect *, (select c
1480: 6f 75 6e 74 28 63 29 20 66 72 6f 6d 20 28 73 65  ount(c) from (se
1490: 6c 65 63 74 20 31 20 61 73 20 63 20 66 72 6f 6d  lect 1 as c from
14a0: 20 62 20 77 68 65 72 65 20 62 2e 69 64 20 3d 20   b where b.id = 
14b0: 61 2e 62 69 64 29 29 20 66 72 6f 6d 20 61 3b 22  a.bid)) from a;"
14c0: 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ;..        using
14d0: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
14e0: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
14f0: 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20  uteReader())..  
1500: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1510: 20 20 20 72 65 61 64 65 72 2e 52 65 61 64 28 29     reader.Read()
1520: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
1530: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
1540: 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e      [Test(Sequen
1550: 63 65 20 3d 20 33 39 29 5d 0d 0a 20 20 20 20 69  ce = 39)]..    i
1560: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 4d 75 6c  nternal void Mul
1570: 74 69 70 6c 65 46 75 6e 63 74 69 6f 6e 73 28 29  tipleFunctions()
1580: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43  ..    {..      C
1590: 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 20  heckSQLite();.. 
15a0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
15b0: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
15c0: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
15d0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
15e0: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
15f0: 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 4d 59  ext = "SELECT MY
1600: 43 4f 55 4e 54 28 46 69 65 6c 64 31 29 2c 20 4d  COUNT(Field1), M
1610: 59 43 4f 55 4e 54 28 46 69 65 6c 64 32 29 20 46  YCOUNT(Field2) F
1620: 52 4f 4d 20 54 65 73 74 43 61 73 65 22 3b 0d 0a  ROM TestCase";..
1630: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
1640: 62 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64  bDataReader read
1650: 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65  er = cmd.Execute
1660: 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20  Reader())..     
1670: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1680: 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a  reader.Read();..
1690: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16a0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
16b0: 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20   [Test(Sequence 
16c0: 3d 20 38 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72  = 8)]..    inter
16d0: 6e 61 6c 20 76 6f 69 64 20 46 75 6e 63 74 69 6f  nal void Functio
16e0: 6e 57 69 74 68 43 6f 6c 6c 61 74 69 6f 6e 28 29  nWithCollation()
16f0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43  ..    {..      C
1700: 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 20  heckSQLite();.. 
1710: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
1720: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
1730: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
1740: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
1750: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
1760: 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 43 48  ext = "SELECT CH
1770: 41 52 49 4e 44 45 58 28 27 70 61 74 27 2c 20 27  ARINDEX('pat', '
1780: 74 68 65 70 61 74 27 29 2c 20 43 48 41 52 49 4e  thepat'), CHARIN
1790: 44 45 58 28 27 70 61 74 27 2c 20 27 54 48 45 50  DEX('pat', 'THEP
17a0: 41 54 27 29 2c 20 43 48 41 52 49 4e 44 45 58 28  AT'), CHARINDEX(
17b0: 27 70 61 74 27 20 43 4f 4c 4c 41 54 45 20 4e 4f  'pat' COLLATE NO
17c0: 43 41 53 45 2c 20 27 54 48 45 50 41 54 27 20 43  CASE, 'THEPAT' C
17d0: 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29 22 3b  OLLATE NOCASE)";
17e0: 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ..        using 
17f0: 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 65  (DbDataReader re
1800: 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75  ader = cmd.Execu
1810: 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20  teReader())..   
1820: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1830: 20 20 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b    reader.Read();
1840: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
1850: 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34 28  reader.GetInt64(
1860: 30 29 20 21 3d 20 72 65 61 64 65 72 2e 47 65 74  0) != reader.Get
1870: 49 6e 74 36 34 28 32 29 20 7c 7c 20 72 65 61 64  Int64(2) || read
1880: 65 72 2e 47 65 74 49 6e 74 36 34 28 31 29 20 21  er.GetInt64(1) !
1890: 3d 20 30 20 7c 7c 20 72 65 61 64 65 72 2e 47 65  = 0 || reader.Ge
18a0: 74 49 6e 74 36 34 28 30 29 20 21 3d 20 34 29 0d  tInt64(0) != 4).
18b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
18c0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
18d0: 28 22 43 68 61 72 49 6e 64 65 78 20 72 65 74 75  ("CharIndex retu
18e0: 72 6e 65 64 20 77 72 6f 6e 67 20 72 65 73 75 6c  rned wrong resul
18f0: 74 73 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ts!");..        
1900: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1910: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53  }....    [Test(S
1920: 65 71 75 65 6e 63 65 20 3d 20 39 29 5d 0d 0a 20  equence = 9)].. 
1930: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
1940: 20 46 75 6e 63 74 69 6f 6e 57 69 74 68 43 6f 6c   FunctionWithCol
1950: 6c 61 74 69 6f 6e 32 28 29 0d 0a 20 20 20 20 7b  lation2()..    {
1960: 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c  ..      CheckSQL
1970: 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73  ite();..      us
1980: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
1990: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
19a0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
19b0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64    {..        cmd
19c0: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
19d0: 53 45 4c 45 43 54 20 43 41 53 45 54 45 53 54 28  SELECT CASETEST(
19e0: 27 70 61 74 27 2c 20 27 70 61 74 27 29 2c 20 43  'pat', 'pat'), C
19f0: 41 53 45 54 45 53 54 28 27 70 61 74 27 2c 20 27  ASETEST('pat', '
1a00: 50 41 54 27 29 2c 20 43 41 53 45 54 45 53 54 28  PAT'), CASETEST(
1a10: 27 70 61 74 27 20 43 4f 4c 4c 41 54 45 20 4e 4f  'pat' COLLATE NO
1a20: 43 41 53 45 2c 20 27 50 41 54 27 20 43 4f 4c 4c  CASE, 'PAT' COLL
1a30: 41 54 45 20 4e 4f 43 41 53 45 29 2c 20 43 41 53  ATE NOCASE), CAS
1a40: 45 54 45 53 54 28 27 70 61 74 27 20 43 4f 4c 4c  ETEST('pat' COLL
1a50: 41 54 45 20 4d 59 53 45 51 55 45 4e 43 45 2c 20  ATE MYSEQUENCE, 
1a60: 27 50 41 54 27 20 43 4f 4c 4c 41 54 45 20 4d 59  'PAT' COLLATE MY
1a70: 53 45 51 55 45 4e 43 45 29 2c 20 43 41 53 45 54  SEQUENCE), CASET
1a80: 45 53 54 28 27 74 61 70 27 2c 20 27 54 41 50 27  EST('tap', 'TAP'
1a90: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29   COLLATE NOCASE)
1aa0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e  ";..        usin
1ab0: 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20  g (DbDataReader 
1ac0: 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65  reader = cmd.Exe
1ad0: 63 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20  cuteReader()).. 
1ae0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1af0: 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64 28      reader.Read(
1b00: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1b10: 20 28 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36   (reader.GetInt6
1b20: 34 28 30 29 20 21 3d 20 72 65 61 64 65 72 2e 47  4(0) != reader.G
1b30: 65 74 49 6e 74 36 34 28 32 29 20 7c 7c 20 72 65  etInt64(2) || re
1b40: 61 64 65 72 2e 47 65 74 49 6e 74 36 34 28 31 29  ader.GetInt64(1)
1b50: 20 21 3d 20 31 20 7c 7c 20 72 65 61 64 65 72 2e   != 1 || reader.
1b60: 47 65 74 49 6e 74 36 34 28 30 29 20 21 3d 20 30  GetInt64(0) != 0
1b70: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  )..            t
1b80: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
1b90: 6f 6e 28 22 43 68 61 72 49 6e 64 65 78 20 72 65  on("CharIndex re
1ba0: 74 75 72 6e 65 64 20 77 72 6f 6e 67 20 72 65 73  turned wrong res
1bb0: 75 6c 74 73 21 22 29 3b 0d 0a 20 20 20 20 20 20  ults!");..      
1bc0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1bd0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
1be0: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
1bf0: 76 6f 69 64 20 44 61 74 61 54 79 70 65 73 53 63  void DataTypesSc
1c00: 68 65 6d 61 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  hema()..    {.. 
1c10: 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74 61       using (Data
1c20: 54 61 62 6c 65 20 74 62 6c 20 3d 20 5f 63 6e 6e  Table tbl = _cnn
1c30: 2e 47 65 74 53 63 68 65 6d 61 28 22 44 61 74 61  .GetSchema("Data
1c40: 54 79 70 65 73 22 29 29 0d 0a 20 20 20 20 20 20  Types"))..      
1c50: 7b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  {..      }..    
1c60: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
1c70: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1c80: 4d 61 6b 65 20 73 75 72 65 20 6f 75 72 20 69 6d  Make sure our im
1c90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ca0: 43 6c 65 61 72 50 6f 6f 6c 28 29 20 62 65 68 61  ClearPool() beha
1cb0: 76 65 73 20 65 78 61 63 74 6c 79 20 61 73 20 74  ves exactly as t
1cc0: 68 65 20 53 71 6c 43 6c 69 65 6e 74 20 76 65 72  he SqlClient ver
1cd0: 73 69 6f 6e 20 69 73 20 64 6f 63 75 6d 65 6e 74  sion is document
1ce0: 65 64 20 74 6f 20 62 65 68 61 76 65 2e 0d 0a 20  ed to behave... 
1cf0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
1d00: 3e 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71  >..    [Test(Seq
1d10: 75 65 6e 63 65 3d 39 30 29 5d 0d 0a 20 20 20 20  uence=90)]..    
1d20: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 43 6c  internal void Cl
1d30: 65 61 72 50 6f 6f 6c 54 65 73 74 28 29 0d 0a 20  earPoolTest().. 
1d40: 20 20 20 7b 0d 0a 20 20 20 20 20 20 73 74 72 69     {..      stri
1d50: 6e 67 20 74 61 62 6c 65 20 3d 20 22 63 6c 65 61  ng table = "clea
1d60: 72 70 6f 6f 6c 22 3b 0d 0a 20 20 20 20 20 20 73  rpool";..      s
1d70: 74 72 69 6e 67 20 74 65 6d 70 20 3d 20 22 54 45  tring temp = "TE
1d80: 4d 50 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66  MP";....      if
1d90: 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70 65 28   (_fact.GetType(
1da0: 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66 28 22  ).Name.IndexOf("
1db0: 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e 67 43  SQLite", StringC
1dc0: 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61  omparison.Ordina
1dd0: 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20  lIgnoreCase) == 
1de0: 2d 31 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  -1)..      {..  
1df0: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 53 74 72        temp = Str
1e00: 69 6e 67 2e 45 6d 70 74 79 3b 0d 0a 20 20 20 20  ing.Empty;..    
1e10: 20 20 20 20 74 61 62 6c 65 20 3d 20 22 23 63 6c      table = "#cl
1e20: 65 61 72 70 6f 6f 6c 22 3b 0d 0a 20 20 20 20 20  earpool";..     
1e30: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   }....      obje
1e40: 63 74 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  ct value;..     
1e50: 20 69 66 20 28 5f 63 6e 6e 73 74 72 69 6e 67 2e   if (_cnnstring.
1e60: 54 72 79 47 65 74 56 61 6c 75 65 28 22 50 6f 6f  TryGetValue("Poo
1e70: 6c 69 6e 67 22 2c 20 6f 75 74 20 76 61 6c 75 65  ling", out value
1e80: 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f  ) == false) thro
1e90: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
1ea0: 22 50 6f 6f 6c 69 6e 67 20 6e 6f 74 20 70 72 65  "Pooling not pre
1eb0: 73 65 6e 74 20 69 6e 20 63 6f 6e 6e 65 63 74 69  sent in connecti
1ec0: 6f 6e 20 73 74 72 69 6e 67 22 29 3b 0d 0a 20 20  on string");..  
1ed0: 20 20 20 20 69 66 20 28 28 62 6f 6f 6c 29 76 61      if ((bool)va
1ee0: 6c 75 65 20 3d 3d 20 66 61 6c 73 65 29 20 74 68  lue == false) th
1ef0: 72 6f 77 20 6e 65 77 20 49 6e 63 6f 6e 63 6c 75  row new Inconclu
1f00: 73 69 76 65 45 78 63 65 70 74 69 6f 6e 28 22 50  siveException("P
1f10: 6f 6f 6c 69 6e 67 20 6e 6f 74 20 65 6e 61 62 6c  ooling not enabl
1f20: 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63  ed in the connec
1f30: 74 69 6f 6e 20 73 74 72 69 6e 67 22 29 3b 0d 0a  tion string");..
1f40: 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 73  ..      string s
1f50: 71 6c 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ql = String.Form
1f60: 61 74 28 22 43 52 45 41 54 45 20 7b 30 7d 20 54  at("CREATE {0} T
1f70: 41 42 4c 45 20 7b 31 7d 28 69 64 20 69 6e 74 20  ABLE {1}(id int 
1f80: 70 72 69 6d 61 72 79 20 6b 65 79 29 3b 22 2c 20  primary key);", 
1f90: 74 65 6d 70 2c 20 74 61 62 6c 65 29 3b 0d 0a 20  temp, table);.. 
1fa0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
1fb0: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
1fc0: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
1fd0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
1fe0: 20 20 20 20 2f 2f 20 43 72 65 61 74 65 20 61 20      // Create a 
1ff0: 74 65 6d 70 20 74 61 62 6c 65 20 69 6e 20 74 68  temp table in th
2000: 65 20 6d 61 69 6e 20 63 6f 6e 6e 65 63 74 69 6f  e main connectio
2010: 6e 20 73 6f 20 77 65 20 63 61 6e 20 63 6f 6e 66  n so we can conf
2020: 69 72 6d 20 6f 75 72 20 6e 65 77 20 63 6f 6e 6e  irm our new conn
2030: 65 63 74 69 6f 6e 73 20 61 72 65 20 75 73 69 6e  ections are usin
2040: 67 20 74 72 75 65 20 6e 65 77 20 63 6f 6e 6e 65  g true new conne
2050: 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
2060: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
2070: 3d 20 73 71 6c 3b 0d 0a 20 20 20 20 20 20 20 20  = sql;..        
2080: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
2090: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ery();..      }.
20a0: 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e  ...      for (in
20b0: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30 3b  t n = 0; n < 10;
20c0: 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a   n++)..      {..
20d0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
20e0: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63  bConnection newc
20f0: 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c  nn = ((ICloneabl
2100: 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20  e)_cnn).Clone() 
2110: 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29  as DbConnection)
2120: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
2130: 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e         if (newcn
2140: 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65  n.State != Conne
2150: 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29  ctionState.Open)
2160: 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d   newcnn.Open();.
2170: 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67  .          using
2180: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
2190: 3d 20 6e 65 77 63 6e 6e 2e 43 72 65 61 74 65 43  = newcnn.CreateC
21a0: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
21b0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
21c0: 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20 70 6f      // If the po
21d0: 6f 6c 20 69 73 20 70 72 6f 70 65 72 6c 79 20 69  ol is properly i
21e0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 6e 64 20 74  mplemented and t
21f0: 68 65 20 70 6f 6f 6c 65 64 20 63 6f 6e 6e 65 63  he pooled connec
2200: 74 69 6f 6e 20 70 72 6f 70 65 72 6c 79 20 64 65  tion properly de
2210: 73 74 72 6f 79 65 64 2c 20 74 68 69 73 20 63 6f  stroyed, this co
2220: 6d 6d 61 6e 64 20 77 69 6c 6c 20 73 75 63 63 65  mmand will succe
2230: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
2240: 20 2f 2f 20 49 66 20 74 68 65 20 6e 65 77 20 63   // If the new c
2250: 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 62  onnection was ob
2260: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
2270: 70 6f 6f 6c 20 65 76 65 6e 20 61 66 74 65 72 20  pool even after 
2280: 77 65 20 63 6c 65 61 72 65 64 20 69 74 2c 20 74  we cleared it, t
2290: 68 65 6e 20 74 68 69 73 20 74 61 62 6c 65 20 77  hen this table w
22a0: 69 6c 6c 20 61 6c 72 65 61 64 79 20 65 78 69 73  ill already exis
22b0: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  t..            /
22c0: 2f 20 61 6e 64 20 74 68 65 20 74 65 73 74 20 66  / and the test f
22d0: 61 69 6c 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ails...         
22e0: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
22f0: 78 74 20 3d 20 73 71 6c 3b 0d 0a 20 20 20 20 20  xt = sql;..     
2300: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
2310: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20  teNonQuery();.. 
2320: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2330: 20 20 20 20 20 20 2f 2f 20 54 72 79 20 61 6e 64        // Try and
2340: 20 63 6c 65 61 72 20 74 68 65 20 70 6f 6f 6c 20   clear the pool 
2350: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2360: 74 68 69 73 20 66 69 6c 65 0d 0a 20 20 20 20 20  this file..     
2370: 20 20 20 20 20 6e 65 77 63 6e 6e 2e 47 65 74 54       newcnn.GetT
2380: 79 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65 6d 62  ype().InvokeMemb
2390: 65 72 28 22 43 6c 65 61 72 50 6f 6f 6c 22 2c 20  er("ClearPool", 
23a0: 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
23b0: 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 53  n.BindingFlags.S
23c0: 74 61 74 69 63 20 7c 20 53 79 73 74 65 6d 2e 52  tatic | System.R
23d0: 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e  eflection.Bindin
23e0: 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d 65 74  gFlags.InvokeMet
23f0: 68 6f 64 20 7c 20 53 79 73 74 65 6d 2e 52 65 66  hod | System.Ref
2400: 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46  lection.BindingF
2410: 6c 61 67 73 2e 50 75 62 6c 69 63 2c 20 6e 75 6c  lags.Public, nul
2420: 6c 2c 20 6e 75 6c 6c 2c 20 6e 65 77 20 6f 62 6a  l, null, new obj
2430: 65 63 74 5b 5d 20 7b 20 6e 65 77 63 6e 6e 20 7d  ect[] { newcnn }
2440: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
2450: 2f 2f 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  // At this point
2460: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 6e 65 63   when the connec
2470: 74 69 6f 6e 20 69 73 20 64 65 73 74 72 6f 79 65  tion is destroye
2480: 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  d, it should not
2490: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
24a0: 74 68 65 20 70 6f 6f 6c 2c 20 62 75 74 20 69 6e  the pool, but in
24b0: 73 74 65 61 64 20 64 69 73 70 6f 73 65 64 2e 0d  stead disposed..
24c0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
24d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
24e0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
24f0: 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 74 65  .    /// This te
2500: 73 74 73 20 43 6c 65 61 72 41 6c 6c 50 6f 6f 6c  sts ClearAllPool
2510: 73 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  s() functionalit
2520: 79 2e 20 20 4d 61 6b 65 73 20 73 75 72 65 20 74  y.  Makes sure t
2530: 68 61 74 20 74 68 65 20 70 6f 6f 6c 20 69 73 20  hat the pool is 
2540: 77 6f 72 6b 69 6e 67 20 70 72 6f 70 65 72 6c 79  working properly
2550: 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20 70 72   and clearing pr
2560: 6f 70 65 72 6c 79 2e 0d 0a 20 20 20 20 2f 2f 2f  operly...    ///
2570: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
2580: 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20   [Test(Sequence 
2590: 3d 20 31 30 30 29 5d 0d 0a 20 20 20 20 69 6e 74  = 100)]..    int
25a0: 65 72 6e 61 6c 20 76 6f 69 64 20 43 6c 65 61 72  ernal void Clear
25b0: 41 6c 6c 50 6f 6f 6c 73 54 65 73 74 28 29 0d 0a  AllPoolsTest()..
25c0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 73 74 72      {..      str
25d0: 69 6e 67 20 74 61 62 6c 65 20 3d 20 22 63 6c 65  ing table = "cle
25e0: 61 72 70 6f 6f 6c 22 3b 0d 0a 20 20 20 20 20 20  arpool";..      
25f0: 73 74 72 69 6e 67 20 74 65 6d 70 20 3d 20 22 54  string temp = "T
2600: 45 4d 50 22 3b 0d 0a 20 20 20 20 20 20 73 74 72  EMP";..      str
2610: 69 6e 67 20 65 78 69 73 74 73 20 3d 20 22 20 49  ing exists = " I
2620: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 22 3b 0d  F NOT EXISTS ";.
2630: 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 5f 66 61  ...      if (_fa
2640: 63 74 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d  ct.GetType().Nam
2650: 65 2e 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74  e.IndexOf("SQLit
2660: 65 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  e", StringCompar
2670: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
2680: 72 65 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a  reCase) == -1)..
2690: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
26a0: 20 74 65 6d 70 20 3d 20 53 74 72 69 6e 67 2e 45   temp = String.E
26b0: 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20 20 20 65  mpty;..        e
26c0: 78 69 73 74 73 20 3d 20 53 74 72 69 6e 67 2e 45  xists = String.E
26d0: 6d 70 74 79 3b 0d 0a 20 20 20 20 20 20 20 20 74  mpty;..        t
26e0: 61 62 6c 65 20 3d 20 22 23 63 6c 65 61 72 70 6f  able = "#clearpo
26f0: 6f 6c 22 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ol";..      }...
2700: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61  .      object va
2710: 6c 75 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  lue;..      if (
2720: 5f 63 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47 65  _cnnstring.TryGe
2730: 74 56 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67 22  tValue("Pooling"
2740: 2c 20 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d 20  , out value) == 
2750: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
2760: 20 45 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c   Exception("Pool
2770: 69 6e 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20  ing not present 
2780: 69 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  in connection st
2790: 72 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 69  ring");..      i
27a0: 66 20 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20 3d  f ((bool)value =
27b0: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
27c0: 65 77 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45  ew InconclusiveE
27d0: 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e  xception("Poolin
27e0: 67 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69 6e  g not enabled in
27f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2800: 73 74 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20 20  string");....   
2810: 20 20 20 73 74 72 69 6e 67 20 73 71 6c 20 3d 20     string sql = 
2820: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 43  String.Format("C
2830: 52 45 41 54 45 20 7b 30 7d 20 54 41 42 4c 45 20  REATE {0} TABLE 
2840: 7b 32 7d 7b 31 7d 28 69 64 20 69 6e 74 20 70 72  {2}{1}(id int pr
2850: 69 6d 61 72 79 20 6b 65 79 29 3b 22 2c 20 74 65  imary key);", te
2860: 6d 70 2c 20 74 61 62 6c 65 2c 20 65 78 69 73 74  mp, table, exist
2870: 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 5f 63 6e  s);....      _cn
2880: 6e 2e 47 65 74 54 79 70 65 28 29 2e 49 6e 76 6f  n.GetType().Invo
2890: 6b 65 4d 65 6d 62 65 72 28 22 43 6c 65 61 72 41  keMember("ClearA
28a0: 6c 6c 50 6f 6f 6c 73 22 2c 20 53 79 73 74 65 6d  llPools", System
28b0: 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64  .Reflection.Bind
28c0: 69 6e 67 46 6c 61 67 73 2e 53 74 61 74 69 63 20  ingFlags.Static 
28d0: 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74  | System.Reflect
28e0: 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73  ion.BindingFlags
28f0: 2e 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 20 7c 20  .InvokeMethod | 
2900: 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
2910: 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 50  n.BindingFlags.P
2920: 75 62 6c 69 63 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  ublic, null, nul
2930: 6c 2c 20 6e 75 6c 6c 29 3b 0d 0a 0d 0a 20 20 20  l, null);....   
2940: 20 20 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5b     DbConnection[
2950: 5d 20 61 72 72 20 3d 20 6e 65 77 20 44 62 43 6f  ] arr = new DbCo
2960: 6e 6e 65 63 74 69 6f 6e 5b 31 30 5d 3b 0d 0a 0d  nnection[10];...
2970: 0a 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20  .      try..    
2980: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20    {..        // 
2990: 43 72 65 61 74 65 20 31 30 20 63 6f 6e 6e 65 63  Create 10 connec
29a0: 74 69 6f 6e 73 20 61 6e 64 20 63 72 65 61 74 65  tions and create
29b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
29c0: 73 20 6f 6e 20 74 68 65 6d 0d 0a 20 20 20 20 20  s on them..     
29d0: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
29e0: 30 3b 20 6e 20 3c 20 31 30 3b 20 6e 2b 2b 29 0d  0; n < 10; n++).
29f0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
2a00: 20 20 20 20 20 20 61 72 72 5b 6e 5d 20 3d 20 28        arr[n] = (
2a10: 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e 6e  (ICloneable)_cnn
2a20: 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62 43  ).Clone() as DbC
2a30: 6f 6e 6e 65 63 74 69 6f 6e 3b 0d 0a 20 20 20 20  onnection;..    
2a40: 20 20 20 20 20 20 69 66 20 28 61 72 72 5b 6e 5d        if (arr[n]
2a50: 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63  .State != Connec
2a60: 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20  tionState.Open) 
2a70: 61 72 72 5b 6e 5d 2e 4f 70 65 6e 28 29 3b 0d 0a  arr[n].Open();..
2a80: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e  ..          usin
2a90: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
2aa0: 20 3d 20 61 72 72 5b 6e 5d 2e 43 72 65 61 74 65   = arr[n].Create
2ab0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
2ac0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2ad0: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
2ae0: 54 65 78 74 20 3d 20 73 71 6c 3b 0d 0a 20 20 20  Text = sql;..   
2af0: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
2b00: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
2b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
2b20: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53  .CommandText = S
2b30: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 49 4e  tring.Format("IN
2b40: 53 45 52 54 20 49 4e 54 4f 20 7b 31 7d 20 28 69  SERT INTO {1} (i
2b50: 64 29 20 56 41 4c 55 45 53 28 7b 30 7d 29 22 2c  d) VALUES({0})",
2b60: 20 6e 2c 20 74 61 62 6c 65 29 3b 0d 0a 20 20 20   n, table);..   
2b70: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
2b80: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
2b90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
2ba0: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
2bb0: 20 28 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20   (n)..          
2bc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
2bd0: 61 73 65 20 32 3a 20 2f 2f 20 50 75 74 20 74 68  ase 2: // Put th
2be0: 69 73 20 6f 6e 65 20 62 61 63 6b 20 69 6e 74 6f  is one back into
2bf0: 20 74 68 65 20 70 6f 6f 6c 0d 0a 20 20 20 20 20   the pool..     
2c00: 20 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e           arr[n].
2c10: 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20  Dispose();..    
2c20: 20 20 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d            arr[n]
2c30: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
2c40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2c60: 20 34 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20   4:..           
2c70: 20 20 20 2f 2f 20 43 6c 65 61 72 20 61 6c 6c 20     // Clear all 
2c80: 74 68 65 20 70 6f 6f 6c 73 0d 0a 20 20 20 20 20  the pools..     
2c90: 20 20 20 20 20 20 20 20 20 5f 63 6e 6e 2e 47 65           _cnn.Ge
2ca0: 74 54 79 70 65 28 29 2e 49 6e 76 6f 6b 65 4d 65  tType().InvokeMe
2cb0: 6d 62 65 72 28 22 43 6c 65 61 72 41 6c 6c 50 6f  mber("ClearAllPo
2cc0: 6f 6c 73 22 2c 20 53 79 73 74 65 6d 2e 52 65 66  ols", System.Ref
2cd0: 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46  lection.BindingF
2ce0: 6c 61 67 73 2e 53 74 61 74 69 63 20 7c 20 53 79  lags.Static | Sy
2cf0: 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e  stem.Reflection.
2d00: 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 76  BindingFlags.Inv
2d10: 6f 6b 65 4d 65 74 68 6f 64 20 7c 20 53 79 73 74  okeMethod | Syst
2d20: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69  em.Reflection.Bi
2d30: 6e 64 69 6e 67 46 6c 61 67 73 2e 50 75 62 6c 69  ndingFlags.Publi
2d40: 63 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  c, null, null, n
2d50: 75 6c 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ull);..         
2d60: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
2d70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2d80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
2d90: 2f 20 4e 6f 77 20 63 6c 6f 73 65 20 61 6c 6c 20  / Now close all 
2da0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  the connections.
2db0: 20 20 4f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20    Only the last 
2dc0: 35 20 73 68 6f 75 6c 64 20 67 6f 20 69 6e 74 6f  5 should go into
2dd0: 20 74 68 65 20 70 6f 6f 6c 0d 0a 20 20 20 20 20   the pool..     
2de0: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
2df0: 30 3b 20 6e 20 3c 20 31 30 3b 20 6e 2b 2b 29 0d  0; n < 10; n++).
2e00: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
2e10: 20 20 20 20 20 20 69 66 20 28 61 72 72 5b 6e 5d        if (arr[n]
2e20: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
2e30: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
2e40: 20 20 20 20 61 72 72 5b 6e 5d 2e 44 69 73 70 6f      arr[n].Dispo
2e50: 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  se();..         
2e60: 20 20 20 61 72 72 5b 6e 5d 20 3d 20 6e 75 6c 6c     arr[n] = null
2e70: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
2e80: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2e90: 20 20 20 20 20 2f 2f 20 4f 70 65 6e 20 31 30 20       // Open 10 
2ea0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 54 68  connections.  Th
2eb0: 65 79 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  ey should either
2ec0: 20 68 61 76 65 20 61 20 63 6c 65 61 72 70 6f 6f   have a clearpoo
2ed0: 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  l containing an 
2ee0: 69 64 20 6f 66 20 35 20 6f 72 20 67 72 65 61 74  id of 5 or great
2ef0: 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  er,..        // 
2f00: 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  or should have n
2f10: 6f 20 63 6c 65 61 72 70 6f 6f 6c 20 74 61 62 6c  o clearpool tabl
2f20: 65 20 61 74 20 61 6c 6c 2e 0d 0a 20 20 20 20 20  e at all...     
2f30: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
2f40: 30 3b 20 6e 20 3c 20 31 30 3b 20 6e 2b 2b 29 0d  0; n < 10; n++).
2f50: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
2f60: 20 20 20 20 20 20 61 72 72 5b 6e 5d 20 3d 20 28        arr[n] = (
2f70: 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e 6e  (ICloneable)_cnn
2f80: 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62 43  ).Clone() as DbC
2f90: 6f 6e 6e 65 63 74 69 6f 6e 3b 0d 0a 20 20 20 20  onnection;..    
2fa0: 20 20 20 20 20 20 69 66 20 28 61 72 72 5b 6e 5d        if (arr[n]
2fb0: 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63  .State != Connec
2fc0: 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20  tionState.Open) 
2fd0: 61 72 72 5b 6e 5d 2e 4f 70 65 6e 28 29 3b 0d 0a  arr[n].Open();..
2fe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e  ..          usin
2ff0: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
3000: 20 3d 20 61 72 72 5b 6e 5d 2e 43 72 65 61 74 65   = arr[n].Create
3010: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
3020: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3030: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
3040: 54 65 78 74 20 3d 20 73 71 6c 3b 0d 0a 20 20 20  Text = sql;..   
3050: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65           cmd.Exe
3060: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
3070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
3080: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53  .CommandText = S
3090: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 53 45  tring.Format("SE
30a0: 4c 45 43 54 20 5b 69 64 5d 20 46 52 4f 4d 20 7b  LECT [id] FROM {
30b0: 30 7d 22 2c 20 74 61 62 6c 65 29 3b 0d 0a 20 20  0}", table);..  
30c0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
30d0: 20 6f 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65   o = cmd.Execute
30e0: 53 63 61 6c 61 72 28 29 3b 0d 0a 0d 0a 20 20 20  Scalar();....   
30f0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 20 3d           if (o =
3100: 3d 20 6e 75 6c 6c 20 7c 7c 20 6f 20 3d 3d 20 44  = null || o == D
3110: 42 4e 75 6c 6c 2e 56 61 6c 75 65 29 0d 0a 20 20  BNull.Value)..  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
3130: 69 6e 75 65 3b 20 2f 2f 20 4e 6f 20 64 61 74 61  inue; // No data
3140: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 74   in the table at
3150: 20 61 6c 6c 2c 20 77 68 69 63 68 20 6d 65 61 6e   all, which mean
3160: 73 20 77 65 20 6d 75 73 74 27 76 65 20 6a 75 73  s we must've jus
3170: 74 20 63 72 65 61 74 65 64 20 69 74 20 2d 2d 20  t created it -- 
3180: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 6e 27  connection wasn'
3190: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 6f  t part of the po
31a0: 6f 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ol....          
31b0: 20 20 69 66 20 28 43 6f 6e 76 65 72 74 2e 54 6f    if (Convert.To
31c0: 49 6e 74 33 32 28 6f 29 20 3c 20 35 29 0d 0a 20  Int32(o) < 5).. 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
31e0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
31f0: 28 22 55 6e 65 78 70 65 63 74 65 64 20 64 61 74  ("Unexpected dat
3200: 61 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  a returned from 
3210: 74 61 62 6c 65 21 22 29 3b 0d 0a 20 20 20 20 20  table!");..     
3220: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3230: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  }....        // 
3240: 43 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 70 6f  Clear all the po
3250: 6f 6c 73 0d 0a 20 20 20 20 20 20 20 20 5f 63 6e  ols..        _cn
3260: 6e 2e 47 65 74 54 79 70 65 28 29 2e 49 6e 76 6f  n.GetType().Invo
3270: 6b 65 4d 65 6d 62 65 72 28 22 43 6c 65 61 72 41  keMember("ClearA
3280: 6c 6c 50 6f 6f 6c 73 22 2c 20 53 79 73 74 65 6d  llPools", System
3290: 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64  .Reflection.Bind
32a0: 69 6e 67 46 6c 61 67 73 2e 53 74 61 74 69 63 20  ingFlags.Static 
32b0: 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74  | System.Reflect
32c0: 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73  ion.BindingFlags
32d0: 2e 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 20 7c 20  .InvokeMethod | 
32e0: 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
32f0: 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 50  n.BindingFlags.P
3300: 75 62 6c 69 63 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  ublic, null, nul
3310: 6c 2c 20 6e 75 6c 6c 29 3b 0d 0a 0d 0a 20 20 20  l, null);....   
3320: 20 20 20 7d 0d 0a 20 20 20 20 20 20 66 69 6e 61     }..      fina
3330: 6c 6c 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  lly..      {..  
3340: 20 20 20 20 20 20 2f 2f 20 43 6c 6f 73 65 20 61        // Close a
3350: 6c 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ll the connectio
3360: 6e 73 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ns..        for 
3370: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
3380: 31 30 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20  10; n++)..      
3390: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69    {..          i
33a0: 66 20 28 61 72 72 5b 6e 5d 20 21 3d 20 6e 75 6c  f (arr[n] != nul
33b0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  l)..          {.
33c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72 72  .            arr
33d0: 5b 6e 5d 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a  [n].Dispose();..
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 72 5b              arr[
33f0: 6e 5d 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  n] = null;..    
3400: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3410: 20 7d 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 43   }..        // C
3420: 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 70 6f 6f  lear all the poo
3430: 6c 73 0d 0a 20 20 20 20 20 20 20 20 5f 63 6e 6e  ls..        _cnn
3440: 2e 47 65 74 54 79 70 65 28 29 2e 49 6e 76 6f 6b  .GetType().Invok
3450: 65 4d 65 6d 62 65 72 28 22 43 6c 65 61 72 41 6c  eMember("ClearAl
3460: 6c 50 6f 6f 6c 73 22 2c 20 53 79 73 74 65 6d 2e  lPools", System.
3470: 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
3480: 6e 67 46 6c 61 67 73 2e 53 74 61 74 69 63 20 7c  ngFlags.Static |
3490: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
34a0: 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e  on.BindingFlags.
34b0: 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 20 7c 20 53  InvokeMethod | S
34c0: 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
34d0: 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 50 75  .BindingFlags.Pu
34e0: 62 6c 69 63 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  blic, null, null
34f0: 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20 20 20  , null);..      
3500: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
3510: 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d  [Test(Sequence =
3520: 20 35 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72   50)]..    inter
3530: 6e 61 6c 20 76 6f 69 64 20 43 6f 65 72 73 69 6f  nal void Coersio
3540: 6e 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a  nTest()..    {..
3550: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
3560: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
3570: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
3580: 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
3590: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
35a0: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 46  Text = "SELECT F
35b0: 69 65 6c 64 31 2c 20 46 69 65 6c 64 32 2c 20 5b  ield1, Field2, [
35c0: 46 69 c3 ab 6c 64 33 5d 2c 20 5b 46 69 c3 a6 6c  Fi..ld3], [Fi..l
35d0: 64 34 5d 2c 20 46 69 65 6c 64 35 2c 20 27 41 27  d4], Field5, 'A'
35e0: 2c 20 31 2c 20 31 20 2b 20 31 2c 20 33 2e 31 34  , 1, 1 + 1, 3.14
35f0: 31 35 39 20 46 52 4f 4d 20 54 65 73 74 43 61 73  159 FROM TestCas
3600: 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69  e";..        usi
3610: 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72  ng (DbDataReader
3620: 20 72 64 20 3d 20 63 6d 64 2e 45 78 65 63 75 74   rd = cmd.Execut
3630: 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20  eReader())..    
3640: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3650: 20 69 66 20 28 72 64 2e 52 65 61 64 28 29 29 0d   if (rd.Read()).
3660: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
3670: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
3680: 20 46 69 65 6c 64 31 20 3d 20 72 64 2e 47 65 74   Field1 = rd.Get
3690: 49 6e 74 33 32 28 30 29 3b 0d 0a 20 20 20 20 20  Int32(0);..     
36a0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 46 69         object Fi
36b0: 65 6c 64 32 20 3d 20 72 64 2e 47 65 74 44 6f 75  eld2 = rd.GetDou
36c0: 62 6c 65 28 31 29 3b 0d 0a 20 20 20 20 20 20 20  ble(1);..       
36d0: 20 20 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c       object Fiel
36e0: 64 33 20 3d 20 72 64 2e 47 65 74 53 74 72 69 6e  d3 = rd.GetStrin
36f0: 67 28 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  g(2);..         
3700: 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c 64 34     object Field4
3710: 20 3d 20 72 64 2e 47 65 74 53 74 72 69 6e 67 28   = rd.GetString(
3720: 33 29 2e 54 72 69 6d 45 6e 64 28 29 3b 0d 0a 20  3).TrimEnd();.. 
3730: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
3740: 74 20 46 69 65 6c 64 35 20 3d 20 72 64 2e 47 65  t Field5 = rd.Ge
3750: 74 44 61 74 65 54 69 6d 65 28 34 29 3b 0d 0a 0d  tDateTime(4);...
3760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3770: 54 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  The next stateme
3780: 6e 74 20 73 68 6f 75 6c 64 20 63 61 75 73 65 20  nt should cause 
3790: 61 6e 20 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20  an exception..  
37a0: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
37b0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c              Fiel
37d0: 64 31 20 3d 20 72 64 2e 47 65 74 53 74 72 69 6e  d1 = rd.GetStrin
37e0: 67 28 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  g(0);..         
37f0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
3800: 78 63 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64  xception("Should
3810: 20 68 61 76 65 20 66 61 69 6c 65 64 20 74 79 70   have failed typ
3820: 65 20 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a  e checking!");..
3830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3840: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
3850: 20 28 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63   (InvalidCastExc
3860: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
3870: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3880: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3890: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
38a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
38b0: 20 20 20 20 20 20 20 46 69 65 6c 64 32 20 3d 20         Field2 = 
38c0: 72 64 2e 47 65 74 53 74 72 69 6e 67 28 31 29 3b  rd.GetString(1);
38d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
38e0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
38f0: 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65  ion("Should have
3900: 20 66 61 69 6c 65 64 20 74 79 70 65 20 63 68 65   failed type che
3910: 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20  cking!");..     
3920: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3930: 20 20 20 20 20 20 63 61 74 63 68 20 28 49 6e 76        catch (Inv
3940: 61 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f  alidCastExceptio
3950: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
3960: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  {..            }
3970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ..            Fi
3980: 65 6c 64 33 20 3d 20 72 64 2e 47 65 74 53 74 72  eld3 = rd.GetStr
3990: 69 6e 67 28 32 29 3b 0d 0a 20 20 20 20 20 20 20  ing(2);..       
39a0: 20 20 20 20 20 46 69 65 6c 64 34 20 3d 20 72 64       Field4 = rd
39b0: 2e 47 65 74 53 74 72 69 6e 67 28 33 29 3b 0d 0a  .GetString(3);..
39c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ..            Fi
39d0: 65 6c 64 31 20 3d 20 72 64 2e 47 65 74 49 6e 74  eld1 = rd.GetInt
39e0: 33 32 28 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  32(0);....      
39f0: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
3a00: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3a10: 20 20 20 20 20 20 20 20 46 69 65 6c 64 32 20 3d          Field2 =
3a20: 20 72 64 2e 47 65 74 49 6e 74 33 32 28 31 29 3b   rd.GetInt32(1);
3a30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3a40: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
3a50: 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61 76 65  ion("Should have
3a60: 20 66 61 69 6c 65 64 20 74 79 70 65 20 63 68 65   failed type che
3a70: 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20 20 20  cking!");..     
3a80: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3a90: 20 20 20 20 20 20 63 61 74 63 68 20 28 49 6e 76        catch (Inv
3aa0: 61 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f  alidCastExceptio
3ab0: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
3ac0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  {..            }
3ad0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3ae0: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
3af0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3b00: 20 20 46 69 65 6c 64 33 20 3d 20 72 64 2e 47 65    Field3 = rd.Ge
3b10: 74 49 6e 74 33 32 28 32 29 3b 0d 0a 20 20 20 20  tInt32(2);..    
3b20: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
3b30: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53  new Exception("S
3b40: 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65  hould have faile
3b50: 64 20 74 79 70 65 20 63 68 65 63 6b 69 6e 67 21  d type checking!
3b60: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
3b70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
3b80: 63 61 74 63 68 20 28 49 6e 76 61 6c 69 64 43 61  catch (InvalidCa
3b90: 73 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20  stException)..  
3ba0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3bb0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
3bc0: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c              Fiel
3bf0: 64 34 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32  d4 = rd.GetInt32
3c00: 28 33 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  (3);..          
3c10: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78      throw new Ex
3c20: 63 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64 20  ception("Should 
3c30: 68 61 76 65 20 66 61 69 6c 65 64 20 74 79 70 65  have failed type
3c40: 20 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a 20   checking!");.. 
3c50: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3c60: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
3c70: 28 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65  (InvalidCastExce
3c80: 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ption)..        
3c90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3ca0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3cb0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
3cc0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3cd0: 20 20 20 20 46 69 65 6c 64 35 20 3d 20 72 64 2e      Field5 = rd.
3ce0: 47 65 74 49 6e 74 33 32 28 34 29 3b 0d 0a 20 20  GetInt32(4);..  
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
3d00: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
3d10: 22 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69  "Should have fai
3d20: 6c 65 64 20 74 79 70 65 20 63 68 65 63 6b 69 6e  led type checkin
3d30: 67 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  g!");..         
3d40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3d50: 20 20 63 61 74 63 68 20 28 49 6e 76 61 6c 69 64    catch (Invalid
3d60: 43 61 73 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a  CastException)..
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3d80: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
3da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 69                Fi
3dc0: 65 6c 64 33 20 3d 20 72 64 2e 47 65 74 44 65 63  eld3 = rd.GetDec
3dd0: 69 6d 61 6c 28 32 29 3b 0d 0a 20 20 20 20 20 20  imal(2);..      
3de0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
3df0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53 68 6f  w Exception("Sho
3e00: 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65 64 20  uld have failed 
3e10: 74 79 70 65 20 63 68 65 63 6b 69 6e 67 21 22 29  type checking!")
3e20: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
3e30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
3e40: 74 63 68 20 28 49 6e 76 61 6c 69 64 43 61 73 74  tch (InvalidCast
3e50: 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20  Exception)..    
3e60: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3e70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3e80: 20 20 20 20 20 20 63 61 74 63 68 20 28 46 6f 72        catch (For
3e90: 6d 61 74 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20  matException).. 
3ea0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3eb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3ec0: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
3ed0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c 64             Field
3ef0: 34 20 3d 20 72 64 2e 47 65 74 44 65 63 69 6d 61  4 = rd.GetDecima
3f00: 6c 28 33 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  l(3);..         
3f10: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
3f20: 78 63 65 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64  xception("Should
3f30: 20 68 61 76 65 20 66 61 69 6c 65 64 20 74 79 70   have failed typ
3f40: 65 20 63 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a  e checking!");..
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3f60: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
3f70: 20 28 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63   (InvalidCastExc
3f80: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
3f90: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3fa0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3fb0: 20 20 20 63 61 74 63 68 20 28 46 6f 72 6d 61 74     catch (Format
3fc0: 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20  Exception)..    
3fd0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3fe0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3ff0: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
4000: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
4010: 20 20 20 20 20 20 20 20 46 69 65 6c 64 35 20 3d          Field5 =
4020: 20 72 64 2e 47 65 74 44 65 63 69 6d 61 6c 28 34   rd.GetDecimal(4
4030: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
4040: 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65    throw new Exce
4050: 70 74 69 6f 6e 28 22 53 68 6f 75 6c 64 20 68 61  ption("Should ha
4060: 76 65 20 66 61 69 6c 65 64 20 74 79 70 65 20 63  ve failed type c
4070: 68 65 63 6b 69 6e 67 21 22 29 3b 0d 0a 20 20 20  hecking!");..   
4080: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4090: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 49          catch (I
40a0: 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65 70 74  nvalidCastExcept
40b0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ion)..          
40c0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
40d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
40e0: 63 61 74 63 68 20 28 46 6f 72 6d 61 74 45 78 63  catch (FormatExc
40f0: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
4100: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4110: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4120: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c   }..          el
4130: 73 65 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  se throw new Exc
4140: 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61 74 61 20  eption("No data 
4150: 69 6e 20 74 61 62 6c 65 22 29 3b 0d 0a 20 20 20  in table");..   
4160: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
4170: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54  .    }....    [T
4180: 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20 31  est(Sequence = 1
4190: 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  0)]..    interna
41a0: 6c 20 76 6f 69 64 20 43 72 65 61 74 65 54 61 62  l void CreateTab
41b0: 6c 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  le()..    {..   
41c0: 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64     droptables.Ad
41d0: 64 28 22 54 65 73 74 43 61 73 65 22 29 3b 0d 0a  d("TestCase");..
41e0: 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
41f0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
4200: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
4210: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
4220: 20 20 20 20 20 20 20 69 66 20 28 5f 66 61 63 74         if (_fact
4230: 2e 47 65 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e  .GetType().Name.
4240: 49 6e 64 65 78 4f 66 28 22 53 51 4c 69 74 65 22  IndexOf("SQLite"
4250: 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73  , StringComparis
4260: 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65  on.OrdinalIgnore
4270: 43 61 73 65 29 20 3d 3d 20 2d 31 29 0d 0a 20 20  Case) == -1)..  
4280: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
4290: 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41 54  andText = "CREAT
42a0: 45 20 54 41 42 4c 45 20 54 65 73 74 43 61 73 65  E TABLE TestCase
42b0: 20 28 49 44 20 62 69 67 69 6e 74 20 70 72 69 6d   (ID bigint prim
42c0: 61 72 79 20 6b 65 79 20 69 64 65 6e 74 69 74 79  ary key identity
42d0: 2c 20 46 69 65 6c 64 31 20 69 6e 74 65 67 65 72  , Field1 integer
42e0: 2c 20 46 69 65 6c 64 32 20 46 6c 6f 61 74 2c 20  , Field2 Float, 
42f0: 5b 46 69 c3 ab 6c 64 33 5d 20 56 41 52 43 48 41  [Fi..ld3] VARCHA
4300: 52 28 35 30 29 2c 20 5b 46 69 c3 a6 6c 64 34 5d  R(50), [Fi..ld4]
4310: 20 43 48 41 52 28 31 30 29 2c 20 46 69 65 6c 64   CHAR(10), Field
4320: 35 20 44 61 74 65 54 69 6d 65 2c 20 46 69 65 6c  5 DateTime, Fiel
4330: 64 36 20 49 6d 61 67 65 29 22 3b 0d 0a 20 20 20  d6 Image)";..   
4340: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
4350: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
4360: 54 65 78 74 20 3d 20 22 43 52 45 41 54 45 20 54  Text = "CREATE T
4370: 41 42 4c 45 20 54 65 73 74 43 61 73 65 20 28 49  ABLE TestCase (I
4380: 44 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72  D integer primar
4390: 79 20 6b 65 79 20 61 75 74 6f 69 6e 63 72 65 6d  y key autoincrem
43a0: 65 6e 74 2c 20 46 69 65 6c 64 31 20 69 6e 74 2c  ent, Field1 int,
43b0: 20 46 69 65 6c 64 32 20 46 6c 6f 61 74 2c 20 5b   Field2 Float, [
43c0: 46 69 c3 ab 6c 64 33 5d 20 56 41 52 43 48 41 52  Fi..ld3] VARCHAR
43d0: 28 35 30 29 2c 20 5b 46 69 c3 a6 6c 64 34 5d 20  (50), [Fi..ld4] 
43e0: 43 48 41 52 28 31 30 29 2c 20 46 69 65 6c 64 35  CHAR(10), Field5
43f0: 20 44 61 74 65 54 69 6d 65 2c 20 46 69 65 6c 64   DateTime, Field
4400: 36 20 49 6d 61 67 65 29 22 3b 0d 0a 0d 0a 20 20  6 Image)";....  
4410: 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74        cmd.Execut
4420: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20  eNonQuery();..  
4430: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
4440: 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e      [Test(Sequen
4450: 63 65 20 3d 20 31 31 30 30 29 5d 0d 0a 20 20 20  ce = 1100)]..   
4460: 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e 67   internal string
4470: 20 44 61 74 61 41 64 61 70 74 65 72 54 65 73 74   DataAdapterTest
4480: 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
4490: 20 72 65 74 75 72 6e 20 44 61 74 61 41 64 61 70   return DataAdap
44a0: 74 65 72 28 66 61 6c 73 65 29 3b 0d 0a 20 20 20  ter(false);..   
44b0: 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28   }....    [Test(
44c0: 53 65 71 75 65 6e 63 65 20 3d 20 31 32 30 30 29  Sequence = 1200)
44d0: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
44e0: 73 74 72 69 6e 67 20 44 61 74 61 41 64 61 70 74  string DataAdapt
44f0: 65 72 57 69 74 68 49 64 65 6e 74 69 74 79 46 65  erWithIdentityFe
4500: 74 63 68 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  tch()..    {..  
4510: 20 20 20 20 72 65 74 75 72 6e 20 44 61 74 61 41      return DataA
4520: 64 61 70 74 65 72 28 74 72 75 65 29 3b 0d 0a 20  dapter(true);.. 
4530: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
4540: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
4550: 2f 2f 20 55 74 69 6c 69 7a 65 73 20 74 68 65 20  // Utilizes the 
4560: 53 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 42 75 69  SQLiteCommandBui
4570: 6c 64 65 72 2c 20 0d 0a 20 20 20 20 2f 2f 2f 20  lder, ..    /// 
4580: 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 75 74  which in turn ut
4590: 69 6c 69 7a 65 73 20 53 51 4c 69 74 65 44 61 74  ilizes SQLiteDat
45a0: 61 52 65 61 64 65 72 27 73 20 47 65 74 53 63 68  aReader's GetSch
45b0: 65 6d 61 54 61 62 6c 65 28 29 20 66 75 6e 63 74  emaTable() funct
45c0: 69 6f 6e 61 6c 69 74 79 0d 0a 20 20 20 20 2f 2f  ionality..    //
45d0: 2f 20 54 68 69 73 20 69 6e 73 65 72 74 20 69 73  / This insert is
45e0: 20 73 6c 6f 77 20 62 65 63 61 75 73 65 20 69 74   slow because it
45f0: 20 6d 75 73 74 20 72 61 69 73 65 20 63 61 6c 6c   must raise call
4600: 62 61 63 6b 73 20 62 65 66 6f 72 65 20 61 6e 64  backs before and
4610: 20 61 66 74 65 72 20 65 76 65 72 79 20 75 70 64   after every upd
4620: 61 74 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 46 6f  ate...    /// Fo
4630: 72 20 61 20 66 61 73 74 20 75 70 64 61 74 65 2c  r a fast update,
4640: 20 73 65 65 20 74 68 65 20 46 61 73 74 49 6e 73   see the FastIns
4650: 65 72 74 4d 61 6e 79 20 66 75 6e 63 74 69 6f 6e  ertMany function
4660: 20 62 65 6e 65 61 74 68 20 74 68 69 73 20 6f 6e   beneath this on
4670: 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  e..    /// </sum
4680: 6d 61 72 79 3e 0d 0a 20 20 20 20 69 6e 74 65 72  mary>..    inter
4690: 6e 61 6c 20 73 74 72 69 6e 67 20 44 61 74 61 41  nal string DataA
46a0: 64 61 70 74 65 72 28 62 6f 6f 6c 20 62 57 69 74  dapter(bool bWit
46b0: 68 49 64 65 6e 74 69 74 79 29 0d 0a 20 20 20 20  hIdentity)..    
46c0: 7b 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67 42  {..      StringB
46d0: 75 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20 3d  uilder builder =
46e0: 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c 64   new StringBuild
46f0: 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75  er();....      u
4700: 73 69 6e 67 20 28 44 62 54 72 61 6e 73 61 63 74  sing (DbTransact
4710: 69 6f 6e 20 64 62 54 72 61 6e 73 20 3d 20 5f 63  ion dbTrans = _c
4720: 6e 6e 2e 42 65 67 69 6e 54 72 61 6e 73 61 63 74  nn.BeginTransact
4730: 69 6f 6e 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d  ion())..      {.
4740: 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28  .        using (
4750: 44 62 44 61 74 61 41 64 61 70 74 65 72 20 61 64  DbDataAdapter ad
4760: 70 20 3d 20 5f 66 61 63 74 2e 43 72 65 61 74 65  p = _fact.Create
4770: 44 61 74 61 41 64 61 70 74 65 72 28 29 29 0d 0a  DataAdapter())..
4780: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
4790: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
47a0: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
47b0: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
47c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
47e0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 64 62  Transaction = db
47f0: 54 72 61 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20  Trans;..        
4800: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
4810: 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20  ext = "SELECT * 
4820: 46 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57 48  FROM TestCase WH
4830: 45 52 45 20 31 20 3d 20 32 22 3b 0d 0a 20 20 20  ERE 1 = 2";..   
4840: 20 20 20 20 20 20 20 20 20 61 64 70 2e 53 65 6c           adp.Sel
4850: 65 63 74 43 6f 6d 6d 61 6e 64 20 3d 20 63 6d 64  ectCommand = cmd
4860: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
4870: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
4880: 64 42 75 69 6c 64 65 72 20 62 6c 64 20 3d 20 5f  dBuilder bld = _
4890: 66 61 63 74 2e 43 72 65 61 74 65 43 6f 6d 6d 61  fact.CreateComma
48a0: 6e 64 42 75 69 6c 64 65 72 28 29 29 0d 0a 20 20  ndBuilder())..  
48b0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
48c0: 20 20 20 20 20 20 20 20 20 20 20 62 6c 64 2e 44             bld.D
48d0: 61 74 61 41 64 61 70 74 65 72 20 3d 20 61 64 70  ataAdapter = adp
48e0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
48f0: 20 75 73 69 6e 67 20 28 61 64 70 2e 49 6e 73 65   using (adp.Inse
4900: 72 74 43 6f 6d 6d 61 6e 64 20 3d 20 28 44 62 43  rtCommand = (DbC
4910: 6f 6d 6d 61 6e 64 29 28 28 49 43 6c 6f 6e 65 61  ommand)((IClonea
4920: 62 6c 65 29 62 6c 64 2e 47 65 74 49 6e 73 65 72  ble)bld.GetInser
4930: 74 43 6f 6d 6d 61 6e 64 28 29 29 2e 43 6c 6f 6e  tCommand()).Clon
4940: 65 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  e())..          
4950: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4960: 20 20 20 20 20 20 20 69 66 20 28 62 57 69 74 68         if (bWith
4970: 49 64 65 6e 74 69 74 79 29 0d 0a 20 20 20 20 20  Identity)..     
4980: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70  if (_fact.GetTyp
49b0: 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66  e().Name.IndexOf
49c0: 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e  ("SQLite", Strin
49d0: 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69  gComparison.Ordi
49e0: 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d  nalIgnoreCase) =
49f0: 3d 20 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 20  = -1)..         
4a00: 20 20 20 20 20 20 20 20 20 20 20 61 64 70 2e 49             adp.I
4a10: 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 2e 43 6f 6d  nsertCommand.Com
4a20: 6d 61 6e 64 54 65 78 74 20 2b 3d 20 22 3b 53 45  mandText += ";SE
4a30: 4c 45 43 54 20 53 43 4f 50 45 5f 49 44 45 4e 54  LECT SCOPE_IDENT
4a40: 49 54 59 28 29 20 41 53 20 5b 49 44 5d 22 3b 0d  ITY() AS [ID]";.
4a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a60: 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 70               adp
4a80: 2e 49 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 2e 43  .InsertCommand.C
4a90: 6f 6d 6d 61 6e 64 54 65 78 74 20 2b 3d 20 22 3b  ommandText += ";
4aa0: 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65  SELECT last_inse
4ab0: 72 74 5f 72 6f 77 69 64 28 29 20 41 53 20 5b 49  rt_rowid() AS [I
4ac0: 44 5d 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  D]";..          
4ad0: 20 20 20 20 20 20 20 20 61 64 70 2e 49 6e 73 65          adp.Inse
4ae0: 72 74 43 6f 6d 6d 61 6e 64 2e 55 70 64 61 74 65  rtCommand.Update
4af0: 64 52 6f 77 53 6f 75 72 63 65 20 3d 20 55 70 64  dRowSource = Upd
4b00: 61 74 65 52 6f 77 53 6f 75 72 63 65 2e 46 69 72  ateRowSource.Fir
4b10: 73 74 52 65 74 75 72 6e 65 64 52 65 63 6f 72 64  stReturnedRecord
4b20: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
4b30: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4b40: 20 20 20 20 20 20 62 6c 64 2e 44 61 74 61 41 64        bld.DataAd
4b50: 61 70 74 65 72 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d  apter = null;...
4b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b70: 20 75 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c   using (DataTabl
4b80: 65 20 74 62 6c 20 3d 20 6e 65 77 20 44 61 74 61  e tbl = new Data
4b90: 54 61 62 6c 65 28 29 29 0d 0a 20 20 20 20 20 20  Table())..      
4ba0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
4bc0: 64 70 2e 46 69 6c 6c 28 74 62 6c 29 3b 0d 0a 20  dp.Fill(tbl);.. 
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
4bf0: 20 6e 20 3c 20 31 30 30 30 30 3b 20 6e 2b 2b 29   n < 10000; n++)
4c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4c10: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4c20: 20 20 20 20 20 20 20 20 20 20 20 44 61 74 61 52             DataR
4c30: 6f 77 20 72 6f 77 20 3d 20 74 62 6c 2e 4e 65 77  ow row = tbl.New
4c40: 52 6f 77 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  Row();..        
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b              row[
4c60: 31 5d 20 3d 20 6e 20 2b 20 28 35 30 30 30 30 20  1] = n + (50000 
4c70: 2a 20 28 28 62 57 69 74 68 49 64 65 6e 74 69 74  * ((bWithIdentit
4c80: 79 20 3d 3d 20 74 72 75 65 29 20 3f 20 32 20 3a  y == true) ? 2 :
4c90: 20 31 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20   1));..         
4ca0: 20 20 20 20 20 20 20 20 20 20 20 74 62 6c 2e 52             tbl.R
4cb0: 6f 77 73 2e 41 64 64 28 72 6f 77 29 3b 0d 0a 20  ows.Add(row);.. 
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
4ce0: 20 20 20 20 20 20 20 20 2f 2f 43 6f 6e 73 6f 6c          //Consol
4cf0: 65 2e 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69  e.WriteLine(Stri
4d00: 6e 67 2e 46 6f 72 6d 61 74 28 22 20 20 20 20 20  ng.Format("     
4d10: 20 20 20 20 20 49 6e 73 65 72 74 69 6e 67 20 75       Inserting u
4d20: 73 69 6e 67 20 43 6f 6d 6d 61 6e 64 42 75 69 6c  sing CommandBuil
4d30: 64 65 72 20 61 6e 64 20 44 61 74 61 41 64 61 70  der and DataAdap
4d40: 74 65 72 5c 72 5c 6e 20 20 20 20 20 20 20 20 20  ter\r\n         
4d50: 20 2d 3e 7b 30 7d 20 28 31 30 2c 30 30 30 20 72   ->{0} (10,000 r
4d60: 6f 77 73 29 20 2e 2e 2e 22 2c 20 28 62 57 69 74  ows) ...", (bWit
4d70: 68 49 64 65 6e 74 69 74 79 20 3d 3d 20 74 72 75  hIdentity == tru
4d80: 65 29 20 3f 20 22 28 77 69 74 68 20 69 64 65 6e  e) ? "(with iden
4d90: 74 69 74 79 20 66 65 74 63 68 29 22 20 3a 20 22  tity fetch)" : "
4da0: 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  "));..          
4db0: 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 53 74          int dtSt
4dc0: 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  art = Environmen
4dd0: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 61 64 70 2e 55 70 64 61 74 65 28 74 62 6c 29 3b  adp.Update(tbl);
4e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4e10: 20 20 20 20 69 6e 74 20 64 74 45 6e 64 20 3d 20      int dtEnd = 
4e20: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
4e30: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
4e40: 20 20 20 20 20 20 20 20 20 20 64 74 45 6e 64 20            dtEnd 
4e50: 2d 3d 20 64 74 53 74 61 72 74 3b 0d 0a 20 20 20  -= dtStart;..   
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
4e70: 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 46 6f 72  uilder.AppendFor
4e80: 6d 61 74 28 22 49 6e 73 65 72 74 20 45 6e 64 73  mat("Insert Ends
4e90: 20 69 6e 20 7b 30 7d 20 6d 73 20 2e 2e 2e 20 22   in {0} ms ... "
4ea0: 2c 20 28 64 74 45 6e 64 29 29 3b 0d 0a 0d 0a 20  , (dtEnd));.... 
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72   dtStart = Envir
4ed0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
4ee0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
4ef0: 20 20 20 20 20 64 62 54 72 61 6e 73 2e 43 6f 6d       dbTrans.Com
4f00: 6d 69 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  mit();..        
4f10: 20 20 20 20 20 20 20 20 20 20 64 74 45 6e 64 20            dtEnd 
4f20: 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
4f30: 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20  ckCount;..      
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 64 74 45 6e              dtEn
4f50: 64 20 2d 3d 20 64 74 53 74 61 72 74 3b 0d 0a 20  d -= dtStart;.. 
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 46   builder.AppendF
4f80: 6f 72 6d 61 74 28 22 43 6f 6d 6d 69 74 73 20 69  ormat("Commits i
4f90: 6e 20 7b 30 7d 20 6d 73 22 2c 20 28 64 74 45 6e  n {0} ms", (dtEn
4fa0: 64 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d));....        
4fb0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 57            if (bW
4fc0: 69 74 68 49 64 65 6e 74 69 74 79 29 0d 0a 20 20  ithIdentity)..  
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4ff0: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 61         using (Da
5000: 74 61 54 61 62 6c 65 20 74 62 6c 32 20 3d 20 6e  taTable tbl2 = n
5010: 65 77 20 44 61 74 61 54 61 62 6c 65 28 29 29 0d  ew DataTable()).
5020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5030: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
5050: 70 2e 53 65 6c 65 63 74 43 6f 6d 6d 61 6e 64 2e  p.SelectCommand.
5060: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
5070: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 54 65 73  ELECT * FROM Tes
5080: 74 43 61 73 65 20 57 48 45 52 45 20 46 69 65 6c  tCase WHERE Fiel
5090: 64 31 20 42 45 54 57 45 45 4e 20 31 30 30 30 30  d1 BETWEEN 10000
50a0: 30 20 41 4e 44 20 31 39 39 39 39 39 20 4f 52 44  0 AND 199999 ORD
50b0: 45 52 20 42 59 20 46 69 65 6c 64 31 22 3b 0d 0a  ER BY Field1";..
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 20 20 20 20 20 20 61 64 70 2e 46 69 6c 6c 28 74        adp.Fill(t
50e0: 62 6c 32 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  bl2);....       
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5100: 66 20 28 74 62 6c 32 2e 52 6f 77 73 2e 43 6f 75  f (tbl2.Rows.Cou
5110: 6e 74 20 21 3d 20 74 62 6c 2e 52 6f 77 73 2e 43  nt != tbl.Rows.C
5120: 6f 75 6e 74 29 20 74 68 72 6f 77 20 6e 65 77 20  ount) throw new 
5130: 45 78 63 65 70 74 69 6f 6e 28 22 53 65 6c 65 63  Exception("Selec
5140: 74 65 64 20 64 61 74 61 20 64 6f 65 73 6e 27 74  ted data doesn't
5150: 20 6d 61 74 63 68 20 75 70 64 61 74 65 64 20 64   match updated d
5160: 61 74 61 21 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  ata!");....     
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
5190: 20 6e 20 3c 20 74 62 6c 2e 52 6f 77 73 2e 43 6f   n < tbl.Rows.Co
51a0: 75 6e 74 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20  unt; n++)..     
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
51e0: 74 62 6c 2e 52 6f 77 73 5b 6e 5d 5b 30 5d 2e 45  tbl.Rows[n][0].E
51f0: 71 75 61 6c 73 28 74 62 6c 32 2e 52 6f 77 73 5b  quals(tbl2.Rows[
5200: 6e 5d 5b 30 5d 29 20 3d 3d 20 66 61 6c 73 65 29  n][0]) == false)
5210: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5220: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
5230: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
5240: 22 46 65 74 63 68 65 64 20 69 64 65 6e 74 69 74  "Fetched identit
5250: 79 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  y doesn't match 
5260: 73 65 6c 65 63 74 65 64 20 69 64 65 6e 74 69 74  selected identit
5270: 79 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  y!");..         
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
52b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
52f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5300: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
5310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 62 75 69        return bui
5320: 6c 64 65 72 2e 54 6f 53 74 72 69 6e 67 28 29 3b  lder.ToString();
5330: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
5340: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
5350: 20 20 2f 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20    /// Make sure 
5360: 61 20 64 61 74 61 72 65 61 64 65 72 20 63 61 6e  a datareader can
5370: 20 72 75 6e 20 65 76 65 6e 20 69 66 20 74 68 65   run even if the
5380: 20 70 61 72 65 6e 74 20 63 6f 6d 6d 61 6e 64 20   parent command 
5390: 69 73 20 64 69 73 70 6f 73 65 64 2c 20 61 6e 64  is disposed, and
53a0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
53b0: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 0d 0a  tion is closed..
53c0: 20 20 20 20 2f 2f 2f 20 62 79 20 74 68 65 20 64      /// by the d
53d0: 61 74 61 72 65 61 64 65 72 20 77 68 65 6e 20 69  atareader when i
53e0: 74 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0d 0a  t is finished...
53f0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
5400: 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a  y>..    [Test]..
5410: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
5420: 64 20 44 61 74 61 52 65 61 64 65 72 43 6c 65 61  d DataReaderClea
5430: 6e 75 70 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  nup()..    {..  
5440: 20 20 20 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e      DbConnection
5450: 20 6e 65 77 63 6e 6e 20 3d 20 28 28 49 43 6c 6f   newcnn = ((IClo
5460: 6e 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f  neable)_cnn).Clo
5470: 6e 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63  ne() as DbConnec
5480: 74 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 44 62 43  tion;..      DbC
5490: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 6e 65 77  ommand cmd = new
54a0: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
54b0: 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 74 72  d();....      tr
54c0: 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  y..      {..    
54d0: 20 20 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53      if (newcnn.S
54e0: 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69  tate != Connecti
54f0: 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 0d 0a 20  onState.Open).. 
5500: 20 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e           newcnn.
5510: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
5520: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
5530: 78 74 20 3d 20 22 53 45 4c 45 43 54 20 31 2c 20  xt = "SELECT 1, 
5540: 32 2c 20 33 22 3b 0d 0a 20 20 20 20 20 20 20 20  2, 3";..        
5550: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
5560: 64 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64  der reader = cmd
5570: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 43  .ExecuteReader(C
5580: 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 43  ommandBehavior.C
5590: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 29 29  loseConnection))
55a0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
55b0: 20 20 20 20 20 20 20 63 6d 64 2e 44 69 73 70 6f         cmd.Dispo
55c0: 73 65 28 29 3b 20 2f 2f 20 44 69 73 70 6f 73 65  se(); // Dispose
55d0: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   of the command 
55e0: 77 68 69 6c 65 20 61 6e 20 6f 70 65 6e 20 72 65  while an open re
55f0: 61 64 65 72 20 69 73 20 61 63 74 69 76 65 20 2e  ader is active .
5600: 2e 2e 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  .. should still 
5610: 62 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 0d  be able to read.
5620: 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a  .          try..
5630: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5640: 20 20 20 20 20 20 20 20 20 72 65 61 64 65 72 2e           reader.
5650: 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20 20 20  Read();..       
5660: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
5670: 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  catch..         
5680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5690: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
56a0: 69 6f 6e 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  ion("Unable to r
56b0: 65 61 64 20 66 72 6f 6d 20 61 20 44 61 74 61 52  ead from a DataR
56c0: 65 61 64 65 72 21 22 29 3b 0d 0a 20 20 20 20 20  eader!");..     
56d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
56e0: 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47      if (reader.G
56f0: 65 74 49 6e 74 33 32 28 30 29 20 21 3d 20 31 20  etInt32(0) != 1 
5700: 7c 7c 20 72 65 61 64 65 72 2e 47 65 74 49 6e 74  || reader.GetInt
5710: 33 32 28 31 29 20 21 3d 20 32 20 7c 7c 20 72 65  32(1) != 2 || re
5720: 61 64 65 72 2e 47 65 74 49 6e 74 33 32 28 32 29  ader.GetInt32(2)
5730: 20 21 3d 20 33 29 0d 0a 20 20 20 20 20 20 20 20   != 3)..        
5740: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78      throw new Ex
5750: 63 65 70 74 69 6f 6e 28 22 55 6e 65 78 70 65 63  ception("Unexpec
5760: 74 65 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ted return value
5770: 73 20 66 72 6f 6d 20 72 65 61 64 65 72 21 22 29  s from reader!")
5780: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ;....          r
5790: 65 61 64 65 72 2e 43 6c 6f 73 65 28 29 3b 20 2f  eader.Close(); /
57a0: 2f 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  / Close the read
57b0: 65 72 2c 20 61 6e 64 20 63 68 65 63 6b 20 69 66  er, and check if
57c0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
57d0: 69 73 20 63 6c 6f 73 65 64 0d 0a 0d 0a 20 20 20  is closed....   
57e0: 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e         if (newcn
57f0: 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65  n.State != Conne
5800: 63 74 69 6f 6e 53 74 61 74 65 2e 43 6c 6f 73 65  ctionState.Close
5810: 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d)..            
5820: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
5830: 69 6f 6e 28 22 44 61 74 61 52 65 61 64 65 72 20  ion("DataReader 
5840: 66 61 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75  failed to cleanu
5850: 70 21 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  p!");..        }
5860: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20  ..      }..     
5870: 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20   finally..      
5880: 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 44  {..        cmd.D
5890: 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20  ispose();..     
58a0: 20 20 20 6e 65 77 63 6e 6e 2e 44 69 73 70 6f 73     newcnn.Dispos
58b0: 65 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  e();..      }.. 
58c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
58d0: 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
58e0: 20 76 6f 69 64 20 44 61 74 61 54 79 70 65 54 65   void DataTypeTe
58f0: 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  st()..    {..   
5900: 20 20 20 44 61 74 65 54 69 6d 65 20 6e 6f 77 20     DateTime now 
5910: 3d 20 44 61 74 65 54 69 6d 65 2e 4e 6f 77 3b 0d  = DateTime.Now;.
5920: 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  ...      using (
5930: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
5940: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
5950: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
5960: 20 20 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c          droptabl
5970: 65 73 2e 41 64 64 28 22 64 61 74 61 74 79 70 65  es.Add("datatype
5980: 74 65 73 74 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  test");....     
5990: 20 20 20 69 66 20 28 5f 66 61 63 74 2e 47 65 74     if (_fact.Get
59a0: 54 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65  Type().Name.Inde
59b0: 78 4f 66 28 22 53 51 4c 69 74 65 22 2c 20 53 74  xOf("SQLite", St
59c0: 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f  ringComparison.O
59d0: 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65  rdinalIgnoreCase
59e0: 29 20 3d 3d 20 2d 31 29 0d 0a 20 20 20 20 20 20  ) == -1)..      
59f0: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
5a00: 65 78 74 20 3d 20 22 63 72 65 61 74 65 20 74 61  ext = "create ta
5a10: 62 6c 65 20 64 61 74 61 74 79 70 65 74 65 73 74  ble datatypetest
5a20: 28 69 64 20 62 69 67 69 6e 74 20 69 64 65 6e 74  (id bigint ident
5a30: 69 74 79 20 70 72 69 6d 61 72 79 20 6b 65 79 2c  ity primary key,
5a40: 20 6d 79 76 61 6c 75 65 20 73 71 6c 5f 76 61 72   myvalue sql_var
5a50: 69 61 6e 74 2c 20 64 61 74 65 74 69 6d 65 76 61  iant, datetimeva
5a60: 6c 75 65 20 64 61 74 65 74 69 6d 65 2c 20 64 65  lue datetime, de
5a70: 63 69 6d 61 6c 76 61 6c 75 65 20 64 65 63 69 6d  cimalvalue decim
5a80: 61 6c 28 33 38 2c 31 38 29 29 22 3b 0d 0a 20 20  al(38,18))";..  
5a90: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
5aa0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
5ab0: 64 54 65 78 74 20 3d 20 22 63 72 65 61 74 65 20  dText = "create 
5ac0: 74 61 62 6c 65 20 64 61 74 61 74 79 70 65 74 65  table datatypete
5ad0: 73 74 28 69 64 20 69 6e 74 65 67 65 72 20 70 72  st(id integer pr
5ae0: 69 6d 61 72 79 20 6b 65 79 2c 20 6d 79 76 61 6c  imary key, myval
5af0: 75 65 20 73 71 6c 5f 76 61 72 69 61 6e 74 2c 20  ue sql_variant, 
5b00: 64 61 74 65 74 69 6d 65 76 61 6c 75 65 20 64 61  datetimevalue da
5b10: 74 65 74 69 6d 65 2c 20 64 65 63 69 6d 61 6c 76  tetime, decimalv
5b20: 61 6c 75 65 20 64 65 63 69 6d 61 6c 28 33 38 2c  alue decimal(38,
5b30: 31 38 29 29 22 3b 0d 0a 0d 0a 20 20 20 20 20 20  18))";....      
5b40: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
5b50: 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20  Query();....    
5b60: 20 20 20 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61      System.Globa
5b70: 6c 69 7a 61 74 69 6f 6e 2e 43 75 6c 74 75 72 65  lization.Culture
5b80: 49 6e 66 6f 20 6f 6c 64 63 75 6c 74 75 72 65 20  Info oldculture 
5b90: 3d 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69  = System.Threadi
5ba0: 6e 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e  ng.Thread.Curren
5bb0: 74 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 43  tThread.CurrentC
5bc0: 75 6c 74 75 72 65 3b 0d 0a 20 20 20 20 20 20 20  ulture;..       
5bd0: 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c 69 7a   System.Globaliz
5be0: 61 74 69 6f 6e 2e 43 75 6c 74 75 72 65 49 6e 66  ation.CultureInf
5bf0: 6f 20 6f 6c 64 75 69 63 75 6c 74 75 72 65 20 3d  o olduiculture =
5c00: 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e   System.Threadin
5c10: 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  g.Thread.Current
5c20: 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 55 49  Thread.CurrentUI
5c30: 43 75 6c 74 75 72 65 3b 0d 0a 0d 0a 20 20 20 20  Culture;....    
5c40: 20 20 20 20 2f 2f 20 49 6e 73 65 72 74 20 75 73      // Insert us
5c50: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
5c60: 63 75 72 72 65 6e 74 20 63 75 6c 74 75 72 65 0d  current culture.
5c70: 0a 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e  .        System.
5c80: 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64  Threading.Thread
5c90: 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43  .CurrentThread.C
5ca0: 75 72 72 65 6e 74 43 75 6c 74 75 72 65 20 3d 20  urrentCulture = 
5cb0: 6e 65 77 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61  new System.Globa
5cc0: 6c 69 7a 61 74 69 6f 6e 2e 43 75 6c 74 75 72 65  lization.Culture
5cd0: 49 6e 66 6f 28 22 65 73 2d 45 53 22 29 3b 0d 0a  Info("es-ES");..
5ce0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54          System.T
5cf0: 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e  hreading.Thread.
5d00: 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43 75  CurrentThread.Cu
5d10: 72 72 65 6e 74 55 49 43 75 6c 74 75 72 65 20 3d  rrentUICulture =
5d20: 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e   System.Threadin
5d30: 67 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74  g.Thread.Current
5d40: 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 43 75  Thread.CurrentCu
5d50: 6c 74 75 72 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  lture;....      
5d60: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
5d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  ..          cmd.
5d80: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 69  CommandText = "i
5d90: 6e 73 65 72 74 20 69 6e 74 6f 20 64 61 74 61 74  nsert into datat
5da0: 79 70 65 74 65 73 74 28 6d 79 76 61 6c 75 65 2c  ypetest(myvalue,
5db0: 20 64 61 74 65 74 69 6d 65 76 61 6c 75 65 2c 20   datetimevalue, 
5dc0: 64 65 63 69 6d 61 6c 76 61 6c 75 65 29 20 76 61  decimalvalue) va
5dd0: 6c 75 65 73 28 40 70 31 2c 40 70 32 2c 40 70 33  lues(@p1,@p2,@p3
5de0: 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 44  )";..          D
5df0: 62 50 61 72 61 6d 65 74 65 72 20 70 31 20 3d 20  bParameter p1 = 
5e00: 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65  cmd.CreateParame
5e10: 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ter();..        
5e20: 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 70 32    DbParameter p2
5e30: 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72   = cmd.CreatePar
5e40: 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20  ameter();..     
5e50: 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65 72       DbParameter
5e60: 20 70 33 20 3d 20 63 6d 64 2e 43 72 65 61 74 65   p3 = cmd.Create
5e70: 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a  Parameter();....
5e80: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61            cmd.Pa
5e90: 72 61 6d 65 74 65 72 73 2e 41 64 64 28 70 31 29  rameters.Add(p1)
5ea0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ;..          cmd
5eb0: 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28  .Parameters.Add(
5ec0: 70 32 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  p2);..          
5ed0: 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41  cmd.Parameters.A
5ee0: 64 64 28 70 33 29 3b 0d 0a 0d 0a 20 20 20 20 20  dd(p3);....     
5ef0: 20 20 20 20 20 70 31 2e 50 61 72 61 6d 65 74 65       p1.Paramete
5f00: 72 4e 61 6d 65 20 3d 20 22 40 70 31 22 3b 0d 0a  rName = "@p1";..
5f10: 20 20 20 20 20 20 20 20 20 20 70 32 2e 50 61 72            p2.Par
5f20: 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70  ameterName = "@p
5f30: 32 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70  2";..          p
5f40: 33 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20  3.ParameterName 
5f50: 3d 20 22 40 70 33 22 3b 0d 0a 0d 0a 20 20 20 20  = "@p3";....    
5f60: 20 20 20 20 20 20 70 31 2e 56 61 6c 75 65 20 3d        p1.Value =
5f70: 20 28 6c 6f 6e 67 29 31 3b 0d 0a 20 20 20 20 20   (long)1;..     
5f80: 20 20 20 20 20 70 32 2e 56 61 6c 75 65 20 3d 20       p2.Value = 
5f90: 6e 65 77 20 44 61 74 65 54 69 6d 65 28 31 37 35  new DateTime(175
5fa0: 33 2c 20 31 2c 20 31 29 3b 0d 0a 20 20 20 20 20  3, 1, 1);..     
5fb0: 20 20 20 20 20 70 33 2e 56 61 6c 75 65 20 3d 20       p3.Value = 
5fc0: 28 44 65 63 69 6d 61 6c 29 31 2e 30 35 3b 0d 0a  (Decimal)1.05;..
5fd0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
5fe0: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
5ff0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 70 31  ....          p1
6000: 2e 52 65 73 65 74 44 62 54 79 70 65 28 29 3b 0d  .ResetDbType();.
6010: 0a 20 20 20 20 20 20 20 20 20 20 70 32 2e 52 65  .          p2.Re
6020: 73 65 74 44 62 54 79 70 65 28 29 3b 0d 0a 20 20  setDbType();..  
6030: 20 20 20 20 20 20 20 20 70 33 2e 52 65 73 65 74          p3.Reset
6040: 44 62 54 79 70 65 28 29 3b 0d 0a 0d 0a 20 20 20  DbType();....   
6050: 20 20 20 20 20 20 20 70 31 2e 56 61 6c 75 65 20         p1.Value 
6060: 3d 20 22 4f 6e 65 22 3b 0d 0a 20 20 20 20 20 20  = "One";..      
6070: 20 20 20 20 70 32 2e 56 61 6c 75 65 20 3d 20 22      p2.Value = "
6080: 32 30 30 31 2d 30 31 2d 30 31 22 3b 0d 0a 20 20  2001-01-01";..  
6090: 20 20 20 20 20 20 20 20 70 33 2e 56 61 6c 75 65          p3.Value
60a0: 20 3d 20 28 44 65 63 69 6d 61 6c 29 31 2e 30 3b   = (Decimal)1.0;
60b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  ..          cmd.
60c0: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
60d0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
60e0: 70 31 2e 52 65 73 65 74 44 62 54 79 70 65 28 29  p1.ResetDbType()
60f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 32 2e  ;..          p2.
6100: 52 65 73 65 74 44 62 54 79 70 65 28 29 3b 0d 0a  ResetDbType();..
6110: 20 20 20 20 20 20 20 20 20 20 70 33 2e 52 65 73            p3.Res
6120: 65 74 44 62 54 79 70 65 28 29 3b 0d 0a 0d 0a 20  etDbType();.... 
6130: 20 20 20 20 20 20 20 20 20 70 31 2e 56 61 6c 75           p1.Valu
6140: 65 20 3d 20 31 2e 30 31 3b 0d 0a 20 20 20 20 20  e = 1.01;..     
6150: 20 20 20 20 20 70 32 2e 56 61 6c 75 65 20 3d 20       p2.Value = 
6160: 6e 6f 77 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  now;..          
6170: 70 33 2e 56 61 6c 75 65 20 3d 20 28 44 65 63 69  p3.Value = (Deci
6180: 6d 61 6c 29 39 2e 39 31 3b 0d 0a 20 20 20 20 20  mal)9.91;..     
6190: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
61a0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20  NonQuery();.... 
61b0: 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 61 64           // Read
61c0: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
61d0: 6e 74 20 63 75 72 72 65 6e 74 20 63 75 6c 74 75  nt current cultu
61e0: 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79  re..          Sy
61f0: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54  stem.Threading.T
6200: 68 72 65 61 64 2e 43 75 72 72 65 6e 74 54 68 72  hread.CurrentThr
6210: 65 61 64 2e 43 75 72 72 65 6e 74 43 75 6c 74 75  ead.CurrentCultu
6220: 72 65 20 3d 20 6e 65 77 20 53 79 73 74 65 6d 2e  re = new System.
6230: 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 43 75  Globalization.Cu
6240: 6c 74 75 72 65 49 6e 66 6f 28 22 65 6e 2d 55 53  ltureInfo("en-US
6250: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 53  ");..          S
6260: 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e  ystem.Threading.
6270: 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 54 68  Thread.CurrentTh
6280: 72 65 61 64 2e 43 75 72 72 65 6e 74 55 49 43 75  read.CurrentUICu
6290: 6c 74 75 72 65 20 3d 20 53 79 73 74 65 6d 2e 54  lture = System.T
62a0: 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e  hreading.Thread.
62b0: 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 43 75  CurrentThread.Cu
62c0: 72 72 65 6e 74 43 75 6c 74 75 72 65 3b 0d 0a 0d  rrentCulture;...
62d0: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43  .          cmd.C
62e0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 73 65  ommandText = "se
62f0: 6c 65 63 74 20 6d 79 76 61 6c 75 65 2c 20 64 61  lect myvalue, da
6300: 74 65 74 69 6d 65 76 61 6c 75 65 2c 20 64 65 63  tetimevalue, dec
6310: 69 6d 61 6c 76 61 6c 75 65 20 66 72 6f 6d 20 64  imalvalue from d
6320: 61 74 61 74 79 70 65 74 65 73 74 22 3b 0d 0a 20  atatypetest";.. 
6330: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72           cmd.Par
6340: 61 6d 65 74 65 72 73 2e 43 6c 65 61 72 28 29 3b  ameters.Clear();
6350: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e  ..          usin
6360: 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20  g (DbDataReader 
6370: 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65  reader = cmd.Exe
6380: 63 75 74 65 52 65 61 64 65 72 28 29 29 0d 0a 20  cuteReader()).. 
6390: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
63a0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74          for (int
63b0: 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 33 3b 20 6e   n = 0; n < 3; n
63c0: 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ++)..           
63d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
63e0: 20 20 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b    reader.Read();
63f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6400: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
6410: 6c 75 65 28 31 29 2e 47 65 74 54 79 70 65 28 29  lue(1).GetType()
6420: 20 21 3d 20 72 65 61 64 65 72 2e 47 65 74 44 61   != reader.GetDa
6430: 74 65 54 69 6d 65 28 31 29 2e 47 65 74 54 79 70  teTime(1).GetTyp
6440: 65 28 29 29 20 74 68 72 6f 77 20 6e 65 77 20 45  e()) throw new E
6450: 78 63 65 70 74 69 6f 6e 28 22 44 61 74 65 54 69  xception("DateTi
6460: 6d 65 20 74 79 70 65 20 6e 6f 6e 2d 6d 61 74 63  me type non-matc
6470: 68 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  h");..          
6480: 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47      if (reader.G
6490: 65 74 56 61 6c 75 65 28 32 29 2e 47 65 74 54 79  etValue(2).GetTy
64a0: 70 65 28 29 20 21 3d 20 72 65 61 64 65 72 2e 47  pe() != reader.G
64b0: 65 74 44 65 63 69 6d 61 6c 28 32 29 2e 47 65 74  etDecimal(2).Get
64c0: 54 79 70 65 28 29 29 20 74 68 72 6f 77 20 6e 65  Type()) throw ne
64d0: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 44 65 63  w Exception("Dec
64e0: 69 6d 61 6c 20 74 79 70 65 20 6e 6f 6e 2d 6d 61  imal type non-ma
64f0: 74 63 68 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  tch");....      
6500: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20 28          switch (
6510: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
6520: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
6530: 20 20 20 20 20 63 61 73 65 20 30 3a 0d 0a 20 20       case 0:..  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 56 61  if (reader.GetVa
6560: 6c 75 65 28 30 29 2e 47 65 74 54 79 70 65 28 29  lue(0).GetType()
6570: 20 21 3d 20 74 79 70 65 6f 66 28 6c 6f 6e 67 29   != typeof(long)
6580: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
6590: 70 74 69 6f 6e 28 22 6c 6f 6e 67 20 74 79 70 65  ption("long type
65a0: 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a 0d   non-match");...
65b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
65c0: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65     if (reader.Ge
65d0: 74 56 61 6c 75 65 28 30 29 2e 45 71 75 61 6c 73  tValue(0).Equals
65e0: 28 28 6c 6f 6e 67 29 31 29 20 3d 3d 20 66 61 6c  ((long)1) == fal
65f0: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
6600: 63 65 70 74 69 6f 6e 28 22 6c 6f 6e 67 20 76 61  ception("long va
6610: 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b  lue non-match");
6620: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6630: 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47      if (reader.G
6640: 65 74 56 61 6c 75 65 28 31 29 2e 45 71 75 61 6c  etValue(1).Equal
6650: 73 28 6e 65 77 20 44 61 74 65 54 69 6d 65 28 31  s(new DateTime(1
6660: 37 35 33 2c 20 31 2c 20 31 29 29 20 3d 3d 20 66  753, 1, 1)) == f
6670: 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20  alse) throw new 
6680: 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
6690: 2e 46 6f 72 6d 61 74 28 22 44 61 74 65 54 69 6d  .Format("DateTim
66a0: 65 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  e value non-matc
66b0: 68 20 65 78 70 65 63 74 65 64 20 7b 30 7d 20 67  h expected {0} g
66c0: 6f 74 20 7b 31 7d 22 2c 20 6e 65 77 20 44 61 74  ot {1}", new Dat
66d0: 65 54 69 6d 65 28 31 37 35 33 2c 20 31 2c 20 31  eTime(1753, 1, 1
66e0: 29 2c 20 72 65 61 64 65 72 2e 47 65 74 56 61 6c  ), reader.GetVal
66f0: 75 65 28 31 29 29 29 3b 0d 0a 20 20 20 20 20 20  ue(1)));..      
6700: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
6710: 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28  reader.GetValue(
6720: 32 29 2e 45 71 75 61 6c 73 28 28 44 65 63 69 6d  2).Equals((Decim
6730: 61 6c 29 31 2e 30 35 29 20 3d 3d 20 66 61 6c 73  al)1.05) == fals
6740: 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  e) throw new Exc
6750: 65 70 74 69 6f 6e 28 22 44 65 63 69 6d 61 6c 20  eption("Decimal 
6760: 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 22  value non-match"
6770: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
6780: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
6790: 65 72 2e 47 65 74 56 61 6c 75 65 28 30 29 2e 45  er.GetValue(0).E
67a0: 71 75 61 6c 73 28 72 65 61 64 65 72 2e 47 65 74  quals(reader.Get
67b0: 49 6e 74 36 34 28 30 29 29 20 3d 3d 20 66 61 6c  Int64(0)) == fal
67c0: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
67d0: 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46  ception(String.F
67e0: 6f 72 6d 61 74 28 22 6c 6f 6e 67 20 76 61 6c 75  ormat("long valu
67f0: 65 20 66 61 69 6c 65 64 20 74 6f 20 6d 61 74 63  e failed to matc
6800: 68 20 69 74 73 65 6c 66 2c 20 7b 30 7d 20 61 6e  h itself, {0} an
6810: 64 20 7b 31 7d 22 2c 20 72 65 61 64 65 72 2e 47  d {1}", reader.G
6820: 65 74 56 61 6c 75 65 28 30 29 2c 20 72 65 61 64  etValue(0), read
6830: 65 72 2e 47 65 74 49 6e 74 36 34 28 30 29 29 29  er.GetInt64(0)))
6840: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
6850: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
6860: 47 65 74 56 61 6c 75 65 28 31 29 2e 45 71 75 61  GetValue(1).Equa
6870: 6c 73 28 72 65 61 64 65 72 2e 47 65 74 44 61 74  ls(reader.GetDat
6880: 65 54 69 6d 65 28 31 29 29 20 3d 3d 20 66 61 6c  eTime(1)) == fal
6890: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
68a0: 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46  ception(String.F
68b0: 6f 72 6d 61 74 28 22 44 61 74 65 54 69 6d 65 20  ormat("DateTime 
68c0: 66 61 69 6c 65 64 20 74 6f 20 6d 61 74 63 68 20  failed to match 
68d0: 69 74 73 65 6c 66 20 7b 30 7d 20 61 6e 64 20 7b  itself {0} and {
68e0: 31 7d 22 2c 20 72 65 61 64 65 72 2e 47 65 74 56  1}", reader.GetV
68f0: 61 6c 75 65 28 31 29 2c 20 72 65 61 64 65 72 2e  alue(1), reader.
6900: 47 65 74 44 61 74 65 54 69 6d 65 28 31 29 29 29  GetDateTime(1)))
6910: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
6920: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
6930: 47 65 74 56 61 6c 75 65 28 32 29 2e 45 71 75 61  GetValue(2).Equa
6940: 6c 73 28 72 65 61 64 65 72 2e 47 65 74 44 65 63  ls(reader.GetDec
6950: 69 6d 61 6c 28 32 29 29 20 3d 3d 20 66 61 6c 73  imal(2)) == fals
6960: 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  e) throw new Exc
6970: 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f  eption(String.Fo
6980: 72 6d 61 74 28 22 44 65 63 69 6d 61 6c 20 66 61  rmat("Decimal fa
6990: 69 6c 65 64 20 74 6f 20 6d 61 74 63 68 20 69 74  iled to match it
69a0: 73 65 6c 66 20 7b 30 7d 20 61 6e 64 20 7b 31 7d  self {0} and {1}
69b0: 22 2c 20 72 65 61 64 65 72 2e 47 65 74 56 61 6c  ", reader.GetVal
69c0: 75 65 28 32 29 2c 20 72 65 61 64 65 72 2e 47 65  ue(2), reader.Ge
69d0: 74 44 65 63 69 6d 61 6c 28 32 29 29 29 3b 0d 0a  tDecimal(2)));..
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69f0: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
6a00: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31            case 1
6a10: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
6a20: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
6a30: 47 65 74 56 61 6c 75 65 28 30 29 2e 47 65 74 54  GetValue(0).GetT
6a40: 79 70 65 28 29 20 21 3d 20 74 79 70 65 6f 66 28  ype() != typeof(
6a50: 73 74 72 69 6e 67 29 29 20 74 68 72 6f 77 20 6e  string)) throw n
6a60: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53 74  ew Exception("St
6a70: 72 69 6e 67 20 74 79 70 65 20 6e 6f 6e 2d 6d 61  ring type non-ma
6a80: 74 63 68 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  tch");..        
6a90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65            if (re
6aa0: 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30 29  ader.GetValue(0)
6ab0: 2e 45 71 75 61 6c 73 28 22 4f 6e 65 22 29 20 3d  .Equals("One") =
6ac0: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
6ad0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 53 74  ew Exception("St
6ae0: 72 69 6e 67 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d  ring value non-m
6af0: 61 74 63 68 22 29 3b 0d 0a 20 20 20 20 20 20 20  atch");..       
6b00: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
6b10: 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31  eader.GetValue(1
6b20: 29 2e 45 71 75 61 6c 73 28 6e 65 77 20 44 61 74  ).Equals(new Dat
6b30: 65 54 69 6d 65 28 32 30 30 31 2c 20 31 2c 20 31  eTime(2001, 1, 1
6b40: 29 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72  )) == false) thr
6b50: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
6b60: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
6b70: 44 61 74 65 54 69 6d 65 20 76 61 6c 75 65 20 6e  DateTime value n
6b80: 6f 6e 2d 6d 61 74 63 68 20 65 78 70 65 63 74 65  on-match expecte
6b90: 64 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22 2c 20  d {0} got {1}", 
6ba0: 6e 65 77 20 44 61 74 65 54 69 6d 65 28 32 30 30  new DateTime(200
6bb0: 31 2c 20 31 2c 20 31 29 2c 20 72 65 61 64 65 72  1, 1, 1), reader
6bc0: 2e 47 65 74 56 61 6c 75 65 28 31 29 29 29 3b 0d  .GetValue(1)));.
6bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6be0: 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65     if (reader.Ge
6bf0: 74 56 61 6c 75 65 28 32 29 2e 45 71 75 61 6c 73  tValue(2).Equals
6c00: 28 28 44 65 63 69 6d 61 6c 29 31 2e 30 29 20 3d  ((Decimal)1.0) =
6c10: 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e  = false) throw n
6c20: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 44 65  ew Exception("De
6c30: 63 69 6d 61 6c 20 76 61 6c 75 65 20 6e 6f 6e 2d  cimal value non-
6c40: 6d 61 74 63 68 22 29 3b 0d 0a 0d 0a 20 20 20 20  match");....    
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6c60: 20 28 72 65 61 64 65 72 2e 47 65 74 53 74 72 69   (reader.GetStri
6c70: 6e 67 28 30 29 20 21 3d 20 22 4f 6e 65 22 29 20  ng(0) != "One") 
6c80: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
6c90: 69 6f 6e 28 22 53 74 72 69 6e 67 20 76 61 6c 75  ion("String valu
6ca0: 65 20 6e 6f 6e 2d 6d 61 74 63 68 22 29 3b 0d 0a  e non-match");..
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65 74    if (reader.Get
6cd0: 56 61 6c 75 65 28 31 29 2e 45 71 75 61 6c 73 28  Value(1).Equals(
6ce0: 72 65 61 64 65 72 2e 47 65 74 44 61 74 65 54 69  reader.GetDateTi
6cf0: 6d 65 28 31 29 29 20 3d 3d 20 66 61 6c 73 65 29  me(1)) == false)
6d00: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
6d10: 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d  tion(String.Form
6d20: 61 74 28 22 44 61 74 65 54 69 6d 65 20 66 61 69  at("DateTime fai
6d30: 6c 65 64 20 74 6f 20 6d 61 74 63 68 20 69 74 73  led to match its
6d40: 65 6c 66 20 7b 30 7d 20 61 6e 64 20 7b 31 7d 22  elf {0} and {1}"
6d50: 2c 20 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75  , reader.GetValu
6d60: 65 28 31 29 2c 20 72 65 61 64 65 72 2e 47 65 74  e(1), reader.Get
6d70: 44 61 74 65 54 69 6d 65 28 31 29 29 29 3b 0d 0a  DateTime(1)));..
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65 74    if (reader.Get
6da0: 56 61 6c 75 65 28 32 29 2e 45 71 75 61 6c 73 28  Value(2).Equals(
6db0: 72 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61  reader.GetDecima
6dc0: 6c 28 32 29 29 20 3d 3d 20 66 61 6c 73 65 29 20  l(2)) == false) 
6dd0: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
6de0: 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ion(String.Forma
6df0: 74 28 22 44 65 63 69 6d 61 6c 20 66 61 69 6c 65  t("Decimal faile
6e00: 64 20 74 6f 20 6d 61 74 63 68 20 69 74 73 65 6c  d to match itsel
6e10: 66 20 7b 30 7d 20 61 6e 64 20 7b 31 7d 22 2c 20  f {0} and {1}", 
6e20: 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28  reader.GetValue(
6e30: 32 29 2c 20 72 65 61 64 65 72 2e 47 65 74 44 65  2), reader.GetDe
6e40: 63 69 6d 61 6c 28 32 29 29 29 3b 0d 0a 20 20 20  cimal(2)));..   
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
6e60: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20  reak;..         
6e70: 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 0d 0a         case 2:..
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 20 69 66 20 28 72 65 61 64 65 72 2e 47 65 74    if (reader.Get
6ea0: 56 61 6c 75 65 28 30 29 2e 47 65 74 54 79 70 65  Value(0).GetType
6eb0: 28 29 20 21 3d 20 74 79 70 65 6f 66 28 64 6f 75  () != typeof(dou
6ec0: 62 6c 65 29 29 20 74 68 72 6f 77 20 6e 65 77 20  ble)) throw new 
6ed0: 45 78 63 65 70 74 69 6f 6e 28 22 44 6f 75 62 6c  Exception("Doubl
6ee0: 65 20 74 79 70 65 20 6e 6f 6e 2d 6d 61 74 63 68  e type non-match
6ef0: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
6f00: 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65         if (reade
6f10: 72 2e 47 65 74 56 61 6c 75 65 28 30 29 2e 45 71  r.GetValue(0).Eq
6f20: 75 61 6c 73 28 31 2e 30 31 29 20 3d 3d 20 66 61  uals(1.01) == fa
6f30: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
6f40: 78 63 65 70 74 69 6f 6e 28 22 44 6f 75 62 6c 65  xception("Double
6f50: 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68   value non-match
6f60: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
6f70: 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65         if (reade
6f80: 72 2e 47 65 74 56 61 6c 75 65 28 31 29 2e 54 6f  r.GetValue(1).To
6f90: 53 74 72 69 6e 67 28 29 20 21 3d 20 6e 6f 77 2e  String() != now.
6fa0: 54 6f 53 74 72 69 6e 67 28 29 29 20 74 68 72 6f  ToString()) thro
6fb0: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
6fc0: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44  String.Format("D
6fd0: 61 74 65 54 69 6d 65 20 76 61 6c 75 65 20 6e 6f  ateTime value no
6fe0: 6e 2d 6d 61 74 63 68 2c 20 65 78 70 65 63 74 65  n-match, expecte
6ff0: 64 20 7b 30 7d 20 67 6f 74 20 7b 31 7d 22 2c 20  d {0} got {1}", 
7000: 6e 6f 77 2c 20 72 65 61 64 65 72 2e 47 65 74 56  now, reader.GetV
7010: 61 6c 75 65 28 31 29 29 29 3b 0d 0a 20 20 20 20  alue(1)));..    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7030: 20 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75   (reader.GetValu
7040: 65 28 32 29 2e 45 71 75 61 6c 73 28 28 44 65 63  e(2).Equals((Dec
7050: 69 6d 61 6c 29 39 2e 39 31 29 20 3d 3d 20 66 61  imal)9.91) == fa
7060: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
7070: 78 63 65 70 74 69 6f 6e 28 22 44 65 63 69 6d 61  xception("Decima
7080: 6c 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  l value non-matc
7090: 68 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  h");....        
70a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65            if (re
70b0: 61 64 65 72 2e 47 65 74 44 6f 75 62 6c 65 28 30  ader.GetDouble(0
70c0: 29 20 21 3d 20 31 2e 30 31 29 20 74 68 72 6f 77  ) != 1.01) throw
70d0: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
70e0: 44 6f 75 62 6c 65 20 76 61 6c 75 65 20 6e 6f 6e  Double value non
70f0: 2d 6d 61 74 63 68 22 29 3b 0d 0a 20 20 20 20 20  -match");..     
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
7110: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
7120: 28 31 29 2e 45 71 75 61 6c 73 28 72 65 61 64 65  (1).Equals(reade
7130: 72 2e 47 65 74 44 61 74 65 54 69 6d 65 28 31 29  r.GetDateTime(1)
7140: 29 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f  ) == false) thro
7150: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
7160: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44  String.Format("D
7170: 61 74 65 54 69 6d 65 20 66 61 69 6c 65 64 20 74  ateTime failed t
7180: 6f 20 6d 61 74 63 68 20 69 74 73 65 6c 66 20 7b  o match itself {
7190: 30 7d 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65 61  0} and {1}", rea
71a0: 64 65 72 2e 47 65 74 56 61 6c 75 65 28 31 29 2c  der.GetValue(1),
71b0: 20 72 65 61 64 65 72 2e 47 65 74 44 61 74 65 54   reader.GetDateT
71c0: 69 6d 65 28 31 29 29 29 3b 0d 0a 20 20 20 20 20  ime(1)));..     
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
71e0: 28 72 65 61 64 65 72 2e 47 65 74 56 61 6c 75 65  (reader.GetValue
71f0: 28 32 29 2e 45 71 75 61 6c 73 28 72 65 61 64 65  (2).Equals(reade
7200: 72 2e 47 65 74 44 65 63 69 6d 61 6c 28 32 29 29  r.GetDecimal(2))
7210: 20 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77   == false) throw
7220: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53   new Exception(S
7230: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 44 65  tring.Format("De
7240: 63 69 6d 61 6c 20 66 61 69 6c 65 64 20 74 6f 20  cimal failed to 
7250: 6d 61 74 63 68 20 69 74 73 65 6c 66 20 7b 30 7d  match itself {0}
7260: 20 61 6e 64 20 7b 31 7d 22 2c 20 72 65 61 64 65   and {1}", reade
7270: 72 2e 47 65 74 56 61 6c 75 65 28 32 29 2c 20 72  r.GetValue(2), r
7280: 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d 61 6c  eader.GetDecimal
7290: 28 32 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  (2)));..        
72a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
72b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
72c0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
72d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
72e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
72f0: 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20    finally..     
7300: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7310: 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67  System.Threading
7320: 2e 54 68 72 65 61 64 2e 43 75 72 72 65 6e 74 54  .Thread.CurrentT
7330: 68 72 65 61 64 2e 43 75 72 72 65 6e 74 43 75 6c  hread.CurrentCul
7340: 74 75 72 65 20 3d 20 6f 6c 64 63 75 6c 74 75 72  ture = oldcultur
7350: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79  e;..          Sy
7360: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54  stem.Threading.T
7370: 68 72 65 61 64 2e 43 75 72 72 65 6e 74 54 68 72  hread.CurrentThr
7380: 65 61 64 2e 43 75 72 72 65 6e 74 55 49 43 75 6c  ead.CurrentUICul
7390: 74 75 72 65 20 3d 20 6f 6c 64 75 69 63 75 6c 74  ture = olduicult
73a0: 75 72 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ure;..        }.
73b0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
73c0: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
73d0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  ary>..    /// Th
73e0: 69 73 20 69 73 20 61 6e 20 6d 65 61 6e 20 75 67  is is an mean ug
73f0: 6c 79 20 74 65 73 74 20 74 68 61 74 20 6c 65 61  ly test that lea
7400: 76 65 73 20 61 20 6c 6f 74 20 6f 66 20 6f 70 65  ves a lot of ope
7410: 6e 20 64 61 74 61 72 65 61 64 65 72 73 20 6f 75  n datareaders ou
7420: 74 20 6f 6e 20 6d 61 6e 79 20 63 6f 6e 6e 65 63  t on many connec
7430: 74 69 6f 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20 74  tions..    /// t
7440: 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
7450: 61 62 61 73 65 20 63 61 6e 20 73 75 72 76 69 76  abase can surviv
7460: 65 20 62 65 69 6e 67 20 63 6c 6f 6e 65 64 20 61  e being cloned a
7470: 20 6c 6f 74 20 61 6e 64 20 64 69 73 70 6f 73 65   lot and dispose
7480: 64 20 77 68 69 6c 65 20 61 63 74 69 76 65 20 72  d while active r
7490: 65 61 64 65 72 73 20 61 72 65 20 75 70 2e 0d 0a  eaders are up...
74a0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
74b0: 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65  y>..    [Test(Se
74c0: 71 75 65 6e 63 65 20 3d 20 34 30 29 5d 0d 0a 20  quence = 40)].. 
74d0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
74e0: 20 4c 65 61 6b 79 44 61 74 61 52 65 61 64 65 72   LeakyDataReader
74f0: 73 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  s()..    {..    
7500: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 7b 0d 0a    try..      {..
7510: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
7520: 20 20 20 20 20 44 62 43 6f 6e 6e 65 63 74 69 6f       DbConnectio
7530: 6e 20 6e 65 77 63 6e 6e 20 3d 20 6e 75 6c 6c 3b  n newcnn = null;
7540: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 0d  ..          try.
7550: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
7560: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69            for (i
7570: 6e 74 20 78 20 3d 20 30 3b 20 78 20 3c 20 31 30  nt x = 0; x < 10
7580: 30 30 30 3b 20 78 2b 2b 29 0d 0a 20 20 20 20 20  000; x++)..     
7590: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
75a0: 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63          if (newc
75b0: 6e 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  nn == null)..   
75c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
75e0: 77 63 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61  wcnn = ((IClonea
75f0: 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28  ble)_cnn).Clone(
7600: 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f  ) as DbConnectio
7610: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n;..            
7620: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
7630: 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e       if (newcnn.
7640: 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74  State != Connect
7650: 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 0d 0a  ionState.Open)..
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a  newcnn.Open();..
7680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7690: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
76a0: 6e 65 77 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  newcnn.CreateCom
76b0: 6d 61 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20 20  mand();..       
76c0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
76d0: 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54  ndText = "SELECT
76e0: 20 2a 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65   * FROM TestCase
76f0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
7700: 20 20 44 62 44 61 74 61 52 65 61 64 65 72 20 72    DbDataReader r
7710: 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63  eader = cmd.Exec
7720: 75 74 65 52 65 61 64 65 72 28 29 3b 0d 0a 20 20  uteReader();..  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
7740: 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20  er.Read();..    
7750: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
7760: 20 6f 62 6a 20 3d 20 72 65 61 64 65 72 5b 30 5d   obj = reader[0]
7770: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
7780: 20 20 20 69 66 20 28 78 20 25 20 35 30 30 20 3d     if (x % 500 =
7790: 3d 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20  = 0)..          
77a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
77b0: 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e 43 6c         newcnn.Cl
77c0: 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ose();..        
77d0: 20 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 20 3d          newcnn =
77e0: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
77f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
7800: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7810: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 66    }..          f
7820: 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  inally..        
7830: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
7840: 20 69 66 20 28 6e 65 77 63 6e 6e 20 21 3d 20 6e   if (newcnn != n
7850: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
7860: 20 20 20 20 6e 65 77 63 6e 6e 2e 43 6c 6f 73 65      newcnn.Close
7870: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
7880: 20 20 20 6e 65 77 63 6e 6e 20 3d 20 6e 75 6c 6c     newcnn = null
7890: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
78a0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
78b0: 20 20 20 43 68 65 63 6b 4c 6f 63 6b 65 64 28 29     CheckLocked()
78c0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
78d0: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
78e0: 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  on e)..      {..
78f0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
7900: 69 61 67 6e 6f 73 74 69 63 73 2e 44 65 62 75 67  iagnostics.Debug
7910: 2e 57 72 69 74 65 4c 69 6e 65 28 65 2e 4d 65 73  .WriteLine(e.Mes
7920: 73 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  sage);..      }.
7930: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54  .    }....    [T
7940: 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20 69  est(Sequence = i
7950: 6e 74 2e 4d 61 78 56 61 6c 75 65 29 5d 0d 0a 20  nt.MaxValue)].. 
7960: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
7970: 20 44 72 6f 70 54 61 62 6c 65 28 29 0d 0a 20 20   DropTable()..  
7980: 20 20 7b 0d 0a 20 20 20 20 20 20 44 72 6f 70 54    {..      DropT
7990: 61 62 6c 65 73 28 74 72 75 65 29 3b 0d 0a 20 20  ables(true);..  
79a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
79b0: 6e 61 6c 20 76 6f 69 64 20 44 72 6f 70 54 61 62  nal void DropTab
79c0: 6c 65 73 28 62 6f 6f 6c 20 74 68 72 6f 77 45 72  les(bool throwEr
79d0: 72 6f 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ror)..    {..   
79e0: 20 20 20 2f 2f 73 74 72 69 6e 67 5b 5d 20 61 72     //string[] ar
79f0: 72 20 3d 20 6e 65 77 20 73 74 72 69 6e 67 5b 5d  r = new string[]
7a00: 20 7b 20 22 54 65 73 74 43 61 73 65 22 2c 20 22   { "TestCase", "
7a10: 64 61 74 61 74 79 70 65 74 65 73 74 22 2c 20 22  datatypetest", "
7a20: 4d 75 6c 74 69 54 68 72 65 61 64 65 64 54 65 73  MultiThreadedTes
7a30: 74 22 2c 20 22 66 75 6c 6c 74 65 78 74 22 2c 20  t", "fulltext", 
7a40: 22 67 75 69 64 74 65 73 74 22 2c 20 22 6b 65 79  "guidtest", "key
7a50: 69 6e 66 6f 74 65 73 74 22 2c 20 22 73 74 65 70  infotest", "step
7a60: 72 65 61 64 65 72 22 2c 20 22 6e 6f 6e 65 78 69  reader", "nonexi
7a70: 73 74 65 6e 74 22 20 7d 3b 0d 0a 20 20 20 20 20  stent" };..     
7a80: 20 73 74 72 69 6e 67 20 65 72 72 6f 72 73 20 3d   string errors =
7a90: 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 3b 0d 0a   String.Empty;..
7aa0: 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
7ab0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
7ac0: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
7ad0: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
7ae0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 28 73         foreach(s
7af0: 74 72 69 6e 67 20 74 61 62 6c 65 20 69 6e 20 64  tring table in d
7b00: 72 6f 70 74 61 62 6c 65 73 29 0d 0a 20 20 20 20  roptables)..    
7b10: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7b20: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20   try..          
7b30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
7b40: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
7b50: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
7b60: 44 52 4f 50 20 54 41 42 4c 45 7b 31 7d 20 5b 7b  DROP TABLE{1} [{
7b70: 30 7d 5d 22 2c 20 74 61 62 6c 65 2c 20 28 74 68  0}]", table, (th
7b80: 72 6f 77 45 72 72 6f 72 20 3d 3d 20 66 61 6c 73  rowError == fals
7b90: 65 29 20 3f 20 22 20 49 46 20 45 58 49 53 54 53  e) ? " IF EXISTS
7ba0: 22 20 3a 20 22 22 29 3b 0d 0a 20 20 20 20 20 20  " : "");..      
7bb0: 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74        cmd.Execut
7bc0: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20  eNonQuery();..  
7bd0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7be0: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
7bf0: 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20  ption e)..      
7c00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7c10: 20 20 20 69 66 20 28 74 68 72 6f 77 45 72 72 6f     if (throwErro
7c20: 72 20 3d 3d 20 74 72 75 65 29 0d 0a 20 20 20 20  r == true)..    
7c30: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73            errors
7c40: 20 2b 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61   += String.Forma
7c50: 74 28 22 7b 30 7d 5c 72 5c 6e 22 2c 20 65 2e 4d  t("{0}\r\n", e.M
7c60: 65 73 73 61 67 65 29 3b 0d 0a 20 20 20 20 20 20  essage);..      
7c70: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
7c80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65  ....        fore
7c90: 61 63 68 20 28 73 74 72 69 6e 67 20 74 61 62 6c  ach (string tabl
7ca0: 65 20 69 6e 20 6d 61 79 64 72 6f 70 74 61 62 6c  e in maydroptabl
7cb0: 65 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  e)..        {.. 
7cc0: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
7cd0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
7ce0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
7cf0: 6e 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67 2e  ndText = String.
7d00: 46 6f 72 6d 61 74 28 22 44 52 4f 50 20 54 41 42  Format("DROP TAB
7d10: 4c 45 7b 31 7d 20 5b 7b 30 7d 5d 22 2c 20 74 61  LE{1} [{0}]", ta
7d20: 62 6c 65 2c 20 28 74 68 72 6f 77 45 72 72 6f 72  ble, (throwError
7d30: 20 3d 3d 20 66 61 6c 73 65 29 20 3f 20 22 20 49   == false) ? " I
7d40: 46 20 45 58 49 53 54 53 22 20 3a 20 22 22 29 3b  F EXISTS" : "");
7d50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
7d60: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
7d70: 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  y();..          
7d80: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  }..          cat
7d90: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29 0d 0a  ch (Exception)..
7da0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
7db0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7dc0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
7dd0: 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67        if (String
7de0: 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 65  .IsNullOrEmpty(e
7df0: 72 72 6f 72 73 29 20 3d 3d 20 66 61 6c 73 65 29  rrors) == false)
7e00: 0d 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20  ..        throw 
7e10: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 65 72  new Exception(er
7e20: 72 6f 72 73 29 3b 0d 0a 0d 0a 20 20 20 20 7d 0d  rors);....    }.
7e30: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71  ...    [Test(Seq
7e40: 75 65 6e 63 65 20 3d 20 31 30 30 30 29 5d 0d 0a  uence = 1000)]..
7e50: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72      internal str
7e60: 69 6e 67 20 46 61 73 74 49 6e 73 65 72 74 4d 61  ing FastInsertMa
7e70: 6e 79 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ny()..    {..   
7e80: 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72     StringBuilder
7e90: 20 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53   builder = new S
7ea0: 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0d  tringBuilder();.
7eb0: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
7ec0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 64 62 54 72  Transaction dbTr
7ed0: 61 6e 73 20 3d 20 5f 63 6e 6e 2e 42 65 67 69 6e  ans = _cnn.Begin
7ee0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 0d 0a  Transaction())..
7ef0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
7f00: 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 20   int dtStart;.. 
7f10: 20 20 20 20 20 20 20 69 6e 74 20 64 74 45 6e 64         int dtEnd
7f20: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 73 69  ;....        usi
7f30: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
7f40: 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
7f50: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
7f60: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7f70: 63 6d 64 2e 54 72 61 6e 73 61 63 74 69 6f 6e 20  cmd.Transaction 
7f80: 3d 20 64 62 54 72 61 6e 73 3b 0d 0a 20 20 20 20  = dbTrans;..    
7f90: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
7fa0: 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20  dText = "INSERT 
7fb0: 49 4e 54 4f 20 54 65 73 74 43 61 73 65 28 46 69  INTO TestCase(Fi
7fc0: 65 6c 64 31 29 20 56 41 4c 55 45 53 28 40 70 31  eld1) VALUES(@p1
7fd0: 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 44  )";..          D
7fe0: 62 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64  bParameter Field
7ff0: 31 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61  1 = cmd.CreatePa
8000: 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20  rameter();....  
8010: 20 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e 50          Field1.P
8020: 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22  arameterName = "
8030: 40 70 31 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  @p1";..         
8040: 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e   cmd.Parameters.
8050: 41 64 64 28 46 69 65 6c 64 31 29 3b 0d 0a 0d 0a  Add(Field1);....
8060: 20 20 20 20 20 20 20 20 20 20 2f 2f 43 6f 6e 73            //Cons
8070: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 53 74  ole.WriteLine(St
8080: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 20 20 20  ring.Format("   
8090: 20 20 20 20 20 20 20 46 61 73 74 20 69 6e 73 65         Fast inse
80a0: 72 74 20 75 73 69 6e 67 20 70 61 72 61 6d 65 74  rt using paramet
80b0: 65 72 73 20 61 6e 64 20 70 72 65 70 61 72 65 64  ers and prepared
80c0: 20 73 74 61 74 65 6d 65 6e 74 5c 72 5c 6e 20 20   statement\r\n  
80d0: 20 20 20 20 20 20 20 20 2d 3e 20 28 31 30 30 2c          -> (100,
80e0: 30 30 30 20 72 6f 77 73 29 20 42 65 67 69 6e 73  000 rows) Begins
80f0: 20 2e 2e 2e 20 22 29 29 3b 0d 0a 20 20 20 20 20   ... "));..     
8100: 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45       dtStart = E
8110: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
8120: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  ount;..         
8130: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
8140: 20 6e 20 3c 20 31 30 30 30 30 30 3b 20 6e 2b 2b   n < 100000; n++
8150: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
8160: 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c              Fiel
8170: 64 31 2e 56 61 6c 75 65 20 3d 20 6e 20 2b 20 32  d1.Value = n + 2
8180: 30 30 30 30 30 3b 0d 0a 20 20 20 20 20 20 20 20  00000;..        
8190: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
81a0: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
81b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
81c0: 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45 6e 76       dtEnd = Env
81d0: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
81e0: 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64  nt;..          d
81f0: 74 45 6e 64 20 2d 3d 20 64 74 53 74 61 72 74 3b  tEnd -= dtStart;
8200: 0d 0a 20 20 20 20 20 20 20 20 20 20 62 75 69 6c  ..          buil
8210: 64 65 72 2e 41 70 70 65 6e 64 46 6f 72 6d 61 74  der.AppendFormat
8220: 28 22 45 6e 64 73 20 69 6e 20 7b 30 7d 20 6d 73  ("Ends in {0} ms
8230: 20 2e 2e 2e 20 22 2c 20 28 64 74 45 6e 64 29 29   ... ", (dtEnd))
8240: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
8250: 20 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20          dtStart 
8260: 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
8270: 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20  ckCount;..      
8280: 20 20 64 62 54 72 61 6e 73 2e 43 6f 6d 6d 69 74    dbTrans.Commit
8290: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 45  ();..        dtE
82a0: 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  nd = Environment
82b0: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
82c0: 20 20 20 20 20 64 74 45 6e 64 20 2d 3d 20 64 74       dtEnd -= dt
82d0: 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20  Start;..        
82e0: 62 75 69 6c 64 65 72 2e 41 70 70 65 6e 64 46 6f  builder.AppendFo
82f0: 72 6d 61 74 28 22 43 6f 6d 6d 69 74 73 20 69 6e  rmat("Commits in
8300: 20 7b 30 7d 20 6d 73 22 2c 20 28 64 74 45 6e 64   {0} ms", (dtEnd
8310: 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ));..      }..  
8320: 20 20 20 20 72 65 74 75 72 6e 20 62 75 69 6c 64      return build
8330: 65 72 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a  er.ToString();..
8340: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
8350: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
8360: 6c 20 76 6f 69 64 20 46 75 6c 6c 54 65 78 74 54  l void FullTextT
8370: 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
8380: 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28      CheckSQLite(
8390: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e  );....      usin
83a0: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
83b0: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
83c0: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
83d0: 7b 0d 0a 20 20 20 20 20 20 20 20 64 72 6f 70 74  {..        dropt
83e0: 61 62 6c 65 73 2e 41 64 64 28 22 46 75 6c 6c 54  ables.Add("FullT
83f0: 65 78 74 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ext");..        
8400: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
8410: 3d 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  = "CREATE VIRTUA
8420: 4c 20 54 41 42 4c 45 20 46 75 6c 6c 54 65 78 74  L TABLE FullText
8430: 20 55 53 49 4e 47 20 46 54 53 33 28 6e 61 6d 65   USING FTS3(name
8440: 2c 20 69 6e 67 72 65 64 69 65 6e 74 73 29 3b 22  , ingredients);"
8450: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45  ;..        cmd.E
8460: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
8470: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 74 72  ;....        str
8480: 69 6e 67 5b 5d 20 6e 61 6d 65 73 20 3d 20 7b 20  ing[] names = { 
8490: 22 62 72 6f 63 63 6f 6c 69 20 73 74 65 77 22 2c  "broccoli stew",
84a0: 20 22 70 75 6d 70 6b 69 6e 20 73 74 65 77 22 2c   "pumpkin stew",
84b0: 20 22 62 72 6f 63 63 6f 6c 69 20 70 69 65 22 2c   "broccoli pie",
84c0: 20 22 70 75 6d 70 6b 69 6e 20 70 69 65 22 20 7d   "pumpkin pie" }
84d0: 3b 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ;..        strin
84e0: 67 5b 5d 20 69 6e 67 72 65 64 69 65 6e 74 73 20  g[] ingredients 
84f0: 3d 20 7b 20 22 62 72 6f 63 63 6f 6c 69 20 70 65  = { "broccoli pe
8500: 70 70 65 72 73 20 63 68 65 65 73 65 20 74 6f 6d  ppers cheese tom
8510: 61 74 6f 65 73 22 2c 20 22 70 75 6d 70 6b 69 6e  atoes", "pumpkin
8520: 20 6f 6e 69 6f 6e 73 20 67 61 72 6c 69 63 20 63   onions garlic c
8530: 65 6c 65 72 79 22 2c 20 22 62 72 6f 63 63 6f 6c  elery", "broccol
8540: 69 20 63 68 65 65 73 65 20 6f 6e 69 6f 6e 73 20  i cheese onions 
8550: 66 6c 6f 75 72 22 2c 20 22 70 75 6d 70 6b 69 6e  flour", "pumpkin
8560: 20 73 75 67 61 72 20 66 6c 6f 75 72 20 62 75 74   sugar flour but
8570: 74 65 72 22 20 7d 3b 0d 0a 20 20 20 20 20 20 20  ter" };..       
8580: 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 20 20 20 20 20   int n;....     
8590: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
85a0: 78 74 20 3d 20 22 69 6e 73 65 72 74 20 69 6e 74  xt = "insert int
85b0: 6f 20 46 75 6c 6c 54 65 78 74 20 28 6e 61 6d 65  o FullText (name
85c0: 2c 20 69 6e 67 72 65 64 69 65 6e 74 73 29 20 76  , ingredients) v
85d0: 61 6c 75 65 73 20 28 40 6e 61 6d 65 2c 20 40 69  alues (@name, @i
85e0: 6e 67 72 65 64 69 65 6e 74 29 3b 22 3b 0d 0a 20  ngredient);";.. 
85f0: 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65 74         DbParamet
8600: 65 72 20 6e 61 6d 65 20 3d 20 63 6d 64 2e 43 72  er name = cmd.Cr
8610: 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b  eateParameter();
8620: 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61  ..        DbPara
8630: 6d 65 74 65 72 20 69 6e 67 72 65 64 69 65 6e 74  meter ingredient
8640: 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72   = cmd.CreatePar
8650: 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20  ameter();....   
8660: 20 20 20 20 20 6e 61 6d 65 2e 50 61 72 61 6d 65       name.Parame
8670: 74 65 72 4e 61 6d 65 20 3d 20 22 40 6e 61 6d 65  terName = "@name
8680: 22 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 67 72  ";..        ingr
8690: 65 64 69 65 6e 74 2e 50 61 72 61 6d 65 74 65 72  edient.Parameter
86a0: 4e 61 6d 65 20 3d 20 22 40 69 6e 67 72 65 64 69  Name = "@ingredi
86b0: 65 6e 74 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ent";....       
86c0: 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e   cmd.Parameters.
86d0: 41 64 64 28 6e 61 6d 65 29 3b 0d 0a 20 20 20 20  Add(name);..    
86e0: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
86f0: 72 73 2e 41 64 64 28 69 6e 67 72 65 64 69 65 6e  rs.Add(ingredien
8700: 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  t);....        f
8710: 6f 72 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 6e  or (n = 0; n < n
8720: 61 6d 65 73 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b  ames.Length; n++
8730: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
8740: 20 20 20 20 20 20 20 20 6e 61 6d 65 2e 56 61 6c          name.Val
8750: 75 65 20 3d 20 6e 61 6d 65 73 5b 6e 5d 3b 0d 0a  ue = names[n];..
8760: 20 20 20 20 20 20 20 20 20 20 69 6e 67 72 65 64            ingred
8770: 69 65 6e 74 2e 56 61 6c 75 65 20 3d 20 69 6e 67  ient.Value = ing
8780: 72 65 64 69 65 6e 74 73 5b 6e 5d 3b 0d 0a 0d 0a  redients[n];....
8790: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
87a0: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
87b0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
87c0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
87d0: 6e 64 54 65 78 74 20 3d 20 22 73 65 6c 65 63 74  ndText = "select
87e0: 20 72 6f 77 69 64 2c 20 6e 61 6d 65 2c 20 69 6e   rowid, name, in
87f0: 67 72 65 64 69 65 6e 74 73 20 66 72 6f 6d 20 46  gredients from F
8800: 75 6c 6c 54 65 78 74 20 77 68 65 72 65 20 6e 61  ullText where na
8810: 6d 65 20 6d 61 74 63 68 20 27 70 69 65 27 3b 22  me match 'pie';"
8820: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ;..        cmd.P
8830: 61 72 61 6d 65 74 65 72 73 2e 43 6c 65 61 72 28  arameters.Clear(
8840: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e  );....        in
8850: 74 5b 5d 20 72 6f 77 69 64 73 20 3d 20 7b 20 33  t[] rowids = { 3
8860: 2c 20 34 20 7d 3b 0d 0a 20 20 20 20 20 20 20 20  , 4 };..        
8870: 6e 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 20  n = 0;....      
8880: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
8890: 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20 63  eader reader = c
88a0: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
88b0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
88c0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
88d0: 28 72 65 61 64 65 72 2e 52 65 61 64 28 29 29 0d  (reader.Read()).
88e0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
88f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65            if (re
8900: 61 64 65 72 2e 47 65 74 49 6e 74 36 34 28 30 29  ader.GetInt64(0)
8910: 20 21 3d 20 72 6f 77 69 64 73 5b 6e 2b 2b 5d 29   != rowids[n++])
8920: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8930: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
8940: 69 6f 6e 28 22 55 6e 65 78 70 65 63 74 65 64 20  ion("Unexpected 
8950: 72 6f 77 69 64 20 72 65 74 75 72 6e 65 64 22 29  rowid returned")
8960: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
8970: 20 69 66 20 28 6e 20 3e 20 72 6f 77 69 64 73 2e   if (n > rowids.
8980: 4c 65 6e 67 74 68 29 20 74 68 72 6f 77 20 6e 65  Length) throw ne
8990: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 54 6f 6f  w Exception("Too
89a0: 20 6d 61 6e 79 20 72 6f 77 73 20 72 65 74 75 72   many rows retur
89b0: 6e 65 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ned");..        
89c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
89d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
89e0: 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20  ..    [Test]..  
89f0: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
8a00: 47 75 69 64 54 65 73 74 28 29 0d 0a 20 20 20 20  GuidTest()..    
8a10: 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  {..      using (
8a20: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
8a30: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
8a40: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
8a50: 20 20 20 20 20 20 20 20 47 75 69 64 20 67 75 69          Guid gui
8a60: 64 20 3d 20 47 75 69 64 2e 4e 65 77 47 75 69 64  d = Guid.NewGuid
8a70: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64  ();....        d
8a80: 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28 22 47  roptables.Add("G
8a90: 75 69 64 54 65 73 74 22 29 3b 0d 0a 0d 0a 20 20  uidTest");....  
8aa0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
8ab0: 64 54 65 78 74 20 3d 20 22 43 52 45 41 54 45 20  dText = "CREATE 
8ac0: 54 41 42 4c 45 20 47 75 69 64 54 65 73 74 28 4d  TABLE GuidTest(M
8ad0: 79 47 75 69 64 20 75 6e 69 71 75 65 69 64 65 6e  yGuid uniqueiden
8ae0: 74 69 66 69 65 72 29 22 3b 0d 0a 20 20 20 20 20  tifier)";..     
8af0: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
8b00: 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20  nQuery();....   
8b10: 20 20 20 20 20 2f 2f 20 49 6e 73 65 72 74 20 61       // Insert a
8b20: 20 67 75 69 64 20 61 73 20 61 20 64 65 66 61 75   guid as a defau
8b30: 6c 74 20 62 69 6e 61 72 79 20 72 65 70 72 65 73  lt binary repres
8b40: 65 6e 74 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  entation..      
8b50: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
8b60: 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  t = "INSERT INTO
8b70: 20 47 75 69 64 54 65 73 74 28 4d 79 47 75 69 64   GuidTest(MyGuid
8b80: 29 20 56 41 4c 55 45 53 28 40 62 29 22 3b 0d 0a  ) VALUES(@b)";..
8b90: 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65          DbParame
8ba0: 74 65 72 20 70 61 72 6d 20 3d 20 63 6d 64 2e 43  ter parm = cmd.C
8bb0: 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29  reateParameter()
8bc0: 3b 0d 0a 20 20 20 20 20 20 20 20 70 61 72 6d 2e  ;..        parm.
8bd0: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
8be0: 22 40 62 22 3b 0d 0a 20 20 20 20 20 20 20 20 70  "@b";..        p
8bf0: 61 72 6d 2e 56 61 6c 75 65 20 3d 20 67 75 69 64  arm.Value = guid
8c00: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ;..        cmd.P
8c10: 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 70 61  arameters.Add(pa
8c20: 72 6d 29 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  rm);..        //
8c30: 28 28 53 51 4c 69 74 65 50 61 72 61 6d 65 74 65  ((SQLiteParamete
8c40: 72 43 6f 6c 6c 65 63 74 69 6f 6e 29 63 6d 64 2e  rCollection)cmd.
8c50: 50 61 72 61 6d 65 74 65 72 73 29 2e 41 64 64 57  Parameters).AddW
8c60: 69 74 68 56 61 6c 75 65 28 22 40 62 22 2c 20 67  ithValue("@b", g
8c70: 75 69 64 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  uid);....       
8c80: 20 2f 2f 20 49 6e 73 65 72 74 20 61 20 67 75 69   // Insert a gui
8c90: 64 20 61 73 20 74 65 78 74 0d 0a 20 20 20 20 20  d as text..     
8ca0: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
8cb0: 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
8cc0: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
8cd0: 73 5b 30 5d 2e 56 61 6c 75 65 20 3d 20 67 75 69  s[0].Value = gui
8ce0: 64 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 20  d.ToString();.. 
8cf0: 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d         cmd.Param
8d00: 65 74 65 72 73 5b 30 5d 2e 44 62 54 79 70 65 20  eters[0].DbType 
8d10: 3d 20 44 62 54 79 70 65 2e 53 74 72 69 6e 67 3b  = DbType.String;
8d20: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78  ..        cmd.Ex
8d30: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
8d40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ....        cmd.
8d50: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
8d60: 45 4c 45 43 54 20 4d 79 47 75 69 64 20 46 52 4f  ELECT MyGuid FRO
8d70: 4d 20 47 75 69 64 54 65 73 74 22 3b 0d 0a 20 20  M GuidTest";..  
8d80: 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65        cmd.Parame
8d90: 74 65 72 73 2e 43 6c 65 61 72 28 29 3b 0d 0a 0d  ters.Clear();...
8da0: 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28  .        using (
8db0: 44 62 44 61 74 61 52 65 61 64 65 72 20 72 65 61  DbDataReader rea
8dc0: 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74  der = cmd.Execut
8dd0: 65 52 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20  eReader())..    
8de0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8df0: 20 72 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d   reader.Read();.
8e00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72  .          if (r
8e10: 65 61 64 65 72 2e 47 65 74 46 69 65 6c 64 54 79  eader.GetFieldTy
8e20: 70 65 28 30 29 20 21 3d 20 74 79 70 65 6f 66 28  pe(0) != typeof(
8e30: 47 75 69 64 29 29 20 74 68 72 6f 77 20 6e 65 77  Guid)) throw new
8e40: 20 45 78 63 65 70 74 69 6f 6e 28 22 43 6f 6c 75   Exception("Colu
8e50: 6d 6e 20 69 73 20 6e 6f 74 20 61 20 47 75 69 64  mn is not a Guid
8e60: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ");..          i
8e70: 66 20 28 72 65 61 64 65 72 2e 47 65 74 47 75 69  f (reader.GetGui
8e80: 64 28 30 29 20 21 3d 20 67 75 69 64 29 20 74 68  d(0) != guid) th
8e90: 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f  row new Exceptio
8ea0: 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n(String.Format(
8eb0: 22 47 6f 74 20 67 75 69 64 20 7b 30 7d 2c 20 65  "Got guid {0}, e
8ec0: 78 70 65 63 74 65 64 20 7b 31 7d 22 2c 20 72 65  xpected {1}", re
8ed0: 61 64 65 72 2e 47 65 74 47 75 69 64 28 30 29 2c  ader.GetGuid(0),
8ee0: 20 67 75 69 64 29 29 3b 0d 0a 0d 0a 20 20 20 20   guid));....    
8ef0: 20 20 20 20 20 20 72 65 61 64 65 72 2e 52 65 61        reader.Rea
8f00: 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  d();..          
8f10: 69 66 20 28 72 65 61 64 65 72 2e 47 65 74 46 69  if (reader.GetFi
8f20: 65 6c 64 54 79 70 65 28 30 29 20 21 3d 20 74 79  eldType(0) != ty
8f30: 70 65 6f 66 28 47 75 69 64 29 29 20 74 68 72 6f  peof(Guid)) thro
8f40: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
8f50: 22 43 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 61  "Column is not a
8f60: 20 47 75 69 64 22 29 3b 0d 0a 20 20 20 20 20 20   Guid");..      
8f70: 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e 47      if (reader.G
8f80: 65 74 47 75 69 64 28 30 29 20 21 3d 20 67 75 69  etGuid(0) != gui
8f90: 64 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  d) throw new Exc
8fa0: 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f  eption(String.Fo
8fb0: 72 6d 61 74 28 22 47 6f 74 20 67 75 69 64 20 7b  rmat("Got guid {
8fc0: 30 7d 2c 20 65 78 70 65 63 74 65 64 20 7b 31 7d  0}, expected {1}
8fd0: 22 2c 20 72 65 61 64 65 72 2e 47 65 74 47 75 69  ", reader.GetGui
8fe0: 64 28 30 29 2c 20 67 75 69 64 29 29 3b 0d 0a 20  d(0), guid));.. 
8ff0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9000: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
9010: 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d  [Test(Sequence =
9020: 20 32 30 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72   20)]..    inter
9030: 6e 61 6c 20 76 6f 69 64 20 49 6e 73 65 72 74 54  nal void InsertT
9040: 61 62 6c 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  able()..    {.. 
9050: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
9060: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e  mmand cmd = _cnn
9070: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
9080: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
9090: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
90a0: 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e  ext = "INSERT IN
90b0: 54 4f 20 54 65 73 74 43 61 73 65 28 46 69 65 6c  TO TestCase(Fiel
90c0: 64 31 2c 20 46 69 65 6c 64 32 2c 20 5b 46 69 c3  d1, Field2, [Fi.
90d0: ab 6c 64 33 5d 2c 20 5b 46 69 c3 a6 6c 64 34 5d  .ld3], [Fi..ld4]
90e0: 2c 20 46 69 65 6c 64 35 29 20 56 41 4c 55 45 53  , Field5) VALUES
90f0: 28 31 2c 20 33 2e 31 34 31 35 39 2c 20 27 46 69  (1, 3.14159, 'Fi
9100: c3 ab 6c 64 33 27 2c 20 27 46 69 c3 a6 6c 64 34  ..ld3', 'Fi..ld4
9110: 27 2c 20 27 32 30 30 35 2d 30 31 2d 30 31 20 31  ', '2005-01-01 1
9120: 33 3a 34 39 3a 30 30 27 29 22 3b 0d 0a 20 20 20  3:49:00')";..   
9130: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
9140: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
9150: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
9160: 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69     [Test]..    i
9170: 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 49  nternal string I
9180: 74 65 72 61 74 69 6f 6e 54 65 73 74 31 28 29 0d  terationTest1().
9190: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68  .    {..      Ch
91a0: 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 20 20  eckSQLite();..  
91b0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
91c0: 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e  mand cmd = _cnn.
91d0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
91e0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
91f0: 20 20 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d     int dtStart;.
9200: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 45  .        int dtE
9210: 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  nd;..        int
9220: 20 6e 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20   nCount;..      
9230: 20 20 6c 6f 6e 67 20 6e 3b 0d 0a 0d 0a 20 20 20    long n;....   
9240: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
9250: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 46  Text = "SELECT F
9260: 6f 6f 28 49 44 2c 20 49 44 29 20 46 52 4f 4d 20  oo(ID, ID) FROM 
9270: 54 65 73 74 43 61 73 65 22 3b 0d 0a 20 20 20 20  TestCase";..    
9280: 20 20 20 20 63 6d 64 2e 50 72 65 70 61 72 65 28      cmd.Prepare(
9290: 29 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53 74  );..        dtSt
92a0: 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  art = Environmen
92b0: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
92c0: 20 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 30        nCount = 0
92d0: 3b 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ;..        using
92e0: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
92f0: 64 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  d = cmd.ExecuteR
9300: 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20  eader())..      
9310: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 77    {..          w
9320: 68 69 6c 65 20 28 72 64 2e 52 65 61 64 28 29 29  hile (rd.Read())
9330: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
9340: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 72             n = r
9350: 64 2e 47 65 74 49 6e 74 36 34 28 30 29 3b 0d 0a  d.GetInt64(0);..
9360: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 75              nCou
9370: 6e 74 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20  nt++;..         
9380: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 64 74   }..          dt
9390: 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  End = Environmen
93a0: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
93b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
93c0: 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46   return String.F
93d0: 6f 72 6d 61 74 28 22 55 73 65 72 20 46 75 6e 63  ormat("User Func
93e0: 74 69 6f 6e 20 69 74 65 72 61 74 69 6f 6e 20 6f  tion iteration o
93f0: 66 20 7b 30 7d 20 72 65 63 6f 72 64 73 20 69 6e  f {0} records in
9400: 20 7b 31 7d 20 6d 73 22 2c 20 6e 43 6f 75 6e 74   {1} ms", nCount
9410: 2c 20 28 64 74 45 6e 64 20 2d 20 64 74 53 74 61  , (dtEnd - dtSta
9420: 72 74 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  rt));..      }..
9430: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
9440: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
9450: 6c 20 73 74 72 69 6e 67 20 49 74 65 72 61 74 69  l string Iterati
9460: 6f 6e 54 65 73 74 32 28 29 0d 0a 20 20 20 20 7b  onTest2()..    {
9470: 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67 42 75  ..      StringBu
9480: 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20 3d 20  ilder builder = 
9490: 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65  new StringBuilde
94a0: 72 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e  r();..      usin
94b0: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
94c0: 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f   = _cnn.CreateCo
94d0: 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20  mmand())..      
94e0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  {..        int d
94f0: 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20  tStart;..       
9500: 20 69 6e 74 20 64 74 45 6e 64 3b 0d 0a 20 20 20   int dtEnd;..   
9510: 20 20 20 20 20 69 6e 74 20 6e 43 6f 75 6e 74 3b       int nCount;
9520: 0d 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6e  ..        long n
9530: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ;....        cmd
9540: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
9550: 53 45 4c 45 43 54 20 49 44 20 46 52 4f 4d 20 54  SELECT ID FROM T
9560: 65 73 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20  estCase";..     
9570: 20 20 20 63 6d 64 2e 50 72 65 70 61 72 65 28 29     cmd.Prepare()
9580: 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53 74 61  ;..        dtSta
9590: 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  rt = Environment
95a0: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
95b0: 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 30 3b       nCount = 0;
95c0: 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ..        using 
95d0: 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64  (DbDataReader rd
95e0: 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
95f0: 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
9600: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 77 68   {..          wh
9610: 69 6c 65 20 28 72 64 2e 52 65 61 64 28 29 29 0d  ile (rd.Read()).
9620: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
9630: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 72 64            n = rd
9640: 2e 47 65 74 49 6e 74 36 34 28 30 29 3b 0d 0a 20  .GetInt64(0);.. 
9650: 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 75 6e             nCoun
9660: 74 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  t++;..          
9670: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 64 74 45  }..          dtE
9680: 6e 64 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  nd = Environment
9690: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20  .TickCount;..   
96a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
96b0: 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f  return String.Fo
96c0: 72 6d 61 74 28 22 52 61 77 20 69 74 65 72 61 74  rmat("Raw iterat
96d0: 69 6f 6e 20 6f 66 20 7b 30 7d 20 72 65 63 6f 72  ion of {0} recor
96e0: 64 73 20 69 6e 20 7b 31 7d 20 6d 73 22 2c 20 6e  ds in {1} ms", n
96f0: 43 6f 75 6e 74 2c 20 28 64 74 45 6e 64 20 2d 20  Count, (dtEnd - 
9700: 64 74 53 74 61 72 74 29 29 3b 0d 0a 20 20 20 20  dtStart));..    
9710: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
9720: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
9730: 74 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 49 74  ternal string It
9740: 65 72 61 74 69 6f 6e 54 65 73 74 33 28 29 0d 0a  erationTest3()..
9750: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 74 72      {..      Str
9760: 69 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c 64  ingBuilder build
9770: 65 72 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42  er = new StringB
9780: 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20  uilder();..     
9790: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
97a0: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
97b0: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
97c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
97d0: 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 20 20  int dtStart;..  
97e0: 20 20 20 20 20 20 69 6e 74 20 64 74 45 6e 64 3b        int dtEnd;
97f0: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ..        int nC
9800: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 6c  ount;..        l
9810: 6f 6e 67 20 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20  ong n;....      
9820: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
9830: 74 20 3d 20 22 53 45 4c 45 43 54 20 41 42 53 28  t = "SELECT ABS(
9840: 49 44 29 20 46 52 4f 4d 20 54 65 73 74 43 61 73  ID) FROM TestCas
9850: 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  e";..        cmd
9860: 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a 20 20 20  .Prepare();..   
9870: 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45       dtStart = E
9880: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
9890: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 6e  ount;..        n
98a0: 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20  Count = 0;..    
98b0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
98c0: 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64  aReader rd = cmd
98d0: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29  .ExecuteReader()
98e0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
98f0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 72          while (r
9900: 64 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20  d.Read())..     
9910: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9920: 20 20 20 20 6e 20 3d 20 72 64 2e 47 65 74 49 6e      n = rd.GetIn
9930: 74 36 34 28 30 29 3b 0d 0a 20 20 20 20 20 20 20  t64(0);..       
9940: 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b 0d 0a       nCount++;..
9950: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9960: 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45         dtEnd = E
9970: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
9980: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d  ount;..        }
9990: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
99a0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
99b0: 49 6e 74 72 69 6e 73 69 63 20 46 75 6e 63 74 69  Intrinsic Functi
99c0: 6f 6e 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  on iteration of 
99d0: 7b 30 7d 20 72 65 63 6f 72 64 73 20 69 6e 20 7b  {0} records in {
99e0: 31 7d 20 6d 73 22 2c 20 6e 43 6f 75 6e 74 2c 20  1} ms", nCount, 
99f0: 28 64 74 45 6e 64 20 2d 20 64 74 53 74 61 72 74  (dtEnd - dtStart
9a00: 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ));..      }..  
9a10: 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
9a20: 28 53 65 71 75 65 6e 63 65 3d 32 31 29 5d 0d 0a  (Sequence=21)]..
9a30: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
9a40: 64 20 4b 65 79 49 6e 66 6f 54 65 73 74 28 29 0d  d KeyInfoTest().
9a50: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73  .    {..      us
9a60: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
9a70: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
9a80: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
9a90: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79    {..        try
9aa0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
9ab0: 20 20 20 20 20 20 20 2f 2f 20 46 69 72 73 74 20         // First 
9ac0: 74 65 73 74 20 61 67 61 69 6e 73 74 20 69 6e 74  test against int
9ad0: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
9ae0: 20 28 6f 70 74 69 6d 69 7a 65 64 29 20 6b 65 79   (optimized) key
9af0: 69 6e 66 6f 20 66 65 74 63 68 0d 0a 20 20 20 20  info fetch..    
9b00: 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
9b10: 2e 41 64 64 28 22 6b 65 79 69 6e 66 6f 74 65 73  .Add("keyinfotes
9b20: 74 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  t");..          
9b30: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
9b40: 3d 20 22 43 72 65 61 74 65 20 74 61 62 6c 65 20  = "Create table 
9b50: 6b 65 79 69 6e 66 6f 74 65 73 74 20 28 69 64 20  keyinfotest (id 
9b60: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
9b70: 6b 65 79 2c 20 6d 79 75 6e 69 71 75 65 76 61 6c  key, myuniqueval
9b80: 75 65 20 69 6e 74 65 67 65 72 20 75 6e 69 71 75  ue integer uniqu
9b90: 65 20 6e 6f 74 20 6e 75 6c 6c 2c 20 6d 79 76 61  e not null, myva
9ba0: 6c 75 65 20 76 61 72 63 68 61 72 28 35 30 29 29  lue varchar(50))
9bb0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d  ";..          cm
9bc0: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
9bd0: 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y();....        
9be0: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
9bf0: 74 20 3d 20 22 53 65 6c 65 63 74 20 2a 20 66 72  t = "Select * fr
9c00: 6f 6d 20 6b 65 79 69 6e 66 6f 74 65 73 74 22 3b  om keyinfotest";
9c10: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e  ..          usin
9c20: 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20  g (DbDataReader 
9c30: 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65  reader = cmd.Exe
9c40: 63 75 74 65 52 65 61 64 65 72 28 43 6f 6d 6d 61  cuteReader(Comma
9c50: 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65 79 49 6e  ndBehavior.KeyIn
9c60: 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64 42 65 68 61  fo | CommandBeha
9c70: 76 69 6f 72 2e 53 63 68 65 6d 61 4f 6e 6c 79 29  vior.SchemaOnly)
9c80: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
9ca0: 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c  g (DataTable tbl
9cb0: 20 3d 20 72 65 61 64 65 72 2e 47 65 74 53 63 68   = reader.GetSch
9cc0: 65 6d 61 54 61 62 6c 65 28 29 29 0d 0a 20 20 20  emaTable())..   
9cd0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
9ce0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 62            if (tb
9cf0: 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d 20  l.Rows.Count != 
9d00: 33 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  3) throw new Exc
9d10: 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e 75  eption("Wrong nu
9d20: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9d30: 72 65 74 75 72 6e 65 64 22 29 3b 0d 0a 20 20 20  returned");..   
9d40: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9d50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
9d60: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
9d70: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 4d  Text = "SELECT M
9d80: 79 56 61 6c 75 65 20 46 52 4f 4d 20 6b 65 79 69  yValue FROM keyi
9d90: 6e 66 6f 74 65 73 74 22 3b 0d 0a 20 20 20 20 20  nfotest";..     
9da0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
9db0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
9dc0: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
9dd0: 64 65 72 28 43 6f 6d 6d 61 6e 64 42 65 68 61 76  der(CommandBehav
9de0: 69 6f 72 2e 4b 65 79 49 6e 66 6f 20 7c 20 43 6f  ior.KeyInfo | Co
9df0: 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63  mmandBehavior.Sc
9e00: 68 65 6d 61 4f 6e 6c 79 29 29 0d 0a 20 20 20 20  hemaOnly))..    
9e10: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
9e20: 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74 61       using (Data
9e30: 54 61 62 6c 65 20 74 62 6c 20 3d 20 72 65 61 64  Table tbl = read
9e40: 65 72 2e 47 65 74 53 63 68 65 6d 61 54 61 62 6c  er.GetSchemaTabl
9e50: 65 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  e())..          
9e60: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
9e70: 20 20 20 69 66 20 28 74 62 6c 2e 52 6f 77 73 2e     if (tbl.Rows.
9e80: 43 6f 75 6e 74 20 21 3d 20 32 29 20 74 68 72 6f  Count != 2) thro
9e90: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
9ea0: 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "Wrong number of
9eb0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
9ec0: 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  d");..          
9ed0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
9ee0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9ef0: 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20       finally..  
9f00: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
9f10: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d   }....        cm
9f20: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
9f30: 22 44 52 4f 50 20 54 41 42 4c 45 20 6b 65 79 69  "DROP TABLE keyi
9f40: 6e 66 6f 74 65 73 74 22 3b 0d 0a 20 20 20 20 20  nfotest";..     
9f50: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
9f60: 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20  nQuery();....   
9f70: 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e       droptables.
9f80: 52 65 6d 6f 76 65 28 22 6b 65 79 69 6e 66 6f 74  Remove("keyinfot
9f90: 65 73 74 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  est");....      
9fa0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
9fb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e  ..          // N
9fc0: 6f 77 20 74 65 73 74 20 61 67 61 69 6e 73 74 20  ow test against 
9fd0: 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 70 72 69 6d  non-integer prim
9fe0: 61 72 79 20 6b 65 79 20 28 75 6e 6f 70 74 69 6d  ary key (unoptim
9ff0: 69 7a 65 64 29 20 73 75 62 71 75 65 72 79 20 6b  ized) subquery k
a000: 65 79 69 6e 66 6f 20 66 65 74 63 68 0d 0a 20 20  eyinfo fetch..  
a010: 20 20 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c          droptabl
a020: 65 73 2e 41 64 64 28 22 6b 65 79 69 6e 66 6f 74  es.Add("keyinfot
a030: 65 73 74 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  est");..        
a040: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
a050: 74 20 3d 20 22 43 72 65 61 74 65 20 74 61 62 6c  t = "Create tabl
a060: 65 20 6b 65 79 69 6e 66 6f 74 65 73 74 20 28 69  e keyinfotest (i
a070: 64 20 63 68 61 72 20 70 72 69 6d 61 72 79 20 6b  d char primary k
a080: 65 79 2c 20 6d 79 75 6e 69 71 75 65 76 61 6c 75  ey, myuniquevalu
a090: 65 20 69 6e 74 65 67 65 72 20 75 6e 69 71 75 65  e integer unique
a0a0: 20 6e 6f 74 20 6e 75 6c 6c 2c 20 6d 79 76 61 6c   not null, myval
a0b0: 75 65 20 76 61 72 63 68 61 72 28 35 30 29 29 22  ue varchar(50))"
a0c0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ;..          cmd
a0d0: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
a0e0: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
a0f0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
a100: 20 3d 20 22 53 45 4c 45 43 54 20 4d 79 56 61 6c   = "SELECT MyVal
a110: 75 65 20 46 52 4f 4d 20 6b 65 79 69 6e 66 6f 74  ue FROM keyinfot
a120: 65 73 74 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  est";..         
a130: 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65   using (DbDataRe
a140: 61 64 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d  ader reader = cm
a150: 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
a160: 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e  CommandBehavior.
a170: 4b 65 79 49 6e 66 6f 20 7c 20 43 6f 6d 6d 61 6e  KeyInfo | Comman
a180: 64 42 65 68 61 76 69 6f 72 2e 53 63 68 65 6d 61  dBehavior.Schema
a190: 4f 6e 6c 79 29 29 0d 0a 20 20 20 20 20 20 20 20  Only))..        
a1a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
a1b0: 20 75 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c   using (DataTabl
a1c0: 65 20 74 62 6c 20 3d 20 72 65 61 64 65 72 2e 47  e tbl = reader.G
a1d0: 65 74 53 63 68 65 6d 61 54 61 62 6c 65 28 29 29  etSchemaTable())
a1e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
a1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
a200: 66 20 28 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e  f (tbl.Rows.Coun
a210: 74 20 21 3d 20 32 29 20 74 68 72 6f 77 20 6e 65  t != 2) throw ne
a220: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 57 72 6f  w Exception("Wro
a230: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ng number of col
a240: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 22 29 3b  umns returned");
a250: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
a260: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
a270: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
a280: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 65 6c  mmandText = "Sel
a290: 65 63 74 20 2a 20 66 72 6f 6d 20 6b 65 79 69 6e  ect * from keyin
a2a0: 66 6f 74 65 73 74 22 3b 0d 0a 20 20 20 20 20 20  fotest";..      
a2b0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
a2c0: 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d  aReader reader =
a2d0: 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64   cmd.ExecuteRead
a2e0: 65 72 28 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69  er(CommandBehavi
a2f0: 6f 72 2e 4b 65 79 49 6e 66 6f 20 7c 20 43 6f 6d  or.KeyInfo | Com
a300: 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63 68  mandBehavior.Sch
a310: 65 6d 61 4f 6e 6c 79 29 29 0d 0a 20 20 20 20 20  emaOnly))..     
a320: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
a330: 20 20 20 20 75 73 69 6e 67 20 28 44 61 74 61 54      using (DataT
a340: 61 62 6c 65 20 74 62 6c 20 3d 20 72 65 61 64 65  able tbl = reade
a350: 72 2e 47 65 74 53 63 68 65 6d 61 54 61 62 6c 65  r.GetSchemaTable
a360: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ())..           
a370: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a380: 20 20 69 66 20 28 74 62 6c 2e 52 6f 77 73 2e 43    if (tbl.Rows.C
a390: 6f 75 6e 74 20 21 3d 20 33 29 20 74 68 72 6f 77  ount != 3) throw
a3a0: 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
a3b0: 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  Wrong number of 
a3c0: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a3d0: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
a3e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
a3f0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  ...          // 
a400: 4d 61 6b 65 20 73 75 72 65 20 63 6f 6d 6d 61 6e  Make sure comman
a410: 64 62 75 69 6c 64 65 72 20 63 61 6e 20 67 65 6e  dbuilder can gen
a420: 65 72 61 74 65 20 61 6e 20 75 70 64 61 74 65 20  erate an update 
a430: 63 6f 6d 6d 61 6e 64 20 77 69 74 68 20 74 68 65  command with the
a440: 20 63 6f 72 72 65 63 74 20 70 61 72 61 6d 65 74   correct paramet
a450: 65 72 20 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20  er count..      
a460: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
a470: 61 41 64 61 70 74 65 72 20 61 64 70 20 3d 20 5f  aAdapter adp = _
a480: 66 61 63 74 2e 43 72 65 61 74 65 44 61 74 61 41  fact.CreateDataA
a490: 64 61 70 74 65 72 28 29 29 0d 0a 20 20 20 20 20  dapter())..     
a4a0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
a4b0: 6d 6d 61 6e 64 42 75 69 6c 64 65 72 20 62 75 69  mmandBuilder bui
a4c0: 6c 64 65 72 20 3d 20 5f 66 61 63 74 2e 43 72 65  lder = _fact.Cre
a4d0: 61 74 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65  ateCommandBuilde
a4e0: 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  r())..          
a4f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
a500: 64 70 2e 53 65 6c 65 63 74 43 6f 6d 6d 61 6e 64  dp.SelectCommand
a510: 20 3d 20 63 6d 64 3b 0d 0a 20 20 20 20 20 20 20   = cmd;..       
a520: 20 20 20 20 20 62 75 69 6c 64 65 72 2e 44 61 74       builder.Dat
a530: 61 41 64 61 70 74 65 72 20 3d 20 61 64 70 3b 0d  aAdapter = adp;.
a540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69  .            bui
a550: 6c 64 65 72 2e 43 6f 6e 66 6c 69 63 74 4f 70 74  lder.ConflictOpt
a560: 69 6f 6e 20 3d 20 43 6f 6e 66 6c 69 63 74 4f 70  ion = ConflictOp
a570: 74 69 6f 6e 2e 4f 76 65 72 77 72 69 74 65 43 68  tion.OverwriteCh
a580: 61 6e 67 65 73 3b 0d 0a 0d 0a 20 20 20 20 20 20  anges;....      
a590: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
a5a0: 6f 6d 6d 61 6e 64 20 75 70 64 61 74 65 63 6d 64  ommand updatecmd
a5b0: 20 3d 20 62 75 69 6c 64 65 72 2e 47 65 74 55 70   = builder.GetUp
a5c0: 64 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  dateCommand())..
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
a5f0: 28 75 70 64 61 74 65 63 6d 64 2e 50 61 72 61 6d  (updatecmd.Param
a600: 65 74 65 72 73 2e 43 6f 75 6e 74 20 21 3d 20 34  eters.Count != 4
a610: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
a620: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63     throw new Exc
a630: 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e 75  eption("Wrong nu
a640: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
a650: 72 73 20 69 6e 20 75 70 64 61 74 65 20 63 6f 6d  rs in update com
a660: 6d 61 6e 64 21 22 29 3b 0d 0a 20 20 20 20 20 20  mand!");..      
a670: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
a680: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
a690: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79  .        finally
a6a0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
a6b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
a6c0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54  .    }....    [T
a6d0: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
a6e0: 61 6c 20 76 6f 69 64 20 43 6f 6e 6e 65 63 74 69  al void Connecti
a6f0: 6f 6e 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28  onStringBuilder(
a700: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
a710: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  DbConnectionStri
a720: 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65  ngBuilder builde
a730: 72 20 3d 20 5f 66 61 63 74 2e 43 72 65 61 74 65  r = _fact.Create
a740: 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67  ConnectionString
a750: 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20  Builder();..    
a760: 20 20 69 66 20 28 62 75 69 6c 64 65 72 20 69 73    if (builder is
a770: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
a780: 6e 53 74 72 69 6e 67 42 75 69 6c 64 65 72 29 0d  nStringBuilder).
a790: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
a7a0: 20 20 62 6f 6f 6c 20 70 6f 6f 6c 20 3d 20 28 28    bool pool = ((
a7b0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
a7c0: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 29 62 75  StringBuilder)bu
a7d0: 69 6c 64 65 72 29 2e 50 6f 6f 6c 69 6e 67 3b 0d  ilder).Pooling;.
a7e0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
a7f0: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20  ...    [Test].. 
a800: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
a810: 20 4c 65 61 6b 79 43 6f 6d 6d 61 6e 64 73 28 29   LeakyCommands()
a820: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 66  ..    {..      f
a830: 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e  or (int n = 0; n
a840: 20 3c 20 31 30 30 30 30 30 3b 20 6e 2b 2b 29 0d   < 100000; n++).
a850: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
a860: 20 20 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20    DbCommand cmd 
a870: 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
a880: 6d 61 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20 20  mand();..       
a890: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
a8a0: 20 3d 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f   = "SELECT * FRO
a8b0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
a8c0: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ;..        cmd.P
a8d0: 72 65 70 61 72 65 28 29 3b 0d 0a 20 20 20 20 20  repare();..     
a8e0: 20 7d 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 4c   }..      CheckL
a8f0: 6f 63 6b 65 64 28 29 3b 0d 0a 20 20 20 20 7d 0d  ocked();..    }.
a900: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71  ...    [Test(Seq
a910: 75 65 6e 63 65 20 3d 20 36 30 29 5d 0d 0a 20 20  uence = 60)]..  
a920: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
a930: 4c 6f 63 6b 54 65 73 74 28 29 0d 0a 20 20 20 20  LockTest()..    
a940: 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51  {..      CheckSQ
a950: 4c 69 74 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Lite();....     
a960: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
a970: 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65  d cmd = _cnn.Cre
a980: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20  ateCommand()).. 
a990: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
a9a0: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
a9b0: 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c 64 36  = "SELECT Field6
a9c0: 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57   FROM TestCase W
a9d0: 48 45 52 45 20 46 69 65 6c 64 36 20 49 53 20 4e  HERE Field6 IS N
a9e0: 4f 54 20 4e 55 4c 4c 22 3b 0d 0a 20 20 20 20 20  OT NULL";..     
a9f0: 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65     byte[] b = ne
aa00: 77 20 62 79 74 65 5b 34 30 30 30 5d 3b 0d 0a 0d  w byte[4000];...
aa10: 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28  .        using (
aa20: 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64 20  DbDataReader rd 
aa30: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
aa40: 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20  der())..        
aa50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
aa60: 28 72 64 2e 52 65 61 64 28 29 20 3d 3d 20 66 61  (rd.Read() == fa
aa70: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
aa80: 78 63 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61 74  xception("No dat
aa90: 61 20 74 6f 20 72 65 61 64 21 22 29 3b 0d 0a 0d  a to read!");...
aaa0: 0a 20 20 20 20 20 20 20 20 20 20 72 64 2e 47 65  .          rd.Ge
aab0: 74 42 79 74 65 73 28 30 2c 20 30 2c 20 62 2c 20  tBytes(0, 0, b, 
aac0: 30 2c 20 34 30 30 30 29 3b 0d 0a 0d 0a 20 20 20  0, 4000);....   
aad0: 20 20 20 20 20 20 20 69 66 20 28 62 5b 30 5d 20         if (b[0] 
aae0: 21 3d 20 31 29 20 74 68 72 6f 77 20 6e 65 77 20  != 1) throw new 
aaf0: 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72  Exception("Binar
ab00: 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  y value non-matc
ab10: 68 20 62 79 74 65 20 30 22 29 3b 0d 0a 20 20 20  h byte 0");..   
ab20: 20 20 20 20 20 20 20 69 66 20 28 62 5b 31 30 30         if (b[100
ab30: 5d 20 21 3d 20 32 29 20 74 68 72 6f 77 20 6e 65  ] != 2) throw ne
ab40: 77 20 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e  w Exception("Bin
ab50: 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61  ary value non-ma
ab60: 74 63 68 20 62 79 74 65 20 31 30 30 22 29 3b 0d  tch byte 100");.
ab70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62  .          if (b
ab80: 5b 31 30 30 30 5d 20 21 3d 20 33 29 20 74 68 72  [1000] != 3) thr
ab90: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
aba0: 28 22 42 69 6e 61 72 79 20 76 61 6c 75 65 20 6e  ("Binary value n
abb0: 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65 20 31 30  on-match byte 10
abc0: 30 30 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  00");..         
abd0: 20 69 66 20 28 62 5b 32 30 30 30 5d 20 21 3d 20   if (b[2000] != 
abe0: 34 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  4) throw new Exc
abf0: 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76  eption("Binary v
ac00: 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62  alue non-match b
ac10: 79 74 65 20 32 30 30 30 22 29 3b 0d 0a 20 20 20  yte 2000");..   
ac20: 20 20 20 20 20 20 20 69 66 20 28 62 5b 33 30 30         if (b[300
ac30: 30 5d 20 21 3d 20 35 29 20 74 68 72 6f 77 20 6e  0] != 5) throw n
ac40: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 42 69  ew Exception("Bi
ac50: 6e 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d  nary value non-m
ac60: 61 74 63 68 20 62 79 74 65 20 33 30 30 30 22 29  atch byte 3000")
ac70: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 75  ;....          u
ac80: 73 69 6e 67 20 28 44 62 43 6f 6e 6e 65 63 74 69  sing (DbConnecti
ac90: 6f 6e 20 63 6c 6f 6e 65 20 3d 20 28 44 62 43 6f  on clone = (DbCo
aca0: 6e 6e 65 63 74 69 6f 6e 29 28 28 49 43 6c 6f 6e  nnection)((IClon
acb0: 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e  eable)_cnn).Clon
acc0: 65 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  e())..          
acd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
ace0: 66 20 28 63 6c 6f 6e 65 2e 53 74 61 74 65 20 21  f (clone.State !
acf0: 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74  = ConnectionStat
ad00: 65 2e 4f 70 65 6e 29 20 63 6c 6f 6e 65 2e 4f 70  e.Open) clone.Op
ad10: 65 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  en();..         
ad20: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
ad30: 61 6e 64 20 6e 65 77 63 6d 64 20 3d 20 63 6c 6f  and newcmd = clo
ad40: 6e 65 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  ne.CreateCommand
ad50: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ())..           
ad60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ad70: 20 20 6e 65 77 63 6d 64 2e 43 6f 6d 6d 61 6e 64    newcmd.Command
ad80: 54 65 78 74 20 3d 20 22 44 45 4c 45 54 45 20 46  Text = "DELETE F
ad90: 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57 48 45  ROM TestCase WHE
ada0: 52 45 20 46 69 65 6c 64 36 20 49 53 20 4e 55 4c  RE Field6 IS NUL
adb0: 4c 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  L";..           
adc0: 20 20 20 6e 65 77 63 6d 64 2e 43 6f 6d 6d 61 6e     newcmd.Comman
add0: 64 54 69 6d 65 6f 75 74 20 3d 20 32 3b 0d 0a 20  dTimeout = 2;.. 
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
adf0: 20 63 6d 64 53 74 61 72 74 20 3d 20 45 6e 76 69   cmdStart = Envi
ae00: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
ae10: 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
ae20: 20 20 69 6e 74 20 63 6d 64 45 6e 64 3b 0d 0a 0d    int cmdEnd;...
ae30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
ae40: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
ae50: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
ae60: 20 20 20 20 20 6e 65 77 63 6d 64 2e 45 78 65 63       newcmd.Exec
ae70: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 20 2f  uteNonQuery(); /
ae80: 2f 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 62 65  / should fail be
ae90: 63 61 75 73 65 20 74 68 65 72 65 27 73 20 61 20  cause there's a 
aea0: 72 65 61 64 65 72 20 6f 6e 20 74 68 65 20 64 61  reader on the da
aeb0: 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20  tabase..        
aec0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
aed0: 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  w ArgumentExcept
aee0: 69 6f 6e 28 22 53 68 6f 75 6c 64 20 6e 6f 74 20  ion("Should not 
aef0: 68 61 76 65 20 61 6c 6c 6f 77 65 64 20 61 6e 20  have allowed an 
af00: 65 78 65 63 75 74 65 20 77 69 74 68 20 61 6e 20  execute with an 
af10: 6f 70 65 6e 20 72 65 61 64 65 72 22 29 3b 20 2f  open reader"); /
af20: 2f 20 49 66 20 77 65 20 67 6f 74 20 68 65 72 65  / If we got here
af30: 2c 20 74 68 65 20 74 65 73 74 20 66 61 69 6c 65  , the test faile
af40: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
af50: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
af60: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
af70: 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20  on e)..         
af80: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
af90: 20 20 20 20 20 20 20 20 69 66 20 28 65 20 69 73          if (e is
afa0: 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69   ArgumentExcepti
afb0: 6f 6e 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  on) throw new Ex
afc0: 63 65 70 74 69 6f 6e 28 65 2e 4d 65 73 73 61 67  ception(e.Messag
afd0: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
afe0: 20 20 20 20 20 20 20 63 6d 64 45 6e 64 20 3d 20         cmdEnd = 
aff0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
b000: 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
b010: 20 20 20 20 20 20 20 20 69 66 20 28 63 6d 64 45          if (cmdE
b020: 6e 64 20 2d 20 63 6d 64 53 74 61 72 74 20 3c 20  nd - cmdStart < 
b030: 32 30 30 30 20 7c 7c 20 63 6d 64 45 6e 64 20 2d  2000 || cmdEnd -
b040: 20 63 6d 64 53 74 61 72 74 20 3e 20 33 30 30 30   cmdStart > 3000
b050: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
b060: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
b070: 78 63 65 70 74 69 6f 6e 28 22 44 69 64 20 6e 6f  xception("Did no
b080: 74 20 67 69 76 65 20 75 70 20 74 68 65 20 6c 6f  t give up the lo
b090: 63 6b 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ck at the right 
b0a0: 74 69 6d 65 21 22 29 3b 20 2f 2f 20 44 69 64 6e  time!"); // Didn
b0b0: 27 74 20 77 61 69 74 20 74 68 65 20 72 69 67 68  't wait the righ
b0c0: 74 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  t amount of time
b0d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
b0e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
b0f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
b100: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b110: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
b120: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
b130: 0a 20 20 20 20 2f 2f 2f 20 45 78 65 63 75 74 65  .    /// Execute
b140: 20 6d 75 6c 74 69 70 6c 65 20 73 74 65 70 73 20   multiple steps 
b150: 69 6e 20 61 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  in a command and
b160: 20 76 65 72 69 66 79 20 74 68 65 20 72 65 73 75   verify the resu
b170: 6c 74 73 2e 20 20 4d 61 6b 65 73 20 73 75 72 65  lts.  Makes sure
b180: 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 73 20 61   that commands a
b190: 66 74 65 72 20 61 20 73 65 6c 65 63 74 20 73 74  fter a select st
b1a0: 69 6c 6c 0d 0a 20 20 20 20 2f 2f 2f 20 67 65 74  ill..    /// get
b1b0: 20 65 78 65 63 75 74 65 64 20 65 76 65 6e 20 69   executed even i
b1c0: 66 20 4d 6f 76 65 4e 65 78 74 28 29 20 69 73 6e  f MoveNext() isn
b1d0: 27 74 20 63 61 6c 6c 65 64 20 65 78 70 6c 69 63  't called explic
b1e0: 69 74 6c 79 20 74 6f 20 6d 6f 76 65 20 74 68 69  itly to move thi
b1f0: 6e 67 73 20 61 6c 6f 6e 67 2e 0d 0a 20 20 20 20  ngs along...    
b200: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
b210: 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20      [Test]..    
b220: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 4d 75  internal void Mu
b230: 6c 74 69 53 74 65 70 52 65 61 64 65 72 54 65 73  ltiStepReaderTes
b240: 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  t()..    {..    
b250: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
b260: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
b270: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
b280: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
b290: 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28   droptables.Add(
b2a0: 22 73 74 65 70 72 65 61 64 65 72 22 29 3b 0d 0a  "stepreader");..
b2b0: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
b2c0: 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41 54  andText = "CREAT
b2d0: 45 20 54 41 42 4c 45 20 73 74 65 70 72 65 61 64  E TABLE stepread
b2e0: 65 72 20 28 69 64 20 69 6e 74 20 70 72 69 6d 61  er (id int prima
b2f0: 72 79 20 6b 65 79 29 3b 49 4e 53 45 52 54 20 49  ry key);INSERT I
b300: 4e 54 4f 20 73 74 65 70 72 65 61 64 65 72 20 76  NTO stepreader v
b310: 61 6c 75 65 73 28 31 29 3b 53 45 4c 45 43 54 20  alues(1);SELECT 
b320: 2a 20 46 52 4f 4d 20 73 74 65 70 72 65 61 64 65  * FROM stepreade
b330: 72 3b 55 50 44 41 54 45 20 73 74 65 70 72 65 61  r;UPDATE steprea
b340: 64 65 72 20 73 65 74 20 69 64 20 3d 20 69 64 20  der set id = id 
b350: 2b 20 31 3b 22 3b 0d 0a 20 20 20 20 20 20 20 20  + 1;";..        
b360: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
b370: 64 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64  der reader = cmd
b380: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29  .ExecuteReader()
b390: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
b3a0: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
b3b0: 65 72 2e 52 65 61 64 28 29 20 3d 3d 20 66 61 6c  er.Read() == fal
b3c0: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
b3d0: 63 65 70 74 69 6f 6e 28 22 46 61 69 6c 65 64 20  ception("Failed 
b3e0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  to read from the
b3f0: 20 74 61 62 6c 65 22 29 3b 0d 0a 20 20 20 20 20   table");..     
b400: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
b410: 47 65 74 49 6e 74 33 32 28 30 29 20 21 3d 20 31  GetInt32(0) != 1
b420: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
b430: 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72  ption(String.For
b440: 6d 61 74 28 22 45 78 70 65 63 74 65 64 20 7b 30  mat("Expected {0
b450: 7d 20 67 6f 74 20 7b 31 7d 22 2c 20 31 2c 20 72  } got {1}", 1, r
b460: 65 61 64 65 72 2e 47 65 74 49 6e 74 33 32 28 30  eader.GetInt32(0
b470: 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  )));..        }.
b480: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
b490: 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45  mandText = "SELE
b4a0: 43 54 20 2a 20 46 52 4f 4d 20 73 74 65 70 72 65  CT * FROM stepre
b4b0: 61 64 65 72 22 3b 0d 0a 20 20 20 20 20 20 20 20  ader";..        
b4c0: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
b4d0: 64 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64  der reader = cmd
b4e0: 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29  .ExecuteReader()
b4f0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
b500: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
b510: 65 72 2e 52 65 61 64 28 29 20 3d 3d 20 66 61 6c  er.Read() == fal
b520: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  se) throw new Ex
b530: 63 65 70 74 69 6f 6e 28 22 46 61 69 6c 65 64 20  ception("Failed 
b540: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  to read from the
b550: 20 74 61 62 6c 65 22 29 3b 0d 0a 20 20 20 20 20   table");..     
b560: 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72 2e       if (reader.
b570: 47 65 74 49 6e 74 33 32 28 30 29 20 21 3d 20 32  GetInt32(0) != 2
b580: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
b590: 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72  ption(String.For
b5a0: 6d 61 74 28 22 45 78 70 65 63 74 65 64 20 7b 30  mat("Expected {0
b5b0: 7d 20 67 6f 74 20 7b 31 7d 22 2c 20 32 2c 20 72  } got {1}", 2, r
b5c0: 65 61 64 65 72 2e 47 65 74 49 6e 74 33 32 28 30  eader.GetInt32(0
b5d0: 29 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  )));..        }.
b5e0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b5f0: 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ...    internal 
b600: 63 6c 61 73 73 20 4d 54 54 65 73 74 0d 0a 20 20  class MTTest..  
b610: 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 65 72    {..      inter
b620: 6e 61 6c 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  nal DbConnection
b630: 20 63 6e 6e 3b 0d 0a 20 20 20 20 20 20 69 6e 74   cnn;..      int
b640: 65 72 6e 61 6c 20 45 78 63 65 70 74 69 6f 6e 20  ernal Exception 
b650: 65 3b 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6e  e;..      intern
b660: 61 6c 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64  al System.Thread
b670: 69 6e 67 2e 54 68 72 65 61 64 20 74 3b 0d 0a 20  ing.Thread t;.. 
b680: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e       internal in
b690: 74 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20  t value;..      
b6a0: 69 6e 74 65 72 6e 61 6c 20 53 79 73 74 65 6d 2e  internal System.
b6b0: 54 68 72 65 61 64 69 6e 67 2e 4d 61 6e 75 61 6c  Threading.Manual
b6c0: 52 65 73 65 74 45 76 65 6e 74 20 65 76 3b 0d 0a  ResetEvent ev;..
b6d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
b6e0: 73 74 28 53 65 71 75 65 6e 63 65 3d 31 31 29 5d  st(Sequence=11)]
b6f0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
b700: 6f 69 64 20 4d 75 6c 74 69 74 68 72 65 61 64 69  oid Multithreadi
b710: 6e 67 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d  ngTest()..    {.
b720: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
b730: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
b740: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
b750: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
b760: 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65 73        droptables
b770: 2e 41 64 64 28 22 4d 75 6c 74 69 54 68 72 65 61  .Add("MultiThrea
b780: 64 65 64 54 65 73 74 22 29 3b 0d 0a 20 20 20 20  dedTest");..    
b790: 20 20 20 20 69 66 20 28 5f 66 61 63 74 2e 47 65      if (_fact.Ge
b7a0: 74 54 79 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64  tType().Name.Ind
b7b0: 65 78 4f 66 28 22 53 51 4c 69 74 65 22 2c 20 53  exOf("SQLite", S
b7c0: 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e  tringComparison.
b7d0: 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73  OrdinalIgnoreCas
b7e0: 65 29 20 3d 3d 20 2d 31 29 0d 0a 20 20 20 20 20  e) == -1)..     
b7f0: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
b800: 54 65 78 74 20 3d 20 22 43 52 45 41 54 45 20 54  Text = "CREATE T
b810: 41 42 4c 45 20 4d 75 6c 74 69 54 68 72 65 61 64  ABLE MultiThread
b820: 65 64 54 65 73 74 28 49 44 20 69 6e 74 65 67 65  edTest(ID intege
b830: 72 20 69 64 65 6e 74 69 74 79 20 70 72 69 6d 61  r identity prima
b840: 72 79 20 6b 65 79 2c 20 54 68 72 65 61 64 49 64  ry key, ThreadId
b850: 20 69 6e 74 65 67 65 72 2c 20 4d 79 56 61 6c 75   integer, MyValu
b860: 65 20 69 6e 74 65 67 65 72 29 22 3b 0d 0a 20 20  e integer)";..  
b870: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
b880: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
b890: 64 54 65 78 74 20 3d 20 22 43 52 45 41 54 45 20  dText = "CREATE 
b8a0: 54 41 42 4c 45 20 4d 75 6c 74 69 54 68 72 65 61  TABLE MultiThrea
b8b0: 64 65 64 54 65 73 74 28 49 44 20 69 6e 74 65 67  dedTest(ID integ
b8c0: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  er primary key, 
b8d0: 54 68 72 65 61 64 49 64 20 69 6e 74 65 67 65 72  ThreadId integer
b8e0: 2c 20 4d 79 56 61 6c 75 65 20 69 6e 74 65 67 65  , MyValue intege
b8f0: 72 29 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  r)";....        
b900: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
b910: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ery();..      }.
b920: 0a 0d 0a 20 20 20 20 20 20 53 79 73 74 65 6d 2e  ...      System.
b930: 54 68 72 65 61 64 69 6e 67 2e 4d 61 6e 75 61 6c  Threading.Manual
b940: 52 65 73 65 74 45 76 65 6e 74 5b 5d 20 65 76 65  ResetEvent[] eve
b950: 6e 74 73 20 3d 20 6e 65 77 20 53 79 73 74 65 6d  nts = new System
b960: 2e 54 68 72 65 61 64 69 6e 67 2e 4d 61 6e 75 61  .Threading.Manua
b970: 6c 52 65 73 65 74 45 76 65 6e 74 5b 4e 75 6d 54  lResetEvent[NumT
b980: 68 72 65 61 64 73 5d 3b 0d 0a 20 20 20 20 20 20  hreads];..      
b990: 4d 54 54 65 73 74 5b 5d 20 61 72 72 20 3d 20 6e  MTTest[] arr = n
b9a0: 65 77 20 4d 54 54 65 73 74 5b 4e 75 6d 54 68 72  ew MTTest[NumThr
b9b0: 65 61 64 73 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20  eads];....      
b9c0: 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20  for (int n = 0; 
b9d0: 6e 20 3c 20 61 72 72 2e 4c 65 6e 67 74 68 3b 20  n < arr.Length; 
b9e0: 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  n++)..      {.. 
b9f0: 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 20 3d 20         arr[n] = 
ba00: 6e 65 77 20 4d 54 54 65 73 74 28 29 3b 0d 0a 20  new MTTest();.. 
ba10: 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 74 20         arr[n].t 
ba20: 3d 20 6e 65 77 20 53 79 73 74 65 6d 2e 54 68 72  = new System.Thr
ba30: 65 61 64 69 6e 67 2e 54 68 72 65 61 64 28 6e 65  eading.Thread(ne
ba40: 77 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69  w System.Threadi
ba50: 6e 67 2e 50 61 72 61 6d 65 74 65 72 69 7a 65 64  ng.Parameterized
ba60: 54 68 72 65 61 64 53 74 61 72 74 28 4d 75 6c 74  ThreadStart(Mult
ba70: 69 74 68 72 65 61 64 65 64 54 65 73 74 54 68 72  ithreadedTestThr
ba80: 65 61 64 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  ead));..        
ba90: 61 72 72 5b 6e 5d 2e 74 2e 49 73 42 61 63 6b 67  arr[n].t.IsBackg
baa0: 72 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0d 0a 20  round = true;.. 
bab0: 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 63 6e         arr[n].cn
bac0: 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c 65  n = ((ICloneable
bad0: 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61  )_cnn).Clone() a
bae0: 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0d  s DbConnection;.
baf0: 0a 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e  .        arr[n].
bb00: 65 76 20 3d 20 65 76 65 6e 74 73 5b 6e 5d 20 3d  ev = events[n] =
bb10: 20 6e 65 77 20 53 79 73 74 65 6d 2e 54 68 72 65   new System.Thre
bb20: 61 64 69 6e 67 2e 4d 61 6e 75 61 6c 52 65 73 65  ading.ManualRese
bb30: 74 45 76 65 6e 74 28 66 61 6c 73 65 29 3b 0d 0a  tEvent(false);..
bb40: 20 20 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 74          arr[n].t
bb50: 2e 53 74 61 72 74 28 61 72 72 5b 6e 5d 29 3b 0d  .Start(arr[n]);.
bb60: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bb70: 20 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69    System.Threadi
bb80: 6e 67 2e 57 61 69 74 48 61 6e 64 6c 65 2e 57 61  ng.WaitHandle.Wa
bb90: 69 74 41 6c 6c 28 65 76 65 6e 74 73 2c 20 54 68  itAll(events, Th
bba0: 72 65 61 64 54 69 6d 65 6f 75 74 29 3b 0d 0a 0d  readTimeout);...
bbb0: 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 61 69 6c  .      bool fail
bbc0: 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20  ed = false;..   
bbd0: 20 20 20 45 78 63 65 70 74 69 6f 6e 20 65 20 3d     Exception e =
bbe0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
bbf0: 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20  for (int n = 0; 
bc00: 6e 20 3c 20 61 72 72 2e 4c 65 6e 67 74 68 3b 20  n < arr.Length; 
bc10: 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  n++)..      {.. 
bc20: 20 20 20 20 20 20 20 69 66 20 28 61 72 72 5b 6e         if (arr[n
bc30: 5d 2e 74 2e 4a 6f 69 6e 28 30 29 20 3d 3d 20 66  ].t.Join(0) == f
bc40: 61 6c 73 65 29 0d 0a 20 20 20 20 20 20 20 20 7b  alse)..        {
bc50: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 61 69 6c  ..          fail
bc60: 65 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ed = true;..    
bc70: 20 20 20 20 20 20 61 72 72 5b 6e 5d 2e 74 2e 41        arr[n].t.A
bc80: 62 6f 72 74 28 29 3b 0d 0a 20 20 20 20 20 20 20  bort();..       
bc90: 20 20 20 61 72 72 5b 6e 5d 2e 74 2e 4a 6f 69 6e     arr[n].t.Join
bca0: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ();..        }..
bcb0: 20 20 20 20 20 20 20 20 69 66 20 28 61 72 72 5b          if (arr[
bcc0: 6e 5d 2e 65 20 21 3d 20 6e 75 6c 6c 29 20 65 20  n].e != null) e 
bcd0: 3d 20 61 72 72 5b 6e 5d 2e 65 3b 0d 0a 20 20 20  = arr[n].e;..   
bce0: 20 20 20 20 20 61 72 72 5b 6e 5d 2e 63 6e 6e 2e       arr[n].cnn.
bcf0: 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20  Dispose();..    
bd00: 20 20 20 20 61 72 72 5b 6e 5d 2e 65 76 2e 43 6c      arr[n].ev.Cl
bd10: 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  ose();..      }.
bd20: 0a 20 20 20 20 20 20 69 66 20 28 66 61 69 6c 65  .      if (faile
bd30: 64 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  d) throw new Exc
bd40: 65 70 74 69 6f 6e 28 22 4f 6e 65 20 6f 72 20 6d  eption("One or m
bd50: 6f 72 65 20 74 68 72 65 61 64 73 20 64 65 61 64  ore threads dead
bd60: 6c 6f 63 6b 65 64 22 29 3b 0d 0a 20 20 20 20 20  locked");..     
bd70: 20 69 66 20 28 65 20 21 3d 20 6e 75 6c 6c 29 20   if (e != null) 
bd80: 0d 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20  ..        throw 
bd90: 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  e;..    }....   
bda0: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 4d   internal void M
bdb0: 75 6c 74 69 74 68 72 65 61 64 65 64 54 65 73 74  ultithreadedTest
bdc0: 54 68 72 65 61 64 28 6f 62 6a 65 63 74 20 6f 62  Thread(object ob
bdd0: 6a 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  j)..    {..     
bde0: 20 4d 54 54 65 73 74 20 74 65 73 74 20 3d 20 6f   MTTest test = o
bdf0: 62 6a 20 61 73 20 4d 54 54 65 73 74 3b 0d 0a 0d  bj as MTTest;...
be00: 0a 20 20 20 20 20 20 69 66 20 28 74 65 73 74 2e  .      if (test.
be10: 63 6e 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e  cnn.State != Con
be20: 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65  nectionState.Ope
be30: 6e 29 0d 0a 20 20 20 20 20 20 20 20 74 65 73 74  n)..        test
be40: 2e 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a  .cnn.Open();....
be50: 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 20        int start 
be60: 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
be70: 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20  ckCount;..      
be80: 74 72 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  try..      {..  
be90: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
bea0: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 74 65 73  ommand cmd = tes
beb0: 74 2e 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d  t.cnn.CreateComm
bec0: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20  and())..        
bed0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 6f 6f  {..          boo
bee0: 6c 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65 3b 0d  l once = false;.
bef0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
bf00: 20 28 21 6f 6e 63 65 20 7c 7c 20 28 28 45 6e 76   (!once || ((Env
bf10: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
bf20: 6e 74 20 2d 20 73 74 61 72 74 29 20 3c 20 32 30  nt - start) < 20
bf30: 30 30 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  00))..          
bf40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  {..            u
bf50: 73 69 6e 67 20 28 44 62 54 72 61 6e 73 61 63 74  sing (DbTransact
bf60: 69 6f 6e 20 74 72 61 6e 73 20 3d 20 74 65 73 74  ion trans = test
bf70: 2e 63 6e 6e 2e 42 65 67 69 6e 54 72 61 6e 73 61  .cnn.BeginTransa
bf80: 63 74 69 6f 6e 28 29 29 0d 0a 20 20 20 20 20 20  ction())..      
bf90: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
bfa0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
bfb0: 6e 64 54 65 78 74 20 3d 20 53 74 72 69 6e 67 2e  ndText = String.
bfc0: 46 6f 72 6d 61 74 28 22 53 45 4c 45 43 54 20 2a  Format("SELECT *
bfd0: 20 46 52 4f 4d 20 4d 75 6c 74 69 54 68 72 65 61   FROM MultiThrea
bfe0: 64 65 64 54 65 73 74 20 57 48 45 52 45 20 54 68  dedTest WHERE Th
bff0: 72 65 61 64 49 64 20 3d 20 7b 30 7d 22 2c 20 74  readId = {0}", t
c000: 65 73 74 2e 74 2e 4d 61 6e 61 67 65 64 54 68 72  est.t.ManagedThr
c010: 65 61 64 49 64 29 3b 0d 0a 20 20 20 20 20 20 20  eadId);..       
c020: 20 20 20 20 20 20 20 63 6d 64 2e 54 72 61 6e 73         cmd.Trans
c030: 61 63 74 69 6f 6e 20 3d 20 74 72 61 6e 73 3b 0d  action = trans;.
c040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
c050: 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64  sing (DbDataRead
c060: 65 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e  er reader = cmd.
c070: 45 78 65 63 75 74 65 52 65 61 64 65 72 28 29 29  ExecuteReader())
c080: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c090: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
c0a0: 20 20 20 77 68 69 6c 65 20 28 72 65 61 64 65 72     while (reader
c0b0: 2e 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20 20  .Read())..      
c0c0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c0e0: 65 73 74 2e 76 61 6c 75 65 20 2b 3d 20 43 6f 6e  est.value += Con
c0f0: 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 72 65 61  vert.ToInt32(rea
c100: 64 65 72 5b 32 5d 29 3b 0d 0a 20 20 20 20 20 20  der[2]);..      
c110: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
c120: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
c130: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
c140: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53 74  CommandText = St
c150: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 49 4e 53  ring.Format("INS
c160: 45 52 54 20 49 4e 54 4f 20 4d 75 6c 74 69 54 68  ERT INTO MultiTh
c170: 72 65 61 64 65 64 54 65 73 74 28 54 68 72 65 61  readedTest(Threa
c180: 64 49 64 2c 20 4d 79 56 61 6c 75 65 29 20 56 41  dId, MyValue) VA
c190: 4c 55 45 53 28 7b 30 7d 2c 20 7b 31 7d 29 22 2c  LUES({0}, {1})",
c1a0: 20 74 65 73 74 2e 74 2e 4d 61 6e 61 67 65 64 54   test.t.ManagedT
c1b0: 68 72 65 61 64 49 64 2c 20 45 6e 76 69 72 6f 6e  hreadId, Environ
c1c0: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 29 3b  ment.TickCount);
c1d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c1e0: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
c1f0: 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ery();....      
c200: 20 20 20 20 20 20 20 20 74 72 61 6e 73 2e 43 6f          trans.Co
c210: 6d 6d 69 74 28 29 3b 0d 0a 20 20 20 20 20 20 20  mmit();..       
c220: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c230: 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 74 72 75        once = tru
c240: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e;..          }.
c250: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
c260: 20 20 7d 0d 0a 20 20 20 20 20 20 63 61 74 63 68    }..      catch
c270: 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a   (Exception e)..
c280: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
c290: 20 74 65 73 74 2e 65 20 3d 20 65 3b 0d 0a 20 20   test.e = e;..  
c2a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 66 69 6e      }..      fin
c2b0: 61 6c 6c 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ally..      {.. 
c2c0: 20 20 20 20 20 20 20 74 65 73 74 2e 65 76 2e 53         test.ev.S
c2d0: 65 74 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  et();..      }..
c2e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
c2f0: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
c300: 6c 20 76 6f 69 64 20 50 61 72 61 6d 65 74 65 72  l void Parameter
c310: 69 7a 65 64 49 6e 73 65 72 74 28 29 0d 0a 20 20  izedInsert()..  
c320: 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67    {..      using
c330: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
c340: 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
c350: 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b  mand())..      {
c360: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
c370: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49 4e 53  mmandText = "INS
c380: 45 52 54 20 49 4e 54 4f 20 54 65 73 74 43 61 73  ERT INTO TestCas
c390: 65 28 46 69 65 6c 64 31 2c 20 46 69 65 6c 64 32  e(Field1, Field2
c3a0: 2c 20 5b 46 69 c3 ab 6c 64 33 5d 2c 20 5b 46 69  , [Fi..ld3], [Fi
c3b0: c3 a6 6c 64 34 5d 2c 20 46 69 65 6c 64 35 29 20  ..ld4], Field5) 
c3c0: 56 41 4c 55 45 53 28 40 70 31 2c 40 70 32 2c 40  VALUES(@p1,@p2,@
c3d0: 70 33 2c 40 70 34 2c 40 70 35 29 22 3b 0d 0a 20  p3,@p4,@p5)";.. 
c3e0: 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65 74         DbParamet
c3f0: 65 72 20 46 69 65 6c 64 31 20 3d 20 63 6d 64 2e  er Field1 = cmd.
c400: 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28  CreateParameter(
c410: 29 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61  );..        DbPa
c420: 72 61 6d 65 74 65 72 20 46 69 65 6c 64 32 20 3d  rameter Field2 =
c430: 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d   cmd.CreateParam
c440: 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  eter();..       
c450: 20 44 62 50 61 72 61 6d 65 74 65 72 20 46 69 65   DbParameter Fie
c460: 6c 64 33 20 3d 20 63 6d 64 2e 43 72 65 61 74 65  ld3 = cmd.Create
c470: 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20  Parameter();..  
c480: 20 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65        DbParamete
c490: 72 20 46 69 65 6c 64 34 20 3d 20 63 6d 64 2e 43  r Field4 = cmd.C
c4a0: 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29  reateParameter()
c4b0: 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50 61 72  ;..        DbPar
c4c0: 61 6d 65 74 65 72 20 46 69 65 6c 64 35 20 3d 20  ameter Field5 = 
c4d0: 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65  cmd.CreateParame
c4e0: 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ter();....      
c4f0: 20 20 46 69 65 6c 64 31 2e 50 61 72 61 6d 65 74    Field1.Paramet
c500: 65 72 4e 61 6d 65 20 3d 20 22 40 70 31 22 3b 0d  erName = "@p1";.
c510: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 32 2e  .        Field2.
c520: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
c530: 22 40 70 32 22 3b 0d 0a 20 20 20 20 20 20 20 20  "@p2";..        
c540: 46 69 65 6c 64 33 2e 50 61 72 61 6d 65 74 65 72  Field3.Parameter
c550: 4e 61 6d 65 20 3d 20 22 40 70 33 22 3b 0d 0a 20  Name = "@p3";.. 
c560: 20 20 20 20 20 20 20 46 69 65 6c 64 34 2e 50 61         Field4.Pa
c570: 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40  rameterName = "@
c580: 70 34 22 3b 0d 0a 20 20 20 20 20 20 20 20 46 69  p4";..        Fi
c590: 65 6c 64 35 2e 50 61 72 61 6d 65 74 65 72 4e 61  eld5.ParameterNa
c5a0: 6d 65 20 3d 20 22 40 70 35 22 3b 0d 0a 0d 0a 20  me = "@p5";.... 
c5b0: 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e 56 61         Field1.Va
c5c0: 6c 75 65 20 3d 20 32 3b 0d 0a 20 20 20 20 20 20  lue = 2;..      
c5d0: 20 20 46 69 65 6c 64 32 2e 56 61 6c 75 65 20 3d    Field2.Value =
c5e0: 20 33 2e 31 34 31 35 39 3b 0d 0a 20 20 20 20 20   3.14159;..     
c5f0: 20 20 20 46 69 65 6c 64 33 2e 56 61 6c 75 65 20     Field3.Value 
c600: 3d 20 22 50 61 72 61 6d 20 46 69 65 6c 64 33 22  = "Param Field3"
c610: 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64  ;..        Field
c620: 34 2e 56 61 6c 75 65 20 3d 20 22 46 69 65 6c 64  4.Value = "Field
c630: 34 20 50 61 72 22 3b 0d 0a 20 20 20 20 20 20 20  4 Par";..       
c640: 20 46 69 65 6c 64 35 2e 56 61 6c 75 65 20 3d 20   Field5.Value = 
c650: 44 61 74 65 54 69 6d 65 2e 4e 6f 77 3b 0d 0a 0d  DateTime.Now;...
c660: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72  .        cmd.Par
c670: 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c  ameters.Add(Fiel
c680: 64 31 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  d1);..        cm
c690: 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64  d.Parameters.Add
c6a0: 28 46 69 65 6c 64 32 29 3b 0d 0a 20 20 20 20 20  (Field2);..     
c6b0: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
c6c0: 73 2e 41 64 64 28 46 69 65 6c 64 33 29 3b 0d 0a  s.Add(Field3);..
c6d0: 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61          cmd.Para
c6e0: 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c 64  meters.Add(Field
c6f0: 34 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  4);..        cmd
c700: 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28  .Parameters.Add(
c710: 46 69 65 6c 64 35 29 3b 0d 0a 0d 0a 20 20 20 20  Field5);....    
c720: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
c730: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
c740: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
c750: 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
c760: 74 65 72 6e 61 6c 20 76 6f 69 64 20 50 61 72 61  ternal void Para
c770: 6d 65 74 65 72 69 7a 65 64 49 6e 73 65 72 74 4d  meterizedInsertM
c780: 69 73 73 69 6e 67 50 61 72 61 6d 73 28 29 0d 0a  issingParams()..
c790: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69      {..      usi
c7a0: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
c7b0: 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
c7c0: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
c7d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e   {..        cmd.
c7e0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49  CommandText = "I
c7f0: 4e 53 45 52 54 20 49 4e 54 4f 20 54 65 73 74 43  NSERT INTO TestC
c800: 61 73 65 28 46 69 65 6c 64 31 2c 20 46 69 65 6c  ase(Field1, Fiel
c810: 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d 2c 20 5b  d2, [Fi..ld3], [
c820: 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65 6c 64 35  Fi..ld4], Field5
c830: 29 20 56 41 4c 55 45 53 28 40 70 31 2c 40 70 32  ) VALUES(@p1,@p2
c840: 2c 40 70 33 2c 40 70 34 2c 40 70 35 29 22 3b 0d  ,@p3,@p4,@p5)";.
c850: 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d  .        DbParam
c860: 65 74 65 72 20 46 69 65 6c 64 31 20 3d 20 63 6d  eter Field1 = cm
c870: 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  d.CreateParamete
c880: 72 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 44 62  r();..        Db
c890: 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 32  Parameter Field2
c8a0: 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72   = cmd.CreatePar
c8b0: 61 6d 65 74 65 72 28 29 3b 0d 0a 20 20 20 20 20  ameter();..     
c8c0: 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 46     DbParameter F
c8d0: 69 65 6c 64 33 20 3d 20 63 6d 64 2e 43 72 65 61  ield3 = cmd.Crea
c8e0: 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a  teParameter();..
c8f0: 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65          DbParame
c900: 74 65 72 20 46 69 65 6c 64 34 20 3d 20 63 6d 64  ter Field4 = cmd
c910: 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72  .CreateParameter
c920: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 44 62 50  ();..        DbP
c930: 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 35 20  arameter Field5 
c940: 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61  = cmd.CreatePara
c950: 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20  meter();....    
c960: 20 20 20 20 46 69 65 6c 64 31 2e 50 61 72 61 6d      Field1.Param
c970: 65 74 65 72 4e 61 6d 65 20 3d 20 22 40 70 31 22  eterName = "@p1"
c980: 3b 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64  ;..        Field
c990: 32 2e 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20  2.ParameterName 
c9a0: 3d 20 22 40 70 32 22 3b 0d 0a 20 20 20 20 20 20  = "@p2";..      
c9b0: 20 20 46 69 65 6c 64 33 2e 50 61 72 61 6d 65 74    Field3.Paramet
c9c0: 65 72 4e 61 6d 65 20 3d 20 22 40 70 33 22 3b 0d  erName = "@p3";.
c9d0: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 34 2e  .        Field4.
c9e0: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
c9f0: 22 40 70 34 22 3b 0d 0a 20 20 20 20 20 20 20 20  "@p4";..        
ca00: 46 69 65 6c 64 35 2e 50 61 72 61 6d 65 74 65 72  Field5.Parameter
ca10: 4e 61 6d 65 20 3d 20 22 40 70 35 22 3b 0d 0a 0d  Name = "@p5";...
ca20: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e  .        Field1.
ca30: 44 62 54 79 70 65 20 3d 20 53 79 73 74 65 6d 2e  DbType = System.
ca40: 44 61 74 61 2e 44 62 54 79 70 65 2e 49 6e 74 33  Data.DbType.Int3
ca50: 32 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 46 69  2;....        Fi
ca60: 65 6c 64 31 2e 56 61 6c 75 65 20 3d 20 32 3b 0d  eld1.Value = 2;.
ca70: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 32 2e  .        Field2.
ca80: 56 61 6c 75 65 20 3d 20 33 2e 31 34 31 35 39 3b  Value = 3.14159;
ca90: 0d 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 33  ..        Field3
caa0: 2e 56 61 6c 75 65 20 3d 20 22 46 69 65 6c 64 33  .Value = "Field3
cab0: 20 50 61 72 61 6d 22 3b 0d 0a 20 20 20 20 20 20   Param";..      
cac0: 20 20 46 69 65 6c 64 34 2e 56 61 6c 75 65 20 3d    Field4.Value =
cad0: 20 22 46 69 65 6c 64 34 20 50 61 72 22 3b 0d 0a   "Field4 Par";..
cae0: 20 20 20 20 20 20 20 20 46 69 65 6c 64 35 2e 56          Field5.V
caf0: 61 6c 75 65 20 3d 20 44 61 74 65 54 69 6d 65 2e  alue = DateTime.
cb00: 4e 6f 77 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Now;....        
cb10: 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41  cmd.Parameters.A
cb20: 64 64 28 46 69 65 6c 64 31 29 3b 0d 0a 20 20 20  dd(Field1);..   
cb30: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
cb40: 65 72 73 2e 41 64 64 28 46 69 65 6c 64 32 29 3b  ers.Add(Field2);
cb50: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61  ..        cmd.Pa
cb60: 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65  rameters.Add(Fie
cb70: 6c 64 33 29 3b 0d 0a 20 20 20 20 20 20 20 20 63  ld3);..        c
cb80: 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64  md.Parameters.Ad
cb90: 64 28 46 69 65 6c 64 34 29 3b 0d 0a 0d 0a 20 20  d(Field4);....  
cba0: 20 20 20 20 20 20 2f 2f 20 41 73 73 65 72 74 69        // Asserti
cbb0: 6f 6e 20 68 65 72 65 2c 20 6e 6f 74 20 65 6e 6f  on here, not eno
cbc0: 75 67 68 20 70 61 72 61 6d 65 74 65 72 73 0d 0a  ugh parameters..
cbd0: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
cbe0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
cbf0: 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
cc00: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
cc10: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78      throw new Ex
cc20: 63 65 70 74 69 6f 6e 28 22 45 78 65 63 75 74 65  ception("Execute
cc30: 64 20 77 69 74 68 20 61 20 6d 69 73 73 69 6e 67  d with a missing
cc40: 20 70 61 72 61 6d 65 74 65 72 22 29 3b 0d 0a 20   parameter");.. 
cc50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
cc60: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
cc70: 6f 6e 29 20 2f 2f 20 45 78 70 65 63 74 65 64 0d  on) // Expected.
cc80: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
cc90: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
cca0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
ccb0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
ccc0: 2f 2f 2f 20 43 61 6c 6c 20 50 72 65 70 61 72 65  /// Call Prepare
ccd0: 28 29 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 73 74  () on a multi-st
cce0: 61 74 65 6d 65 6e 74 20 63 6f 6d 6d 61 6e 64 20  atement command 
ccf0: 74 65 78 74 20 77 68 65 72 65 20 74 68 65 20 73  text where the s
cd00: 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 64 65  econd command de
cd10: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 65 78 69  pends on the exi
cd20: 73 74 65 6e 63 65 20 6f 66 20 74 68 65 20 66 69  stence of the fi
cd30: 72 73 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  rst...    /// </
cd40: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54  summary>..    [T
cd50: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
cd60: 61 6c 20 76 6f 69 64 20 50 72 65 70 61 72 65 54  al void PrepareT
cd70: 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
cd80: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
cd90: 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e  mand cmd = _cnn.
cda0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
cdb0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
cdc0: 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64     droptables.Ad
cdd0: 64 28 22 6e 6f 6e 65 78 69 73 74 65 6e 74 22 29  d("nonexistent")
cde0: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
cdf0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52  ommandText = "CR
ce00: 45 41 54 45 20 54 41 42 4c 45 20 6e 6f 6e 65 78  EATE TABLE nonex
ce10: 69 73 74 65 6e 74 28 69 64 20 69 6e 74 20 70 72  istent(id int pr
ce20: 69 6d 61 72 79 20 6b 65 79 29 3b 53 45 4c 45 43  imary key);SELEC
ce30: 54 20 69 64 20 46 52 4f 4d 20 6e 6f 6e 65 78 69  T id FROM nonexi
ce40: 73 74 65 6e 74 20 55 4e 49 4f 4e 20 53 45 4c 45  stent UNION SELE
ce50: 43 54 20 31 22 3b 0d 0a 20 20 20 20 20 20 20 20  CT 1";..        
ce60: 63 6d 64 2e 50 72 65 70 61 72 65 28 29 3b 0d 0a  cmd.Prepare();..
ce70: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 6f          object o
ce80: 62 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 53  b = cmd.ExecuteS
ce90: 63 61 6c 61 72 28 29 3b 0d 0a 0d 0a 20 20 20 20  calar();....    
cea0: 20 20 20 20 69 66 20 28 6f 62 20 3d 3d 20 6e 75      if (ob == nu
ceb0: 6c 6c 20 7c 7c 20 6f 62 20 3d 3d 20 44 42 4e 75  ll || ob == DBNu
cec0: 6c 6c 2e 56 61 6c 75 65 29 20 74 68 72 6f 77 20  ll.Value) throw 
ced0: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4d  new Exception("M
cee0: 75 6c 74 69 70 6c 65 20 73 74 61 74 65 6d 65 6e  ultiple statemen
cef0: 74 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 75  ts may not be su
cf00: 70 70 6f 72 74 65 64 22 29 3b 0d 0a 20 20 20 20  pported");..    
cf10: 20 20 20 20 69 66 20 28 43 6f 6e 76 65 72 74 2e      if (Convert.
cf20: 54 6f 49 6e 74 33 32 28 6f 62 29 20 21 3d 20 31  ToInt32(ob) != 1
cf30: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
cf40: 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72  ption(String.For
cf50: 6d 61 74 28 22 45 78 70 65 63 74 65 64 20 7b 30  mat("Expected {0
cf60: 7d 20 67 6f 74 20 7b 31 7d 22 2c 20 31 2c 20 6f  } got {1}", 1, o
cf70: 62 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  b));..      }.. 
cf80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
cf90: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
cfa0: 2f 2f 20 43 68 65 63 6b 73 20 74 6f 20 6d 61 6b  // Checks to mak
cfb0: 65 20 73 75 72 65 20 74 72 61 6e 73 61 63 74 69  e sure transacti
cfc0: 6f 6e 73 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ons are rolled b
cfd0: 61 63 6b 20 62 65 66 6f 72 65 20 61 20 63 6f 6e  ack before a con
cfe0: 6e 65 63 74 69 6f 6e 20 67 6f 65 73 20 62 61 63  nection goes bac
cff0: 6b 20 6f 6e 74 6f 20 74 68 65 20 70 6f 6f 6c 0d  k onto the pool.
d000: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
d010: 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  ry>..    [Test].
d020: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
d030: 69 64 20 50 6f 6f 6c 69 6e 67 57 69 74 68 53 74  id PoolingWithSt
d040: 65 61 6c 74 68 54 72 61 6e 73 61 63 74 69 6f 6e  ealthTransaction
d050: 54 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  Test()..    {.. 
d060: 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
d070: 65 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 5f 63  e;..      if (_c
d080: 6e 6e 73 74 72 69 6e 67 2e 54 72 79 47 65 74 56  nnstring.TryGetV
d090: 61 6c 75 65 28 22 50 6f 6f 6c 69 6e 67 22 2c 20  alue("Pooling", 
d0a0: 6f 75 74 20 76 61 6c 75 65 29 20 3d 3d 20 66 61  out value) == fa
d0b0: 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45  lse) throw new E
d0c0: 78 63 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e  xception("Poolin
d0d0: 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  g not present in
d0e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
d0f0: 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  ng");..      if 
d100: 28 28 62 6f 6f 6c 29 76 61 6c 75 65 20 3d 3d 20  ((bool)value == 
d110: 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
d120: 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78 63   InconclusiveExc
d130: 65 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20  eption("Pooling 
d140: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 69 6e 20 74  not enabled in t
d150: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
d160: 72 69 6e 67 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  ring");....     
d170: 20 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64   maydroptable.Ad
d180: 64 28 22 50 6f 6f 6c 54 65 73 74 22 29 3b 0d 0a  d("PoolTest");..
d190: 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74  ..      for (int
d1a0: 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 31 30 30 3b   n = 0; n < 100;
d1b0: 20 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a   n++)..      {..
d1c0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
d1d0: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63  bConnection newc
d1e0: 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c  nn = ((ICloneabl
d1f0: 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20  e)_cnn).Clone() 
d200: 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29  as DbConnection)
d210: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
d220: 20 20 20 20 20 20 20 69 66 20 28 6e 65 77 63 6e         if (newcn
d230: 6e 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65  n.State != Conne
d240: 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29  ctionState.Open)
d250: 20 6e 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d   newcnn.Open();.
d260: 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67  .          using
d270: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
d280: 3d 20 6e 65 77 63 6e 6e 2e 43 72 65 61 74 65 43  = newcnn.CreateC
d290: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
d2a0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
d2b0: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
d2c0: 65 78 74 20 3d 20 22 42 45 47 49 4e 20 54 52 41  ext = "BEGIN TRA
d2d0: 4e 53 41 43 54 49 4f 4e 22 3b 0d 0a 20 20 20 20  NSACTION";..    
d2e0: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
d2f0: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
d300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
d310: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
d320: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 50 6f  "CREATE TABLE Po
d330: 6f 6c 54 65 73 74 28 49 44 20 69 6e 74 20 70 72  olTest(ID int pr
d340: 69 6d 61 72 79 20 6b 65 79 29 22 3b 0d 0a 20 20  imary key)";..  
d350: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
d360: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
d370: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
d380: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
d390: 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  }..    }....    
d3a0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
d3b0: 20 20 20 2f 2f 2f 20 43 68 65 63 6b 73 20 74 6f     /// Checks to
d3c0: 20 6d 61 6b 65 20 73 75 72 65 20 74 72 61 6e 73   make sure trans
d3d0: 61 63 74 69 6f 6e 73 20 61 72 65 20 72 6f 6c 6c  actions are roll
d3e0: 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ed back before a
d3f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 67 6f 65 73   connection goes
d400: 20 62 61 63 6b 20 6f 6e 74 6f 20 74 68 65 20 70   back onto the p
d410: 6f 6f 6c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ool..    /// </s
d420: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54 65  ummary>..    [Te
d430: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
d440: 6c 20 76 6f 69 64 20 50 6f 6f 6c 69 6e 67 57 69  l void PoolingWi
d450: 74 68 54 72 61 6e 73 61 63 74 69 6f 6e 54 65 73  thTransactionTes
d460: 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  t()..    {..    
d470: 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 3b 0d    object value;.
d480: 0a 20 20 20 20 20 20 69 66 20 28 5f 63 6e 6e 73  .      if (_cnns
d490: 74 72 69 6e 67 2e 54 72 79 47 65 74 56 61 6c 75  tring.TryGetValu
d4a0: 65 28 22 50 6f 6f 6c 69 6e 67 22 2c 20 6f 75 74  e("Pooling", out
d4b0: 20 76 61 6c 75 65 29 20 3d 3d 20 66 61 6c 73 65   value) == false
d4c0: 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
d4d0: 70 74 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20 6e  ption("Pooling n
d4e0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 63 6f  ot present in co
d4f0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 22  nnection string"
d500: 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 28 62  );..      if ((b
d510: 6f 6f 6c 29 76 61 6c 75 65 20 3d 3d 20 66 61 6c  ool)value == fal
d520: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 49 6e  se) throw new In
d530: 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74  conclusiveExcept
d540: 69 6f 6e 28 22 50 6f 6f 6c 69 6e 67 20 6e 6f 74  ion("Pooling not
d550: 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 65 20   enabled in the 
d560: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
d570: 67 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 6d 61  g");....      ma
d580: 79 64 72 6f 70 74 61 62 6c 65 2e 41 64 64 28 22  ydroptable.Add("
d590: 50 6f 6f 6c 54 65 73 74 22 29 3b 0d 0a 20 20 20  PoolTest");..   
d5a0: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
d5b0: 30 3b 20 6e 20 3c 20 31 30 30 3b 20 6e 2b 2b 29  0; n < 100; n++)
d5c0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
d5d0: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6e 6e     using (DbConn
d5e0: 65 63 74 69 6f 6e 20 6e 65 77 63 6e 6e 20 3d 20  ection newcnn = 
d5f0: 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 5f 63 6e  ((ICloneable)_cn
d600: 6e 29 2e 43 6c 6f 6e 65 28 29 20 61 73 20 44 62  n).Clone() as Db
d610: 43 6f 6e 6e 65 63 74 69 6f 6e 29 0d 0a 20 20 20  Connection)..   
d620: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
d630: 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61    if (newcnn.Sta
d640: 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e  te != Connection
d650: 53 74 61 74 65 2e 4f 70 65 6e 29 20 6e 65 77 63  State.Open) newc
d660: 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20 20  nn.Open();..    
d670: 20 20 20 20 20 20 44 62 54 72 61 6e 73 61 63 74        DbTransact
d680: 69 6f 6e 20 74 72 61 6e 73 20 3d 20 6e 65 77 63  ion trans = newc
d690: 6e 6e 2e 42 65 67 69 6e 54 72 61 6e 73 61 63 74  nn.BeginTransact
d6a0: 69 6f 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ion();..        
d6b0: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
d6c0: 6e 64 20 63 6d 64 20 3d 20 6e 65 77 63 6e 6e 2e  nd cmd = newcnn.
d6d0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
d6e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
d6f0: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 54             cmd.T
d700: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 74 72 61  ransaction = tra
d710: 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ns;..           
d720: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
d730: 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   = "CREATE TABLE
d740: 20 50 6f 6f 6c 54 65 73 74 28 49 44 20 69 6e 74   PoolTest(ID int
d750: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 22 3b 0d   primary key)";.
d760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64  .            cmd
d770: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
d780: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ();..          }
d790: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
d7a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
d7b0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
d7c0: 0d 0a 20 20 20 20 2f 2f 2f 20 43 68 65 63 6b 73  ..    /// Checks
d7d0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
d7e0: 20 63 61 6e 20 6f 70 65 6e 20 44 42 20 72 65 61   can open DB rea
d7f0: 64 20 6f 6e 6c 79 2e 0d 0a 20 20 20 20 2f 2f 2f  d only...    ///
d800: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
d810: 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74   [Test]..    int
d820: 65 72 6e 61 6c 20 76 6f 69 64 20 52 65 61 64 4f  ernal void ReadO
d830: 6e 6c 79 54 65 73 74 28 29 0d 0a 20 20 20 20 7b  nlyTest()..    {
d840: 0d 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 52  ..      string R
d850: 4f 5f 63 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  O_connectionStri
d860: 6e 67 20 3d 20 5f 63 6e 6e 73 74 72 69 6e 67 2e  ng = _cnnstring.
d870: 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67  ConnectionString
d880: 3b 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  ;..      object 
d890: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 69 66  value;..      if
d8a0: 20 28 5f 63 6e 6e 73 74 72 69 6e 67 2e 54 72 79   (_cnnstring.Try
d8b0: 47 65 74 56 61 6c 75 65 28 22 52 65 61 64 20 4f  GetValue("Read O
d8c0: 6e 6c 79 22 2c 20 6f 75 74 20 76 61 6c 75 65 29  nly", out value)
d8d0: 20 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20 20   == false)..    
d8e0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 68 72    {..        thr
d8f0: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
d900: 28 22 52 65 61 64 20 4f 6e 6c 79 20 6e 6f 74 20  ("Read Only not 
d910: 73 75 70 70 6f 72 74 65 64 20 62 79 20 63 6f 6e  supported by con
d920: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 22 29  nection string")
d930: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
d940: 20 20 69 66 20 28 28 62 6f 6f 6c 29 76 61 6c 75    if ((bool)valu
d950: 65 20 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20  e == false)..   
d960: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f     {..        //
d970: 20 22 52 65 61 64 20 4f 6e 6c 79 22 20 6e 6f 74   "Read Only" not
d980: 20 70 72 65 73 65 6e 74 20 69 6e 20 63 6f 6e 6e   present in conn
d990: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 2d 20  ection string - 
d9a0: 61 64 64 20 69 74 0d 0a 20 20 20 20 20 20 20 20  add it..        
d9b0: 52 4f 5f 63 6f 6e 6e 65 63 74 69 6f 6e 53 74 72  RO_connectionStr
d9c0: 69 6e 67 20 2b 3d 20 22 3b 52 65 61 64 20 4f 6e  ing += ";Read On
d9d0: 6c 79 3d 74 72 75 65 22 3b 0d 0a 20 20 20 20 20  ly=true";..     
d9e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6d 61 79 64   }....      mayd
d9f0: 72 6f 70 74 61 62 6c 65 2e 41 64 64 28 22 52 65  roptable.Add("Re
da00: 61 64 4f 6e 6c 79 54 65 73 74 22 29 3b 0d 0a 0d  adOnlyTest");...
da10: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
da20: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63 6e  Connection newcn
da30: 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c 65  n = ((ICloneable
da40: 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61  )_cnn).Clone() a
da50: 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29 0d  s DbConnection).
da60: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
da70: 20 20 69 66 20 28 6e 65 77 63 6e 6e 2e 53 74 61    if (newcnn.Sta
da80: 74 65 20 3d 3d 20 43 6f 6e 6e 65 63 74 69 6f 6e  te == Connection
da90: 53 74 61 74 65 2e 4f 70 65 6e 29 20 0d 0a 20 20  State.Open) ..  
daa0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
dab0: 20 20 20 6e 65 77 63 6e 6e 2e 43 6c 6f 73 65 28     newcnn.Close(
dac0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
dad0: 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e 43 6f         newcnn.Co
dae0: 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 20 3d  nnectionString =
daf0: 20 52 4f 5f 63 6f 6e 6e 65 63 74 69 6f 6e 53 74   RO_connectionSt
db00: 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20 20 20 6e  ring;..        n
db10: 65 77 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20  ewcnn.Open();.. 
db20: 20 20 20 20 20 20 20 6e 65 77 63 6e 6e 2e 44 69         newcnn.Di
db30: 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20  spose();..      
db40: 7d 20 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  } ..    }....   
db50: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
db60: 20 20 20 20 2f 2f 2f 20 43 68 65 63 6b 73 20 74      /// Checks t
db70: 6f 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  o extended error
db80: 20 63 6f 64 65 20 72 65 73 75 6c 74 20 73 75 70   code result sup
db90: 70 6f 72 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  port...    /// <
dba0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b  /summary>..    [
dbb0: 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72  Test]..    inter
dbc0: 6e 61 6c 20 76 6f 69 64 20 45 78 74 65 6e 64 65  nal void Extende
dbd0: 64 52 65 73 75 6c 74 43 6f 64 65 73 54 65 73 74  dResultCodesTest
dbe0: 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
dbf0: 20 69 66 20 28 5f 66 61 63 74 2e 47 65 74 54 79   if (_fact.GetTy
dc00: 70 65 28 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f  pe().Name.IndexO
dc10: 66 28 22 53 51 4c 69 74 65 22 2c 20 53 74 72 69  f("SQLite", Stri
dc20: 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64  ngComparison.Ord
dc30: 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20  inalIgnoreCase) 
dc40: 3e 20 2d 31 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  > -1)..      {..
dc50: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f          SQLiteCo
dc60: 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 20 3d 20 6e  nnection cnn = n
dc70: 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  ew SQLiteConnect
dc80: 69 6f 6e 28 5f 63 6e 6e 73 74 72 69 6e 67 2e 43  ion(_cnnstring.C
dc90: 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 29  onnectionString)
dca0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6e 6e  ;....        cnn
dcb0: 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20  .Open();....    
dcc0: 20 20 20 20 2f 2f 20 54 75 72 6e 20 6f 6e 20 65      // Turn on e
dcd0: 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
dce0: 6f 64 65 73 0d 0a 20 20 20 20 20 20 20 20 63 6e  odes..        cn
dcf0: 6e 2e 53 65 74 45 78 74 65 6e 64 65 64 52 65 73  n.SetExtendedRes
dd00: 75 6c 74 43 6f 64 65 73 28 74 72 75 65 29 3b 0d  ultCodes(true);.
dd10: 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ...        int r
dd20: 63 20 3d 20 63 6e 6e 2e 52 65 73 75 6c 74 43 6f  c = cnn.ResultCo
dd30: 64 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 69  de();..        i
dd40: 6e 74 20 78 72 63 20 3d 20 63 6e 6e 2e 45 78 74  nt xrc = cnn.Ext
dd50: 65 6e 64 65 64 52 65 73 75 6c 74 43 6f 64 65 28  endedResultCode(
dd60: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6e  );....        cn
dd70: 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20  n.Close();..    
dd80: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
dd90: 20 20 2f 2f 4c 6f 67 67 69 6e 67 20 45 76 65 6e    //Logging Even
dda0: 74 48 61 6e 64 6c 65 72 0d 0a 20 20 20 20 70 75  tHandler..    pu
ddb0: 62 6c 69 63 20 76 6f 69 64 20 4f 6e 4c 6f 67 45  blic void OnLogE
ddc0: 76 65 6e 74 28 6f 62 6a 65 63 74 20 73 65 6e 64  vent(object send
ddd0: 65 72 2c 20 4c 6f 67 45 76 65 6e 74 41 72 67 73  er, LogEventArgs
dde0: 20 6c 6f 67 45 76 65 6e 74 29 0d 0a 20 20 20 20   logEvent)..    
ddf0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  {..        int e
de00: 72 72 5f 63 6f 64 65 20 3d 20 6c 6f 67 45 76 65  rr_code = logEve
de10: 6e 74 2e 45 72 72 6f 72 43 6f 64 65 3b 0d 0a 20  nt.ErrorCode;.. 
de20: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 65 72         string er
de30: 72 5f 6d 73 67 20 3d 20 6c 6f 67 45 76 65 6e 74  r_msg = logEvent
de40: 2e 4d 65 73 73 61 67 65 3b 0d 0a 20 20 20 20 20  .Message;..     
de50: 20 20 20 6c 6f 67 65 76 65 6e 74 73 2b 2b 3b 0d     logevents++;.
de60: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
de70: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
de80: 20 2f 2f 2f 20 54 65 73 74 73 20 53 51 4c 49 54   /// Tests SQLIT
de90: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 20 73 75 70  E_CONFIG_LOG sup
dea0: 70 6f 72 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  port...    /// <
deb0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b  /summary>..    [
dec0: 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72  Test]..    inter
ded0: 6e 61 6c 20 76 6f 69 64 20 53 65 74 4c 6f 67 43  nal void SetLogC
dee0: 61 6c 6c 62 61 63 6b 54 65 73 74 28 29 0d 0a 20  allbackTest().. 
def0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66     {..        if
df00: 20 28 5f 66 61 63 74 2e 47 65 74 54 79 70 65 28   (_fact.GetType(
df10: 29 2e 4e 61 6d 65 2e 49 6e 64 65 78 4f 66 28 22  ).Name.IndexOf("
df20: 53 51 4c 69 74 65 22 2c 20 53 74 72 69 6e 67 43  SQLite", StringC
df30: 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61  omparison.Ordina
df40: 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3e 20 2d  lIgnoreCase) > -
df50: 31 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  1)..        {.. 
df60: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
df70: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 20  eConnection cnn 
df80: 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e  = new SQLiteConn
df90: 65 63 74 69 6f 6e 28 5f 63 6e 6e 73 74 72 69 6e  ection(_cnnstrin
dfa0: 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  g.ConnectionStri
dfb0: 6e 67 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ng);....        
dfc0: 20 20 20 20 2f 2f 20 63 72 65 61 74 65 20 61 6e      // create an
dfd0: 64 20 61 64 64 20 61 20 6c 6f 67 20 65 76 65 6e  d add a log even
dfe0: 74 20 68 61 6e 64 6c 65 72 0d 0a 20 20 20 20 20  t handler..     
dff0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 4c 6f 67         SQLiteLog
e000: 45 76 65 6e 74 48 61 6e 64 6c 65 72 20 6c 6f 67  EventHandler log
e010: 48 61 6e 64 6c 65 72 20 3d 20 6e 65 77 20 53 51  Handler = new SQ
e020: 4c 69 74 65 4c 6f 67 45 76 65 6e 74 48 61 6e 64  LiteLogEventHand
e030: 6c 65 72 28 4f 6e 4c 6f 67 45 76 65 6e 74 29 3b  ler(OnLogEvent);
e040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ..            SQ
e050: 4c 69 74 65 46 61 63 74 6f 72 79 20 73 71 6c 69  LiteFactory sqli
e060: 74 65 5f 66 61 63 74 20 3d 20 28 53 51 4c 69 74  te_fact = (SQLit
e070: 65 46 61 63 74 6f 72 79 29 5f 66 61 63 74 3b 0d  eFactory)_fact;.
e080: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
e090: 71 6c 69 74 65 5f 66 61 63 74 2e 4c 6f 67 20 2b  qlite_fact.Log +
e0a0: 3d 20 6c 6f 67 48 61 6e 64 6c 65 72 3b 0d 0a 0d  = logHandler;...
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 6e  .            cnn
e0c0: 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20  .Open();....    
e0d0: 20 20 20 20 20 20 20 20 6c 6f 67 65 76 65 6e 74          logevent
e0e0: 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 20  s = 0;....      
e0f0: 20 20 20 20 20 20 63 6e 6e 2e 4c 6f 67 4d 65 73        cnn.LogMes
e100: 73 61 67 65 28 31 2c 20 22 74 65 73 74 20 6c 6f  sage(1, "test lo
e110: 67 20 65 76 65 6e 74 22 29 3b 0d 0a 0d 0a 20 20  g event");....  
e120: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f            if (lo
e130: 67 65 76 65 6e 74 73 20 21 3d 20 31 29 0d 0a 20  gevents != 1).. 
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
e150: 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
e160: 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  on(String.Format
e170: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
e180: 20 20 20 20 20 20 20 22 4c 6f 67 20 65 76 65 6e         "Log even
e190: 74 20 63 6f 75 6e 74 20 7b 30 7d 20 69 6e 63 6f  t count {0} inco
e1a0: 72 72 65 63 74 2e 22 2c 20 6c 6f 67 65 76 65 6e  rrect.", logeven
e1b0: 74 73 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ts));....       
e1c0: 20 20 20 20 20 63 6e 6e 2e 43 6c 6f 73 65 28 29       cnn.Close()
e1d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
e1e0: 20 2f 2f 20 72 65 6d 6f 76 65 20 74 68 65 20 6c   // remove the l
e1f0: 6f 67 20 68 61 6e 64 6c 65 72 20 62 65 66 6f 72  og handler befor
e200: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
e210: 20 69 73 20 63 6c 6f 73 65 64 2e 0d 0a 20 20 20   is closed...   
e220: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
e230: 66 61 63 74 2e 4c 6f 67 20 2d 3d 20 6c 6f 67 48  fact.Log -= logH
e240: 61 6e 64 6c 65 72 3b 0d 0a 0d 0a 20 20 20 20 20  andler;....     
e250: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
e260: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
e270: 0d 0a 20 20 20 20 2f 2f 2f 20 4f 70 65 6e 20 61  ..    /// Open a
e280: 20 72 65 61 64 65 72 20 61 6e 64 20 74 68 65 6e   reader and then
e290: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
e2a0: 65 20 74 6f 20 74 65 73 74 20 74 68 65 20 77 72  e to test the wr
e2b0: 69 74 65 72 27 73 20 63 6f 6d 6d 61 6e 64 20 74  iter's command t
e2c0: 69 6d 65 6f 75 74 20 70 72 6f 70 65 72 74 79 0d  imeout property.
e2d0: 0a 20 20 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20  .    /// SQLite 
e2e0: 64 6f 65 73 6e 27 74 20 61 6c 6c 6f 77 20 61 20  doesn't allow a 
e2f0: 77 72 69 74 65 20 77 68 65 6e 20 61 20 72 65 61  write when a rea
e300: 64 65 72 20 69 73 20 61 63 74 69 76 65 2e 0d 0a  der is active...
e310: 20 20 20 20 2f 2f 2f 20 2a 2a 2a 20 4e 4f 54 45      /// *** NOTE
e320: 20 41 53 20 4f 46 20 33 2e 33 2e 38 20 74 68 69   AS OF 3.3.8 thi
e330: 73 20 74 65 73 74 20 6e 6f 20 6c 6f 6e 67 65 72  s test no longer
e340: 20 62 6c 6f 63 6b 73 20 62 65 63 61 75 73 65 20   blocks because 
e350: 53 51 4c 69 74 65 20 6e 6f 77 20 61 6c 6c 6f 77  SQLite now allow
e360: 73 20 79 6f 75 20 74 6f 20 75 70 64 61 74 65 20  s you to update 
e370: 74 61 62 6c 65 28 73 29 0d 0a 20 20 20 20 2f 2f  table(s)..    //
e380: 2f 20 77 68 69 6c 65 20 61 20 72 65 61 64 65 72  / while a reader
e390: 20 69 73 20 61 63 74 69 76 65 20 6f 6e 20 74 68   is active on th
e3a0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
e3b0: 6e 2e 20 20 54 68 65 72 65 66 6f 72 65 20 74 68  n.  Therefore th
e3c0: 65 20 74 69 6d 65 6f 75 74 20 74 65 73 74 20 69  e timeout test i
e3d0: 73 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 2f  s invalid..    /
e3e0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
e3f0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
e400: 20 54 69 6d 65 6f 75 74 54 65 73 74 28 29 0d 0a   TimeoutTest()..
e410: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65      {..      Che
e420: 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 0d 0a 20  ckSQLite();.... 
e430: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
e440: 6d 6d 61 6e 64 20 63 6d 64 52 65 61 64 20 3d 20  mmand cmdRead = 
e450: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
e460: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
e470: 20 20 20 20 20 20 20 20 63 6d 64 52 65 61 64 2e          cmdRead.
e480: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
e490: 45 4c 45 43 54 20 49 44 20 46 52 4f 4d 20 54 65  ELECT ID FROM Te
e4a0: 73 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20 20  stCase";..      
e4b0: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
e4c0: 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64 52 65  eader rd = cmdRe
e4d0: 61 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  ad.ExecuteReader
e4e0: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ())..        {..
e4f0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
e500: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 77 72  (DbCommand cmdwr
e510: 69 74 65 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  ite = _cnn.Creat
e520: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
e530: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
e540: 20 20 20 20 20 20 63 6d 64 77 72 69 74 65 2e 43        cmdwrite.C
e550: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 55 50  ommandText = "UP
e560: 44 41 54 45 20 5b 4b 65 79 49 6e 66 6f 54 65 73  DATE [KeyInfoTes
e570: 74 5d 20 53 45 54 20 5b 49 44 5d 20 3d 20 5b 49  t] SET [ID] = [I
e580: 44 5d 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  D]";..          
e590: 20 20 63 6d 64 77 72 69 74 65 2e 43 6f 6d 6d 61    cmdwrite.Comma
e5a0: 6e 64 54 69 6d 65 6f 75 74 20 3d 20 35 3b 0d 0a  ndTimeout = 5;..
e5b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
e5c0: 74 20 64 77 74 69 63 6b 20 3d 20 45 6e 76 69 72  t dwtick = Envir
e5d0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
e5e0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ;..            t
e5f0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
e600: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
e610: 20 63 6d 64 77 72 69 74 65 2e 45 78 65 63 75 74   cmdwrite.Execut
e620: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20  eNonQuery();..  
e630: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
e640: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
e650: 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20  Exception)..    
e660: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
e670: 20 20 20 20 20 20 20 20 20 64 77 74 69 63 6b 20           dwtick 
e680: 3d 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54  = (Environment.T
e690: 69 63 6b 43 6f 75 6e 74 20 2d 20 64 77 74 69 63  ickCount - dwtic
e6a0: 6b 29 20 2f 20 31 30 30 30 3b 0d 0a 20 20 20 20  k) / 1000;..    
e6b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 77            if (dw
e6c0: 74 69 63 6b 20 3c 20 35 20 7c 7c 20 64 77 74 69  tick < 5 || dwti
e6d0: 63 6b 20 3e 20 36 29 0d 0a 20 20 20 20 20 20 20  ck > 6)..       
e6e0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
e6f0: 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 54 69  ew Exception("Ti
e700: 6d 65 6f 75 74 20 64 69 64 6e 27 74 20 77 61 69  meout didn't wai
e710: 74 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 21 22 29  t long enough!")
e720: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
e730: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20     return;..    
e740: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
e750: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
e760: 20 45 78 63 65 70 74 69 6f 6e 28 22 4f 70 65 72   Exception("Oper
e770: 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76  ation should hav
e780: 65 20 66 61 69 6c 65 64 20 62 75 74 20 63 6f 6d  e failed but com
e790: 70 6c 65 74 65 64 20 73 75 63 63 65 73 73 66 75  pleted successfu
e7a0: 6c 6c 79 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  lly");..        
e7b0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
e7c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
e7d0: 0d 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75  ..    [Test(Sequ
e7e0: 65 6e 63 65 20 3d 20 34 31 29 5d 0d 0a 20 20 20  ence = 41)]..   
e7f0: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 54   internal void T
e800: 72 61 6e 73 61 63 74 69 6f 6e 53 63 6f 70 65 54  ransactionScopeT
e810: 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
e820: 20 20 20 20 75 73 69 6e 67 20 28 54 72 61 6e 73      using (Trans
e830: 61 63 74 69 6f 6e 53 63 6f 70 65 20 73 63 6f 70  actionScope scop
e840: 65 20 3d 20 6e 65 77 20 54 72 61 6e 73 61 63 74  e = new Transact
e850: 69 6f 6e 53 63 6f 70 65 28 29 29 0d 0a 20 20 20  ionScope())..   
e860: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 73     {..        us
e870: 69 6e 67 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f  ing (DbConnectio
e880: 6e 20 63 6e 6e 32 20 3d 20 28 28 49 43 6c 6f 6e  n cnn2 = ((IClon
e890: 65 61 62 6c 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e  eable)_cnn).Clon
e8a0: 65 28 29 20 61 73 20 44 62 43 6f 6e 6e 65 63 74  e() as DbConnect
e8b0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ion)..        {.
e8c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63  .          if (c
e8d0: 6e 6e 32 2e 53 74 61 74 65 20 21 3d 20 43 6f 6e  nn2.State != Con
e8e0: 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e 4f 70 65  nectionState.Ope
e8f0: 6e 29 20 63 6e 6e 32 2e 4f 70 65 6e 28 29 3b 0d  n) cnn2.Open();.
e900: 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67  .          using
e910: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
e920: 3d 20 63 6e 6e 32 2e 43 72 65 61 74 65 43 6f 6d  = cnn2.CreateCom
e930: 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20  mand())..       
e940: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
e950: 20 20 2f 2f 20 43 72 65 61 74 65 64 20 61 20 74    // Created a t
e960: 61 62 6c 65 20 69 6e 73 69 64 65 20 74 68 65 20  able inside the 
e970: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 63 6f 70  transaction scop
e980: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e..            c
e990: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
e9a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 56   "CREATE TABLE V
e9b0: 6f 6c 61 74 69 6c 65 54 61 62 6c 65 20 28 49 44  olatileTable (ID
e9c0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
e9d0: 20 4b 45 59 2c 20 4d 79 56 61 6c 75 65 20 56 41   KEY, MyValue VA
e9e0: 52 43 48 41 52 28 35 30 29 29 22 3b 0d 0a 20 20  RCHAR(50))";..  
e9f0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
ea00: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
ea10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ea20: 6d 61 79 64 72 6f 70 74 61 62 6c 65 2e 41 64 64  maydroptable.Add
ea30: 28 22 56 6f 6c 61 74 69 6c 65 54 61 62 6c 65 22  ("VolatileTable"
ea40: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
ea50: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
ea60: 6e 64 20 63 6d 64 32 20 3d 20 63 6e 6e 32 2e 43  nd cmd2 = cnn2.C
ea70: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
ea80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
eaa0: 69 6e 67 20 28 63 6d 64 32 2e 54 72 61 6e 73 61  ing (cmd2.Transa
eab0: 63 74 69 6f 6e 20 3d 20 63 6e 6e 32 2e 42 65 67  ction = cnn2.Beg
eac0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29  inTransaction())
ead0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eae0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
eaf0: 20 20 20 2f 2f 20 49 6e 73 65 72 74 69 6e 67 20     // Inserting 
eb00: 61 20 76 61 6c 75 65 20 69 6e 73 69 64 65 20 74  a value inside t
eb10: 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 69 64 65  he table, inside
eb20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
eb30: 68 69 63 68 20 69 73 20 69 6e 73 69 64 65 20 74  hich is inside t
eb40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
eb50: 63 6f 70 65 0d 0a 20 20 20 20 20 20 20 20 20 20  cope..          
eb60: 20 20 20 20 20 20 63 6d 64 32 2e 43 6f 6d 6d 61        cmd2.Comma
eb70: 6e 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54  ndText = "INSERT
eb80: 20 49 4e 54 4f 20 56 6f 6c 61 74 69 6c 65 54 61   INTO VolatileTa
eb90: 62 6c 65 20 28 49 44 2c 20 4d 79 56 61 6c 75 65  ble (ID, MyValue
eba0: 29 20 56 41 4c 55 45 53 28 31 2c 20 27 48 65 6c  ) VALUES(1, 'Hel
ebb0: 6c 6f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20  lo')";..        
ebc0: 20 20 20 20 20 20 20 20 63 6d 64 32 2e 45 78 65          cmd2.Exe
ebd0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
ebe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ebf0: 20 63 6d 64 32 2e 54 72 61 6e 73 61 63 74 69 6f   cmd2.Transactio
ec00: 6e 2e 43 6f 6d 6d 69 74 28 29 3b 0d 0a 20 20 20  n.Commit();..   
ec10: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
ec20: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
ec30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ec40: 20 20 20 20 2f 2f 20 43 6f 6e 6e 65 63 74 69 6f      // Connectio
ec50: 6e 20 69 73 20 64 69 73 70 6f 73 65 64 20 62 65  n is disposed be
ec60: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
ec70: 74 69 6f 6e 73 63 6f 70 65 20 6c 65 61 76 65 73  tionscope leaves
ec80: 2c 20 74 68 65 72 65 62 79 20 66 6f 72 63 69 6e  , thereby forcin
ec90: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
eca0: 20 74 6f 20 73 74 61 79 20 6f 70 65 6e 0d 0a 20   to stay open.. 
ecb0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ecc0: 20 20 2f 2f 20 45 78 69 74 20 74 68 65 20 74 72    // Exit the tr
ecd0: 61 6e 73 61 63 74 69 6f 6e 73 63 6f 70 65 20 77  ansactionscope w
ece0: 69 74 68 6f 75 74 20 63 6f 6d 6d 69 74 74 69 6e  ithout committin
ecf0: 67 20 69 74 2c 20 63 61 75 73 69 6e 67 20 61 20  g it, causing a 
ed00: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 62 6f 74 68  rollback of both
ed10: 20 74 68 65 20 63 72 65 61 74 65 20 74 61 62 6c   the create tabl
ed20: 65 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  e and the insert
ed30: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
ed40: 20 20 20 2f 2f 20 56 65 72 69 66 79 20 74 68 61     // Verify tha
ed50: 74 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73  t the table does
ed60: 20 6e 6f 74 20 65 78 69 73 74 0d 0a 20 20 20 20   not exist..    
ed70: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
ed80: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
ed90: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
eda0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
edb0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
edc0: 20 3d 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54   = "SELECT COUNT
edd0: 28 2a 29 20 46 52 4f 4d 20 56 6f 6c 61 74 69 6c  (*) FROM Volatil
ede0: 65 54 61 62 6c 65 22 3b 0d 0a 20 20 20 20 20 20  eTable";..      
edf0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
ee00: 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
ee10: 63 74 20 6f 20 3d 20 63 6d 64 2e 45 78 65 63 75  ct o = cmd.Execu
ee20: 74 65 53 63 61 6c 61 72 28 29 3b 0d 0a 20 20 20  teScalar();..   
ee30: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
ee40: 6e 64 54 65 78 74 20 3d 20 22 44 52 4f 50 20 54  ndText = "DROP T
ee50: 41 42 4c 45 20 56 6f 6c 61 74 69 6c 65 54 61 62  ABLE VolatileTab
ee60: 6c 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  le";..          
ee70: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
ee80: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
ee90: 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61    throw new Inva
eea0: 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65  lidOperationExce
eeb0: 70 74 69 6f 6e 28 22 54 72 61 6e 73 61 63 74 69  ption("Transacti
eec0: 6f 6e 20 66 61 69 6c 65 64 21 20 54 68 65 20 74  on failed! The t
eed0: 61 62 6c 65 20 65 78 69 73 74 73 21 22 29 3b 0d  able exists!");.
eee0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
eef0: 20 20 20 20 63 61 74 63 68 28 45 78 63 65 70 74      catch(Except
ef00: 69 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20  ion e)..        
ef10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
ef20: 28 65 20 69 73 20 49 6e 76 61 6c 69 64 4f 70 65  (e is InvalidOpe
ef30: 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 29  rationException)
ef40: 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
ef50: 74 69 6f 6e 28 65 2e 4d 65 73 73 61 67 65 29 3b  tion(e.Message);
ef60: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
ef70: 72 6e 3b 20 2f 2f 20 53 75 63 63 65 65 64 65 64  rn; // Succeeded
ef80: 2c 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  , the table shou
ef90: 6c 64 20 6e 6f 74 20 68 61 76 65 20 65 78 69 73  ld not have exis
efa0: 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ted..        }..
efb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
efc0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
efd0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 61 75  ry>..    /// Cau
efe0: 73 65 73 20 74 68 65 20 75 73 65 72 2d 64 65 66  ses the user-def
eff0: 69 6e 65 64 20 61 67 67 72 65 67 61 74 65 20 74  ined aggregate t
f000: 6f 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68  o be iterated th
f010: 72 6f 75 67 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c  rough..    /// <
f020: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
f030: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65  // <returns></re
f040: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 5b 54 65 73  turns>..    [Tes
f050: 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  t]..    internal
f060: 20 73 74 72 69 6e 67 20 55 73 65 72 41 67 67 72   string UserAggr
f070: 65 67 61 74 65 28 29 0d 0a 20 20 20 20 7b 0d 0a  egate()..    {..
f080: 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74        CheckSQLit
f090: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 53 74  e();....      St
f0a0: 72 69 6e 67 42 75 69 6c 64 65 72 20 62 75 69 6c  ringBuilder buil
f0b0: 64 65 72 20 3d 20 6e 65 77 20 53 74 72 69 6e 67  der = new String
f0c0: 42 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20  Builder();..    
f0d0: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
f0e0: 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72  nd cmd = _cnn.Cr
f0f0: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a  eateCommand())..
f100: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f110: 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 20   int dtStart;.. 
f120: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
f130: 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ;..        int n
f140: 43 6f 75 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20  Count;....      
f150: 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
f160: 74 20 3d 20 22 53 45 4c 45 43 54 20 4d 79 43 6f  t = "SELECT MyCo
f170: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 54 65 73 74  unt(*) FROM Test
f180: 43 61 73 65 22 3b 0d 0a 0d 0a 20 20 20 20 20 20  Case";....      
f190: 20 20 6e 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20    nCount = 0;.. 
f1a0: 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20 3d         dtStart =
f1b0: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
f1c0: 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20  kCount;..       
f1d0: 20 77 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d   while (Environm
f1e0: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20  ent.TickCount - 
f1f0: 64 74 53 74 61 72 74 20 3c 20 31 30 30 30 29 0d  dtStart < 1000).
f200: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
f210: 20 20 20 20 20 20 6e 20 3d 20 43 6f 6e 76 65 72        n = Conver
f220: 74 2e 54 6f 49 6e 74 33 32 28 63 6d 64 2e 45 78  t.ToInt32(cmd.Ex
f230: 65 63 75 74 65 53 63 61 6c 61 72 28 29 29 3b 0d  ecuteScalar());.
f240: 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 75 6e  .          nCoun
f250: 74 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  t++;..        }.
f260: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 21  .        if (n !
f270: 3d 20 31 32 30 30 30 33 29 20 74 68 72 6f 77 20  = 120003) throw 
f280: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 55  new Exception("U
f290: 6e 65 78 70 65 63 74 65 64 20 63 6f 75 6e 74 22  nexpected count"
f2a0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 62 75 69 6c  );..        buil
f2b0: 64 65 72 2e 41 70 70 65 6e 64 28 53 74 72 69 6e  der.Append(Strin
f2c0: 67 2e 46 6f 72 6d 61 74 28 22 55 73 65 72 41 67  g.Format("UserAg
f2d0: 67 72 65 67 61 74 65 20 65 78 65 63 75 74 65 64  gregate executed
f2e0: 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
f2f0: 73 65 63 6f 6e 64 2e 22 2c 20 6e 43 6f 75 6e 74  second.", nCount
f300: 29 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ));..      }..  
f310: 20 20 20 20 72 65 74 75 72 6e 20 62 75 69 6c 64      return build
f320: 65 72 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a  er.ToString();..
f330: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
f340: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
f350: 2f 2f 2f 20 43 61 75 73 65 73 20 74 68 65 20 75  /// Causes the u
f360: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c  ser-defined coll
f370: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
f380: 6f 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68  o be iterated th
f390: 72 6f 75 67 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c  rough..    /// <
f3a0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 5b  /summary>..    [
f3b0: 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72  Test]..    inter
f3c0: 6e 61 6c 20 76 6f 69 64 20 55 73 65 72 43 6f 6c  nal void UserCol
f3d0: 6c 61 74 69 6f 6e 28 29 0d 0a 20 20 20 20 7b 0d  lation()..    {.
f3e0: 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69  .      CheckSQLi
f3f0: 74 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 75  te();....      u
f400: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
f410: 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
f420: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
f430: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f     {..        //
f440: 20 55 73 69 6e 67 20 61 20 64 65 66 61 75 6c 74   Using a default
f450: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
f460: 6e 63 65 20 69 6e 20 64 65 73 63 65 6e 64 69 6e  nce in descendin
f470: 67 20 6f 72 64 65 72 2c 20 22 50 61 72 61 6d 20  g order, "Param 
f480: 46 69 65 6c 64 33 22 20 77 69 6c 6c 20 61 70 70  Field3" will app
f490: 65 61 72 20 61 74 20 74 68 65 20 74 6f 70 0d 0a  ear at the top..
f4a0: 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 64 20 22          // and "
f4b0: 46 69 65 6c 64 33 22 20 77 69 6c 6c 20 62 65 20  Field3" will be 
f4c0: 6e 65 78 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  next, followed b
f4d0: 79 20 61 20 4e 55 4c 4c 2e 20 20 4f 75 72 20 75  y a NULL.  Our u
f4e0: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c  ser-defined coll
f4f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
f500: 69 6c 6c 20 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ill ..        //
f510: 20 64 65 6c 69 62 65 72 61 74 65 6c 79 20 70 6c   deliberately pl
f520: 61 63 65 20 74 68 65 6d 20 6f 75 74 20 6f 66 20  ace them out of 
f530: 6f 72 64 65 72 20 73 6f 20 46 69 65 6c 64 33 20  order so Field3 
f540: 69 73 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  is first...     
f550: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
f560: 78 74 20 3d 20 22 53 45 4c 45 43 54 20 5b 46 69  xt = "SELECT [Fi
f570: c3 ab 6c 64 33 5d 20 46 52 4f 4d 20 54 65 73 74  ..ld3] FROM Test
f580: 43 61 73 65 20 4f 52 44 45 52 20 42 59 20 5b 46  Case ORDER BY [F
f590: 69 c3 ab 6c 64 33 5d 20 43 4f 4c 4c 41 54 45 20  i..ld3] COLLATE 
f5a0: 4d 59 53 45 51 55 45 4e 43 45 20 44 45 53 43 22  MYSEQUENCE DESC"
f5b0: 3b 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ;..        strin
f5c0: 67 20 73 20 3d 20 28 73 74 72 69 6e 67 29 63 6d  g s = (string)cm
f5d0: 64 2e 45 78 65 63 75 74 65 53 63 61 6c 61 72 28  d.ExecuteScalar(
f5e0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  );..        if (
f5f0: 73 20 21 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20  s != "Fi..ld3") 
f600: 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
f610: 69 6f 6e 28 22 4d 79 53 65 71 75 65 6e 63 65 20  ion("MySequence 
f620: 64 69 64 6e 27 74 20 73 6f 72 74 20 70 72 6f 70  didn't sort prop
f630: 65 72 6c 79 22 29 3b 0d 0a 20 20 20 20 20 20 7d  erly");..      }
f640: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
f650: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
f660: 20 20 2f 2f 2f 20 43 61 75 73 65 73 20 74 68 65    /// Causes the
f670: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
f680: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 6c  nction to be cal
f690: 6c 65 64 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  led..    /// </s
f6a0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
f6b0: 20 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75   <returns></retu
f6c0: 72 6e 73 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d  rns>..    [Test]
f6d0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
f6e0: 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69  tring UserFuncti
f6f0: 6f 6e 31 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on1()..    {..  
f700: 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28      CheckSQLite(
f710: 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  );..      using 
f720: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
f730: 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d   _cnn.CreateComm
f740: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d  and())..      {.
f750: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69  .        int nTi
f760: 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e  mes;..        in
f770: 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20  t dtStart;....  
f780: 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30        nTimes = 0
f790: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
f7a0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
f7b0: 4c 45 43 54 20 46 6f 6f 28 27 65 65 27 2c 27 66  LECT Foo('ee','f
f7c0: 6f 6f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20 20  oo')";..        
f7d0: 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f  dtStart = Enviro
f7e0: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
f7f0: 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ..        while 
f800: 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63  (Environment.Tic
f810: 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74  kCount - dtStart
f820: 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20 20   < 1000)..      
f830: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63    {..          c
f840: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
f850: 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ry();..         
f860: 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20   nTimes++;..    
f870: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
f880: 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72  eturn String.For
f890: 6d 61 74 28 22 55 73 65 72 20 28 74 65 78 74 29  mat("User (text)
f8a0: 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65   command execute
f8b0: 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31  d {0} times in 1
f8c0: 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65   second.", nTime
f8d0: 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  s);..      }..  
f8e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74    }....    [Test
f8f0: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
f900: 73 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74  string UserFunct
f910: 69 6f 6e 32 28 29 0d 0a 20 20 20 20 7b 0d 0a 20  ion2()..    {.. 
f920: 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65       CheckSQLite
f930: 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67  ();..      using
f940: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
f950: 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
f960: 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b  mand())..      {
f970: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54  ..        int nT
f980: 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69  imes;..        i
f990: 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20  nt dtStart;.... 
f9a0: 20 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20         nTimes = 
f9b0: 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  0;..        cmd.
f9c0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
f9d0: 45 4c 45 43 54 20 46 6f 6f 28 31 30 2c 31 31 29  ELECT Foo(10,11)
f9e0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53 74  ";..        dtSt
f9f0: 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  art = Environmen
fa00: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
fa10: 20 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e 76        while (Env
fa20: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
fa30: 6e 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20 31  nt - dtStart < 1
fa40: 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  000)..        {.
fa50: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45  .          cmd.E
fa60: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
fa70: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69  ;..          nTi
fa80: 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20  mes++;..        
fa90: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
faa0: 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n String.Format(
fab0: 22 55 73 65 72 46 75 6e 63 74 69 6f 6e 20 63 6f  "UserFunction co
fac0: 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20 7b  mmand executed {
fad0: 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73 65  0} times in 1 se
fae0: 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29 3b  cond.", nTimes);
faf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
fb00: 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a  ....    [Test]..
fb10: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72      internal str
fb20: 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f 6e  ing UserFunction
fb30: 33 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  3()..    {..    
fb40: 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b    CheckSQLite();
fb50: 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
fb60: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
fb70: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
fb80: 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
fb90: 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d 65         int nTime
fba0: 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s;..        int 
fbb0: 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20 20  dtStart;....    
fbc0: 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b 0d      nTimes = 0;.
fbd0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
fbe0: 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45  mandText = "SELE
fbf0: 43 54 20 41 42 53 28 31 29 22 3b 0d 0a 20 20 20  CT ABS(1)";..   
fc00: 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45       dtStart = E
fc10: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
fc20: 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77  ount;..        w
fc30: 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e  hile (Environmen
fc40: 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74  t.TickCount - dt
fc50: 53 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20  Start < 1000).. 
fc60: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
fc70: 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
fc80: 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
fc90: 20 20 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d        nTimes++;.
fca0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
fcb0: 20 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e      return Strin
fcc0: 67 2e 46 6f 72 6d 61 74 28 22 49 6e 74 72 69 6e  g.Format("Intrin
fcd0: 73 69 63 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63  sic command exec
fce0: 75 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69  uted {0} times i
fcf0: 6e 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54  n 1 second.", nT
fd00: 69 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  imes);..      }.
fd10: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54  .    }....    [T
fd20: 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
fd30: 61 6c 20 73 74 72 69 6e 67 20 55 73 65 72 46 75  al string UserFu
fd40: 6e 63 74 69 6f 6e 34 28 29 0d 0a 20 20 20 20 7b  nction4()..    {
fd50: 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c  ..      CheckSQL
fd60: 69 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73  ite();..      us
fd70: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
fd80: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
fd90: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
fda0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74    {..        int
fdb0: 20 6e 54 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20   nTimes;..      
fdc0: 20 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a    int dtStart;..
fdd0: 0d 0a 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73  ..        nTimes
fde0: 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63   = 0;..        c
fdf0: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
fe00: 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 27   "SELECT lower('
fe10: 46 4f 4f 27 29 22 3b 0d 0a 20 20 20 20 20 20 20  FOO')";..       
fe20: 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72   dtStart = Envir
fe30: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
fe40: 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ;..        while
fe50: 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69   (Environment.Ti
fe60: 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72  ckCount - dtStar
fe70: 74 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20  t < 1000)..     
fe80: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
fe90: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
fea0: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
feb0: 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20    nTimes++;..   
fec0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
fed0: 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f  return String.Fo
fee0: 72 6d 61 74 28 22 49 6e 74 72 69 6e 20 28 74 78  rmat("Intrin (tx
fef0: 74 29 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  t) command execu
ff00: 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e  ted {0} times in
ff10: 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69   1 second.", nTi
ff20: 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  mes);..      }..
ff30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
ff40: 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  st]..    interna
ff50: 6c 20 73 74 72 69 6e 67 20 55 73 65 72 46 75 6e  l string UserFun
ff60: 63 74 69 6f 6e 35 28 29 0d 0a 20 20 20 20 7b 0d  ction5()..    {.
ff70: 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51 4c 69  .      CheckSQLi
ff80: 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 75 73 69  te();..      usi
ff90: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
ffa0: 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43  d = _cnn.CreateC
ffb0: 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20  ommand())..     
ffc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20   {..        int 
ffd0: 6e 54 69 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20  nTimes;..       
ffe0: 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d   int dtStart;...
fff0: 0a 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 20  .        nTimes 
10000 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  = 0;..        cm
10010 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
10020 22 53 45 4c 45 43 54 20 31 22 3b 0d 0a 20 20 20  "SELECT 1";..   
10030 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45       dtStart = E
10040 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
10050 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77  ount;..        w
10060 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e  hile (Environmen
10070 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74  t.TickCount - dt
10080 53 74 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20  Start < 1000).. 
10090 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
100a0 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e      cmd.ExecuteN
100b0 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20  onQuery();..    
100c0 20 20 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d        nTimes++;.
100d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
100e0 20 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e      return Strin
100f0 67 2e 46 6f 72 6d 61 74 28 22 52 61 77 20 56 61  g.Format("Raw Va
10100 6c 75 65 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63  lue command exec
10110 75 74 65 64 20 7b 30 7d 20 74 69 6d 65 73 20 69  uted {0} times i
10120 6e 20 31 20 73 65 63 6f 6e 64 2e 22 2c 20 6e 54  n 1 second.", nT
10130 69 6d 65 73 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  imes);..      }.
10140 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 20 20  .    }..    ..  
10150 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
10160 20 3d 20 34 32 29 5d 0d 0a 20 20 20 20 69 6e 74   = 42)]..    int
10170 65 72 6e 61 6c 20 76 6f 69 64 20 56 65 72 69 66  ernal void Verif
10180 79 42 69 6e 61 72 79 44 61 74 61 28 29 0d 0a 20  yBinaryData().. 
10190 20 20 20 7b 0d 0a 20 20 20 20 20 20 42 69 6e 61     {..      Bina
101a0 72 79 49 6e 73 65 72 74 28 29 3b 0d 0a 20 20 20  ryInsert();..   
101b0 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
101c0 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43  and cmd = _cnn.C
101d0 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
101e0 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
101f0 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
10200 74 20 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c  t = "SELECT Fiel
10210 64 36 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65  d6 FROM TestCase
10220 20 57 48 45 52 45 20 46 69 65 6c 64 36 20 49 53   WHERE Field6 IS
10230 20 4e 4f 54 20 4e 55 4c 4c 22 3b 0d 0a 20 20 20   NOT NULL";..   
10240 20 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20       byte[] b = 
10250 6e 65 77 20 62 79 74 65 5b 34 30 30 30 5d 3b 0d  new byte[4000];.
10260 0a 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  ...        using
10270 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
10280 64 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  d = cmd.ExecuteR
10290 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20  eader())..      
102a0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69    {..          i
102b0 66 20 28 72 64 2e 52 65 61 64 28 29 20 3d 3d 20  f (rd.Read() == 
102c0 66 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77  false) throw new
102d0 20 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 20 64   Exception("No d
102e0 61 74 61 20 74 6f 20 72 65 61 64 21 22 29 3b 0d  ata to read!");.
102f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  ...          lon
10300 67 20 6e 20 3d 20 72 64 2e 47 65 74 42 79 74 65  g n = rd.GetByte
10310 73 28 30 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c  s(0, 0, null, 0,
10320 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20   0);..          
10330 69 66 20 28 6e 20 21 3d 20 34 30 30 30 29 20 74  if (n != 4000) t
10340 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
10350 6f 6e 28 22 49 6e 76 61 6c 69 64 20 62 79 74 65  on("Invalid byte
10360 20 6c 65 6e 67 74 68 21 22 29 3b 0d 0a 0d 0a 20   length!");.... 
10370 20 20 20 20 20 20 20 20 20 72 64 2e 47 65 74 42           rd.GetB
10380 79 74 65 73 28 30 2c 20 30 2c 20 62 2c 20 30 2c  ytes(0, 0, b, 0,
10390 20 34 30 30 30 29 3b 0d 0a 0d 0a 20 20 20 20 20   4000);....     
103a0 20 20 20 20 20 69 66 20 28 62 5b 30 5d 20 21 3d       if (b[0] !=
103b0 20 31 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78   1) throw new Ex
103c0 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20  ception("Binary 
103d0 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20  value non-match 
103e0 62 79 74 65 20 30 22 29 3b 0d 0a 20 20 20 20 20  byte 0");..     
103f0 20 20 20 20 20 69 66 20 28 62 5b 31 30 30 5d 20       if (b[100] 
10400 21 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77 20  != 2) throw new 
10410 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61 72  Exception("Binar
10420 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63  y value non-matc
10430 68 20 62 79 74 65 20 31 30 30 22 29 3b 0d 0a 20  h byte 100");.. 
10440 20 20 20 20 20 20 20 20 20 69 66 20 28 62 5b 31           if (b[1
10450 30 30 30 5d 20 21 3d 20 33 29 20 74 68 72 6f 77  000] != 3) throw
10460 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
10470 42 69 6e 61 72 79 20 76 61 6c 75 65 20 6e 6f 6e  Binary value non
10480 2d 6d 61 74 63 68 20 62 79 74 65 20 31 30 30 30  -match byte 1000
10490 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ");..          i
104a0 66 20 28 62 5b 32 30 30 30 5d 20 21 3d 20 34 29  f (b[2000] != 4)
104b0 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
104c0 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61 6c  tion("Binary val
104d0 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74  ue non-match byt
104e0 65 20 32 30 30 30 22 29 3b 0d 0a 20 20 20 20 20  e 2000");..     
104f0 20 20 20 20 20 69 66 20 28 62 5b 33 30 30 30 5d       if (b[3000]
10500 20 21 3d 20 35 29 20 74 68 72 6f 77 20 6e 65 77   != 5) throw new
10510 20 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61   Exception("Bina
10520 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74  ry value non-mat
10530 63 68 20 62 79 74 65 20 33 30 30 30 22 29 3b 0d  ch byte 3000");.
10540 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
10550 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
10560 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20 69 6e    [Test]..    in
10570 74 65 72 6e 61 6c 20 76 6f 69 64 20 44 65 63 69  ternal void Deci
10580 6d 61 6c 54 65 73 74 28 29 0d 0a 20 20 20 20 7b  malTest()..    {
10590 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  ..      using (D
105a0 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f  bCommand cmd = _
105b0 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
105c0 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  d())..      {.. 
105d0 20 20 20 20 20 20 20 64 72 6f 70 74 61 62 6c 65         droptable
105e0 73 2e 41 64 64 28 22 44 45 43 54 45 53 54 22 29  s.Add("DECTEST")
105f0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 64  ;....        cmd
10600 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
10610 43 52 45 41 54 45 20 54 41 42 4c 45 20 44 45 43  CREATE TABLE DEC
10620 54 45 53 54 28 78 20 44 45 43 49 4d 41 4c 28 33  TEST(x DECIMAL(3
10630 38 2c 31 38 29 29 22 3b 0d 0a 20 20 20 20 20 20  8,18))";..      
10640 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e    cmd.ExecuteNon
10650 51 75 65 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20  Query();....    
10660 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
10670 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e  ext = "INSERT IN
10680 54 4f 20 44 45 43 54 45 53 54 28 78 29 20 56 41  TO DECTEST(x) VA
10690 4c 55 45 53 28 30 2e 30 30 30 30 31 29 22 3b 0d  LUES(0.00001)";.
106a0 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
106b0 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d  cuteNonQuery();.
106c0 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20  .        ..     
106d0 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
106e0 78 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20 46  xt = "SELECT * F
106f0 52 4f 4d 20 44 45 43 54 45 53 54 22 3b 0d 0a 20  ROM DECTEST";.. 
10700 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
10710 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65  DataReader reade
10720 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  r = cmd.ExecuteR
10730 65 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20  eader())..      
10740 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72    {..          r
10750 65 61 64 65 72 2e 52 65 61 64 28 29 3b 0d 0a 20  eader.Read();.. 
10760 20 20 20 20 20 20 20 20 20 64 65 63 69 6d 61 6c           decimal
10770 20 64 20 3d 20 28 64 65 63 69 6d 61 6c 29 72 65   d = (decimal)re
10780 61 64 65 72 2e 47 65 74 56 61 6c 75 65 28 30 29  ader.GetValue(0)
10790 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64 20 3d  ;..          d =
107a0 20 72 65 61 64 65 72 2e 47 65 74 44 65 63 69 6d   reader.GetDecim
107b0 61 6c 28 30 29 3b 0d 0a 20 20 20 20 20 20 20 20  al(0);..        
107c0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
107d0 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 28 53  }....    [Test(S
107e0 65 71 75 65 6e 63 65 20 3d 20 39 38 29 5d 0d 0a  equence = 98)]..
107f0 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
10800 64 20 53 63 61 6c 61 72 50 72 65 54 65 73 74 28  d ScalarPreTest(
10810 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
10820 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
10830 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
10840 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
10850 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 64      {..        d
10860 72 6f 70 74 61 62 6c 65 73 2e 41 64 64 28 22 53  roptables.Add("S
10870 43 41 4c 41 52 54 45 53 54 22 29 3b 0d 0a 0d 0a  CALARTEST");....
10880 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
10890 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41 54  andText = "CREAT
108a0 45 20 54 41 42 4c 45 20 53 43 41 4c 41 52 54 45  E TABLE SCALARTE
108b0 53 54 28 78 20 49 4e 54 45 47 45 52 20 50 52 49  ST(x INTEGER PRI
108c0 4d 41 52 59 20 4b 45 59 2c 20 79 29 22 3b 0d 0a  MARY KEY, y)";..
108d0 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
108e0 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a  uteNonQuery();..
108f0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69  ..        for (i
10900 6e 74 20 69 20 3d 20 31 3b 20 69 20 3c 3d 20 31  nt i = 1; i <= 1
10910 30 30 30 3b 20 69 2b 2b 29 0d 0a 20 20 20 20 20  000; i++)..     
10920 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
10930 44 62 50 61 72 61 6d 65 74 65 72 20 70 61 72 61  DbParameter para
10940 6d 31 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50  m1 = cmd.CreateP
10950 61 72 61 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20  arameter();.... 
10960 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 31 2e           param1.
10970 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
10980 22 70 61 72 61 6d 31 22 3b 0d 0a 20 20 20 20 20  "param1";..     
10990 20 20 20 20 20 70 61 72 61 6d 31 2e 44 62 54 79       param1.DbTy
109a0 70 65 20 3d 20 44 62 54 79 70 65 2e 49 6e 74 33  pe = DbType.Int3
109b0 32 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61  2;..          pa
109c0 72 61 6d 31 2e 56 61 6c 75 65 20 3d 20 69 3b 0d  ram1.Value = i;.
109d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 44 62 50  ...          DbP
109e0 61 72 61 6d 65 74 65 72 20 70 61 72 61 6d 32 20  arameter param2 
109f0 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61  = cmd.CreatePara
10a00 6d 65 74 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20  meter();....    
10a10 20 20 20 20 20 20 70 61 72 61 6d 32 2e 50 61 72        param2.Par
10a20 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 70 61  ameterName = "pa
10a30 72 61 6d 32 22 3b 0d 0a 20 20 20 20 20 20 20 20  ram2";..        
10a40 20 20 70 61 72 61 6d 32 2e 44 62 54 79 70 65 20    param2.DbType 
10a50 3d 20 44 62 54 79 70 65 2e 49 6e 74 33 32 3b 0d  = DbType.Int32;.
10a60 0a 20 20 20 20 20 20 20 20 20 20 70 61 72 61 6d  .          param
10a70 32 2e 56 61 6c 75 65 20 3d 20 69 3b 0d 0a 0d 0a  2.Value = i;....
10a80 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f            cmd.Co
10a90 6d 6d 61 6e 64 54 65 78 74 20 3d 0d 0a 20 20 20  mmandText =..   
10aa0 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
10ab0 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
10ac0 54 4f 20 53 43 41 4c 41 52 54 45 53 54 28 78 2c  TO SCALARTEST(x,
10ad0 20 79 29 20 56 41 4c 55 45 53 28 3f 2c 20 3f 29   y) VALUES(?, ?)
10ae0 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ";....          
10af0 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 43  cmd.Parameters.C
10b00 6c 65 61 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  lear();..       
10b10 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
10b20 73 2e 41 64 64 28 70 61 72 61 6d 31 29 3b 0d 0a  s.Add(param1);..
10b30 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61            cmd.Pa
10b40 72 61 6d 65 74 65 72 73 2e 41 64 64 28 70 61 72  rameters.Add(par
10b50 61 6d 32 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  am2);....       
10b60 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
10b70 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20  nQuery();..     
10b80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
10b90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73     }....    [Tes
10ba0 74 28 53 65 71 75 65 6e 63 65 20 3d 20 39 39 29  t(Sequence = 99)
10bb0 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
10bc0 76 6f 69 64 20 53 63 61 6c 61 72 54 65 73 74 28  void ScalarTest(
10bd0 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
10be0 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
10bf0 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61   cmd = _cnn.Crea
10c00 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20  teCommand())..  
10c10 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63      {..        c
10c20 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
10c30 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
10c40 53 43 41 4c 41 52 54 45 53 54 20 4f 52 44 45 52  SCALARTEST ORDER
10c50 20 42 59 20 78 22 3b 0d 0a 20 20 20 20 20 20 20   BY x";..       
10c60 20 63 6d 64 2e 45 78 65 63 75 74 65 53 63 61 6c   cmd.ExecuteScal
10c70 61 72 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ar();..      }..
10c80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65      }....    [Te
10c90 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20 33 30  st(Sequence = 30
10ca0 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  )]..    internal
10cb0 20 76 6f 69 64 20 56 65 72 69 66 79 49 6e 73 65   void VerifyInse
10cc0 72 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  rt()..    {..   
10cd0 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
10ce0 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43  and cmd = _cnn.C
10cf0 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0d  reateCommand()).
10d00 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
10d10 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78    cmd.CommandTex
10d20 74 20 3d 20 22 53 45 4c 45 43 54 20 46 69 65 6c  t = "SELECT Fiel
10d30 64 31 2c 20 46 69 65 6c 64 32 2c 20 5b 46 69 c3  d1, Field2, [Fi.
10d40 ab 6c 64 33 5d 2c 20 5b 46 69 c3 a6 6c 64 34 5d  .ld3], [Fi..ld4]
10d50 2c 20 46 69 65 6c 64 35 20 46 52 4f 4d 20 54 65  , Field5 FROM Te
10d60 73 74 43 61 73 65 22 3b 0d 0a 20 20 20 20 20 20  stCase";..      
10d70 20 20 63 6d 64 2e 50 72 65 70 61 72 65 28 29 3b    cmd.Prepare();
10d80 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ..        using 
10d90 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64  (DbDataReader rd
10da0 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
10db0 61 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  ader())..       
10dc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
10dd0 20 28 72 64 2e 52 65 61 64 28 29 29 0d 0a 20 20   (rd.Read())..  
10de0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
10df0 20 20 20 20 20 20 20 69 6e 74 20 46 69 65 6c 64         int Field
10e00 31 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32 28  1 = rd.GetInt32(
10e10 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
10e20 20 64 6f 75 62 6c 65 20 46 69 65 6c 64 32 20 3d   double Field2 =
10e30 20 72 64 2e 47 65 74 44 6f 75 62 6c 65 28 31 29   rd.GetDouble(1)
10e40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ;..            s
10e50 74 72 69 6e 67 20 46 69 65 6c 64 33 20 3d 20 72  tring Field3 = r
10e60 64 2e 47 65 74 53 74 72 69 6e 67 28 32 29 3b 0d  d.GetString(2);.
10e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
10e80 69 6e 67 20 46 69 65 6c 64 34 20 3d 20 72 64 2e  ing Field4 = rd.
10e90 47 65 74 53 74 72 69 6e 67 28 33 29 2e 54 72 69  GetString(3).Tri
10ea0 6d 45 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20 20  mEnd();..       
10eb0 20 20 20 20 20 44 61 74 65 54 69 6d 65 20 46 69       DateTime Fi
10ec0 65 6c 64 35 20 3d 20 72 64 2e 47 65 74 44 61 74  eld5 = rd.GetDat
10ed0 65 54 69 6d 65 28 34 29 3b 0d 0a 0d 0a 20 20 20  eTime(4);....   
10ee0 20 20 20 20 20 20 20 20 20 69 66 20 28 46 69 65           if (Fie
10ef0 6c 64 31 20 21 3d 20 31 29 20 74 68 72 6f 77 20  ld1 != 1) throw 
10f00 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74  new Exception(St
10f10 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 46 69 65  ring.Format("Fie
10f20 6c 64 31 20 7b 30 7d 20 64 69 64 20 6e 6f 74 20  ld1 {0} did not 
10f30 6d 61 74 63 68 20 7b 31 7d 22 2c 20 46 69 65 6c  match {1}", Fiel
10f40 64 31 2c 20 31 29 29 3b 0d 0a 20 20 20 20 20 20  d1, 1));..      
10f50 20 20 20 20 20 20 69 66 20 28 46 69 65 6c 64 32        if (Field2
10f60 20 21 3d 20 33 2e 31 34 31 35 39 29 20 74 68 72   != 3.14159) thr
10f70 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
10f80 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
10f90 46 69 65 6c 64 32 20 7b 30 7d 20 64 69 64 20 6e  Field2 {0} did n
10fa0 6f 74 20 6d 61 74 63 68 20 7b 31 7d 22 2c 20 46  ot match {1}", F
10fb0 69 65 6c 64 32 2c 20 33 2e 31 34 31 35 39 29 29  ield2, 3.14159))
10fc0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
10fd0 66 20 28 46 69 65 6c 64 33 20 21 3d 20 22 46 69  f (Field3 != "Fi
10fe0 c3 ab 6c 64 33 22 29 20 74 68 72 6f 77 20 6e 65  ..ld3") throw ne
10ff0 77 20 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69  w Exception(Stri
11000 6e 67 2e 46 6f 72 6d 61 74 28 22 46 69 65 6c 64  ng.Format("Field
11010 33 20 7b 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61  3 {0} did not ma
11020 74 63 68 20 7b 31 7d 22 2c 20 46 69 65 6c 64 33  tch {1}", Field3
11030 2c 20 22 46 69 c3 ab 6c 64 33 22 29 29 3b 0d 0a  , "Fi..ld3"));..
11040 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
11050 46 69 65 6c 64 34 20 21 3d 20 22 46 69 c3 a6 6c  Field4 != "Fi..l
11060 64 34 22 29 20 74 68 72 6f 77 20 6e 65 77 20 45  d4") throw new E
11070 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e  xception(String.
11080 46 6f 72 6d 61 74 28 22 46 69 65 6c 64 34 20 7b  Format("Field4 {
11090 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68  0} did not match
110a0 20 7b 31 7d 22 2c 20 46 69 65 6c 64 34 2c 20 22   {1}", Field4, "
110b0 46 69 c3 a6 6c 64 34 22 29 29 3b 0d 0a 20 20 20  Fi..ld4"));..   
110c0 20 20 20 20 20 20 20 20 20 69 66 20 28 46 69 65           if (Fie
110d0 6c 64 35 2e 43 6f 6d 70 61 72 65 54 6f 28 44 61  ld5.CompareTo(Da
110e0 74 65 54 69 6d 65 2e 50 61 72 73 65 28 22 32 30  teTime.Parse("20
110f0 30 35 2d 30 31 2d 30 31 20 31 33 3a 34 39 3a 30  05-01-01 13:49:0
11100 30 22 29 29 20 21 3d 20 30 29 20 74 68 72 6f 77  0")) != 0) throw
11110 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 53   new Exception(S
11120 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 46 69  tring.Format("Fi
11130 65 6c 64 35 20 7b 30 7d 20 64 69 64 20 6e 6f 74  eld5 {0} did not
11140 20 6d 61 74 63 68 20 7b 31 7d 22 2c 20 46 69 65   match {1}", Fie
11150 6c 64 34 2c 20 44 61 74 65 54 69 6d 65 2e 50 61  ld4, DateTime.Pa
11160 72 73 65 28 22 32 30 30 35 2d 30 31 2d 30 31 20  rse("2005-01-01 
11170 31 33 3a 34 39 3a 30 30 22 29 29 29 3b 0d 0a 0d  13:49:00")));...
11180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
11190 28 72 64 2e 47 65 74 4e 61 6d 65 28 30 29 20 21  (rd.GetName(0) !
111a0 3d 20 22 46 69 65 6c 64 31 22 29 20 74 68 72 6f  = "Field1") thro
111b0 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
111c0 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d  "Non-Match colum
111d0 6e 20 6e 61 6d 65 20 46 69 65 6c 64 31 22 29 3b  n name Field1");
111e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
111f0 20 28 72 64 2e 47 65 74 4e 61 6d 65 28 31 29 20   (rd.GetName(1) 
11200 21 3d 20 22 46 69 65 6c 64 32 22 29 20 74 68 72  != "Field2") thr
11210 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
11220 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75  ("Non-Match colu
11230 6d 6e 20 6e 61 6d 65 20 46 69 65 6c 64 32 22 29  mn name Field2")
11240 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
11250 66 20 28 72 64 2e 47 65 74 4e 61 6d 65 28 32 29  f (rd.GetName(2)
11260 20 21 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20 74   != "Fi..ld3") t
11270 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69  hrow new Excepti
11280 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 63 6f  on("Non-Match co
11290 6c 75 6d 6e 20 6e 61 6d 65 20 46 69 65 6c 64 33  lumn name Field3
112a0 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ");..           
112b0 20 69 66 20 28 72 64 2e 47 65 74 4e 61 6d 65 28   if (rd.GetName(
112c0 33 29 20 21 3d 20 22 46 69 c3 a6 6c 64 34 22 29  3) != "Fi..ld4")
112d0 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70   throw new Excep
112e0 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20  tion("Non-Match 
112f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 46 69 65 6c  column name Fiel
11300 64 34 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  d4");..         
11310 20 20 20 69 66 20 28 72 64 2e 47 65 74 4e 61 6d     if (rd.GetNam
11320 65 28 34 29 20 21 3d 20 22 46 69 65 6c 64 35 22  e(4) != "Field5"
11330 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
11340 70 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68  ption("Non-Match
11350 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 46 69 65   column name Fie
11360 6c 64 35 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ld5");..        
11370 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65    }..          e
11380 6c 73 65 20 74 68 72 6f 77 20 6e 65 77 20 45 78  lse throw new Ex
11390 63 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61 74 61  ception("No data
113a0 20 69 6e 20 74 61 62 6c 65 22 29 3b 0d 0a 20 20   in table");..  
113b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
113c0 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a  ..    }..  }....
113d0 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
113e0 0a 20 20 2f 2f 2f 20 53 63 61 6c 61 72 20 75 73  .  /// Scalar us
113f0 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
11400 69 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20 65 78  ion.  In this ex
11410 61 6d 70 6c 65 2c 20 74 68 65 20 73 61 6d 65 20  ample, the same 
11420 63 6c 61 73 73 20 69 73 20 64 65 63 6c 61 72 65  class is declare
11430 64 20 74 77 69 63 65 20 77 69 74 68 20 0d 0a 20  d twice with .. 
11440 20 2f 2f 2f 20 64 69 66 66 65 72 65 6e 74 20 66   /// different f
11450 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 74 6f  unction names to
11460 20 64 65 6d 6f 6e 73 74 72 61 74 65 20 68 6f 77   demonstrate how
11470 20 74 6f 20 75 73 65 20 61 6c 69 61 73 20 6e 61   to use alias na
11480 6d 65 73 20 66 6f 72 20 75 73 65 72 2d 64 65 66  mes for user-def
11490 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 2e 0d  ined functions..
114a0 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
114b0 3e 0d 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e 63  >..  [SQLiteFunc
114c0 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 46 6f 6f  tion(Name = "Foo
114d0 22 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 32  ", Arguments = 2
114e0 2c 20 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e  , FuncType = Fun
114f0 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72  ctionType.Scalar
11500 29 5d 0d 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e  )]..  [SQLiteFun
11510 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 54 65  ction(Name = "Te
11520 73 74 46 75 6e 63 22 2c 20 41 72 67 75 6d 65 6e  stFunc", Argumen
11530 74 73 20 3d 20 32 2c 20 46 75 6e 63 54 79 70 65  ts = 2, FuncType
11540 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e   = FunctionType.
11550 53 63 61 6c 61 72 29 5d 0d 0a 20 20 63 6c 61 73  Scalar)]..  clas
11560 73 20 54 65 73 74 46 75 6e 63 20 3a 20 53 51 4c  s TestFunc : SQL
11570 69 74 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b  iteFunction..  {
11580 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
11590 72 72 69 64 65 20 6f 62 6a 65 63 74 20 49 6e 76  rride object Inv
115a0 6f 6b 65 28 6f 62 6a 65 63 74 5b 5d 20 61 72 67  oke(object[] arg
115b0 73 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  s)..    {..     
115c0 20 69 66 20 28 61 72 67 73 5b 30 5d 2e 47 65 74   if (args[0].Get
115d0 54 79 70 65 28 29 20 21 3d 20 74 79 70 65 6f 66  Type() != typeof
115e0 28 69 6e 74 29 29 20 72 65 74 75 72 6e 20 61 72  (int)) return ar
115f0 67 73 5b 30 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20  gs[0];....      
11600 69 6e 74 20 50 61 72 61 6d 31 20 3d 20 43 6f 6e  int Param1 = Con
11610 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 61 72 67  vert.ToInt32(arg
11620 73 5b 30 5d 29 3b 20 2f 2f 20 46 69 72 73 74 20  s[0]); // First 
11630 70 61 72 61 6d 65 74 65 72 0d 0a 20 20 20 20 20  parameter..     
11640 20 69 6e 74 20 50 61 72 61 6d 32 20 3d 20 43 6f   int Param2 = Co
11650 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32 28 61 72  nvert.ToInt32(ar
11660 67 73 5b 31 5d 29 3b 20 2f 2f 20 53 65 63 6f 6e  gs[1]); // Secon
11670 64 20 70 61 72 61 6d 65 74 65 72 0d 0a 0d 0a 20  d parameter.... 
11680 20 20 20 20 20 72 65 74 75 72 6e 20 50 61 72 61       return Para
11690 6d 31 20 2b 20 50 61 72 61 6d 32 3b 0d 0a 20 20  m1 + Param2;..  
116a0 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 5b 53    }..  }....  [S
116b0 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 4e 61  QLiteFunction(Na
116c0 6d 65 20 3d 20 22 43 41 53 45 54 45 53 54 22 2c  me = "CASETEST",
116d0 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 32 2c 20   Arguments = 2, 
116e0 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e 63 74  FuncType = Funct
116f0 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 29 5d  ionType.Scalar)]
11700 0d 0a 20 20 63 6c 61 73 73 20 43 61 73 65 54 65  ..  class CaseTe
11710 73 74 46 75 6e 63 20 3a 20 53 51 4c 69 74 65 46  stFunc : SQLiteF
11720 75 6e 63 74 69 6f 6e 45 78 0d 0a 20 20 7b 0d 0a  unctionEx..  {..
11730 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
11740 69 64 65 20 6f 62 6a 65 63 74 20 49 6e 76 6f 6b  ide object Invok
11750 65 28 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 29  e(object[] args)
11760 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43  ..    {..      C
11770 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65  ollationSequence
11780 20 73 65 71 20 3d 20 47 65 74 43 6f 6c 6c 61 74   seq = GetCollat
11790 69 6f 6e 53 65 71 75 65 6e 63 65 28 29 3b 0d 0a  ionSequence();..
117a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 71        return seq
117b0 2e 43 6f 6d 70 61 72 65 28 61 72 67 73 5b 30 5d  .Compare(args[0]
117c0 2e 54 6f 53 74 72 69 6e 67 28 29 2c 20 61 72 67  .ToString(), arg
117d0 73 5b 31 5d 2e 54 6f 53 74 72 69 6e 67 28 29 29  s[1].ToString())
117e0 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  ;..    }..  }...
117f0 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
11800 0d 0a 20 20 2f 2f 2f 20 41 67 67 72 65 67 61 74  ..  /// Aggregat
11810 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  e user-defined f
11820 75 6e 63 74 69 6f 6e 2e 20 20 41 72 67 75 6d 65  unction.  Argume
11830 6e 74 73 20 3d 20 2d 31 20 6d 65 61 6e 73 20 61  nts = -1 means a
11840 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ny number of arg
11850 75 6d 65 6e 74 73 20 69 73 20 61 63 63 65 70 74  uments is accept
11860 61 62 6c 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75  able..  /// </su
11870 6d 6d 61 72 79 3e 0d 0a 20 20 5b 53 51 4c 69 74  mmary>..  [SQLit
11880 65 46 75 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d  eFunction(Name =
11890 20 22 4d 79 43 6f 75 6e 74 22 2c 20 41 72 67 75   "MyCount", Argu
118a0 6d 65 6e 74 73 20 3d 20 2d 31 2c 20 46 75 6e 63  ments = -1, Func
118b0 54 79 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54  Type = FunctionT
118c0 79 70 65 2e 41 67 67 72 65 67 61 74 65 29 5d 0d  ype.Aggregate)].
118d0 0a 20 20 63 6c 61 73 73 20 4d 79 43 6f 75 6e 74  .  class MyCount
118e0 20 3a 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f   : SQLiteFunctio
118f0 6e 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c  n..  {..    publ
11900 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ic override void
11910 20 53 74 65 70 28 6f 62 6a 65 63 74 5b 5d 20 61   Step(object[] a
11920 72 67 73 2c 20 69 6e 74 20 6e 53 74 65 70 2c 20  rgs, int nStep, 
11930 72 65 66 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65  ref object conte
11940 78 74 44 61 74 61 29 0d 0a 20 20 20 20 7b 0d 0a  xtData)..    {..
11950 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78        if (contex
11960 74 44 61 74 61 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  tData == null)..
11970 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
11980 20 63 6f 6e 74 65 78 74 44 61 74 61 20 3d 20 31   contextData = 1
11990 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
119a0 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
119b0 63 6f 6e 74 65 78 74 44 61 74 61 20 3d 20 28 69  contextData = (i
119c0 6e 74 29 63 6f 6e 74 65 78 74 44 61 74 61 20 2b  nt)contextData +
119d0 20 31 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20   1;..    }....  
119e0 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
119f0 65 20 6f 62 6a 65 63 74 20 46 69 6e 61 6c 28 6f  e object Final(o
11a00 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74  bject contextDat
11a10 61 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  a)..    {..     
11a20 20 72 65 74 75 72 6e 20 63 6f 6e 74 65 78 74 44   return contextD
11a30 61 74 61 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  ata;..    }..  }
11a40 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ....  /// <summa
11a50 72 79 3e 0d 0a 20 20 2f 2f 2f 20 53 61 6d 70 6c  ry>..  /// Sampl
11a60 65 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73  e regular expres
11a70 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20  sion function.  
11a80 45 78 61 6d 70 6c 65 20 55 73 61 67 65 3a 0d 0a  Example Usage:..
11a90 20 20 2f 2f 2f 20 53 45 4c 45 43 54 20 2a 20 46    /// SELECT * F
11aa0 52 4f 4d 20 66 6f 6f 20 57 48 45 52 45 20 6e 61  ROM foo WHERE na
11ab0 6d 65 20 52 45 47 45 58 50 20 27 24 62 61 72 27  me REGEXP '$bar'
11ac0 0d 0a 20 20 2f 2f 2f 20 53 45 4c 45 43 54 20 2a  ..  /// SELECT *
11ad0 20 46 52 4f 4d 20 66 6f 6f 20 57 48 45 52 45 20   FROM foo WHERE 
11ae0 52 45 47 45 58 50 28 27 24 62 61 72 27 2c 20 6e  REGEXP('$bar', n
11af0 61 6d 65 29 0d 0a 20 20 2f 2f 2f 20 0d 0a 20 20  ame)..  /// ..  
11b00 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
11b10 20 20 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f    [SQLiteFunctio
11b20 6e 28 4e 61 6d 65 20 3d 20 22 52 45 47 45 58 50  n(Name = "REGEXP
11b30 22 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 32  ", Arguments = 2
11b40 2c 20 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e  , FuncType = Fun
11b50 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72  ctionType.Scalar
11b60 29 5d 0d 0a 20 20 63 6c 61 73 73 20 4d 79 52 65  )]..  class MyRe
11b70 67 45 78 20 3a 20 53 51 4c 69 74 65 46 75 6e 63  gEx : SQLiteFunc
11b80 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20 20 70  tion..  {..    p
11b90 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f  ublic override o
11ba0 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a  bject Invoke(obj
11bb0 65 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20 20 20  ect[] args)..   
11bc0 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
11bd0 20 53 79 73 74 65 6d 2e 54 65 78 74 2e 52 65 67   System.Text.Reg
11be0 75 6c 61 72 45 78 70 72 65 73 73 69 6f 6e 73 2e  ularExpressions.
11bf0 52 65 67 65 78 2e 49 73 4d 61 74 63 68 28 43 6f  Regex.IsMatch(Co
11c00 6e 76 65 72 74 2e 54 6f 53 74 72 69 6e 67 28 61  nvert.ToString(a
11c10 72 67 73 5b 31 5d 29 2c 20 43 6f 6e 76 65 72 74  rgs[1]), Convert
11c20 2e 54 6f 53 74 72 69 6e 67 28 61 72 67 73 5b 30  .ToString(args[0
11c30 5d 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  ]));..    }..  }
11c40 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ....  /// <summa
11c50 72 79 3e 0d 0a 20 20 2f 2f 2f 20 55 73 65 72 2d  ry>..  /// User-
11c60 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
11c70 67 20 73 65 71 75 65 6e 63 65 2e 0d 0a 20 20 2f  g sequence...  /
11c80 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
11c90 20 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e   [SQLiteFunction
11ca0 28 4e 61 6d 65 20 3d 20 22 4d 59 53 45 51 55 45  (Name = "MYSEQUE
11cb0 4e 43 45 22 2c 20 46 75 6e 63 54 79 70 65 20 3d  NCE", FuncType =
11cc0 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 43 6f   FunctionType.Co
11cd0 6c 6c 61 74 69 6f 6e 29 5d 0d 0a 20 20 63 6c 61  llation)]..  cla
11ce0 73 73 20 4d 79 53 65 71 75 65 6e 63 65 20 3a 20  ss MySequence : 
11cf0 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 0d 0a  SQLiteFunction..
11d00 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20    {..    public 
11d10 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43 6f 6d  override int Com
11d20 70 61 72 65 28 73 74 72 69 6e 67 20 70 61 72 61  pare(string para
11d30 6d 31 2c 20 73 74 72 69 6e 67 20 70 61 72 61 6d  m1, string param
11d40 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  2)..    {..     
11d50 20 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20 74 68   // Make sure th
11d60 65 20 73 74 72 69 6e 67 20 22 46 69 c3 ab 6c 64  e string "Fi..ld
11d70 33 22 20 69 73 20 73 6f 72 74 65 64 20 6f 75 74  3" is sorted out
11d80 20 6f 66 20 6f 72 64 65 72 0d 0a 20 20 20 20 20   of order..     
11d90 20 69 66 20 28 70 61 72 61 6d 31 20 3d 3d 20 22   if (param1 == "
11da0 46 69 c3 ab 6c 64 33 22 29 20 72 65 74 75 72 6e  Fi..ld3") return
11db0 20 31 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 70   1;..      if (p
11dc0 61 72 61 6d 32 20 3d 3d 20 22 46 69 c3 ab 6c 64  aram2 == "Fi..ld
11dd0 33 22 29 20 72 65 74 75 72 6e 20 2d 31 3b 0d 0a  3") return -1;..
11de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 74 72        return Str
11df0 69 6e 67 2e 43 6f 6d 70 61 72 65 28 70 61 72 61  ing.Compare(para
11e00 6d 31 2c 20 70 61 72 61 6d 32 2c 20 74 72 75 65  m1, param2, true
11e10 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a  );..    }..  }..
11e20 0d 0a 20 20 5b 41 74 74 72 69 62 75 74 65 55 73  ..  [AttributeUs
11e30 61 67 65 28 41 74 74 72 69 62 75 74 65 54 61 72  age(AttributeTar
11e40 67 65 74 73 2e 4d 65 74 68 6f 64 2c 20 49 6e 68  gets.Method, Inh
11e50 65 72 69 74 65 64 20 3d 20 66 61 6c 73 65 2c 20  erited = false, 
11e60 41 6c 6c 6f 77 4d 75 6c 74 69 70 6c 65 20 3d 20  AllowMultiple = 
11e70 66 61 6c 73 65 29 5d 0d 0a 20 20 70 75 62 6c 69  false)]..  publi
11e80 63 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 54  c sealed class T
11e90 65 73 74 41 74 74 72 69 62 75 74 65 20 3a 20 41  estAttribute : A
11ea0 74 74 72 69 62 75 74 65 2c 20 49 43 6f 6d 70 61  ttribute, ICompa
11eb0 72 61 62 6c 65 3c 54 65 73 74 41 74 74 72 69 62  rable<TestAttrib
11ec0 75 74 65 3e 0d 0a 20 20 7b 0d 0a 20 20 20 20 70  ute>..  {..    p
11ed0 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69 6e  rivate static in
11ee0 74 20 5f 73 74 61 72 74 20 3d 20 36 35 35 33 35  t _start = 65535
11ef0 3b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 69  ;..    private i
11f00 6e 74 20 5f 73 65 71 75 65 6e 63 65 3b 0d 0a 0d  nt _sequence;...
11f10 0a 20 20 20 20 70 75 62 6c 69 63 20 54 65 73 74  .    public Test
11f20 41 74 74 72 69 62 75 74 65 28 29 0d 0a 20 20 20  Attribute()..   
11f30 20 7b 0d 0a 20 20 20 20 20 20 5f 73 65 71 75 65   {..      _seque
11f40 6e 63 65 20 3d 20 5f 73 74 61 72 74 3b 0d 0a 20  nce = _start;.. 
11f50 20 20 20 20 20 5f 73 74 61 72 74 2b 2b 3b 0d 0a       _start++;..
11f60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
11f70 6c 69 63 20 69 6e 74 20 53 65 71 75 65 6e 63 65  lic int Sequence
11f80 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 67  ..    {..      g
11f90 65 74 20 7b 20 72 65 74 75 72 6e 20 5f 73 65 71  et { return _seq
11fa0 75 65 6e 63 65 3b 20 7d 0d 0a 20 20 20 20 20 20  uence; }..      
11fb0 73 65 74 20 7b 20 5f 73 65 71 75 65 6e 63 65 20  set { _sequence 
11fc0 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
11fd0 7d 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f 6e  }....    #region
11fe0 20 49 43 6f 6d 70 61 72 61 62 6c 65 3c 54 65 73   IComparable<Tes
11ff0 74 41 74 74 72 69 62 75 74 65 3e 20 4d 65 6d 62  tAttribute> Memb
12000 65 72 73 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69  ers....    publi
12010 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 54 6f 28  c int CompareTo(
12020 54 65 73 74 41 74 74 72 69 62 75 74 65 20 6f 74  TestAttribute ot
12030 68 65 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  her)..    {..   
12040 20 20 20 72 65 74 75 72 6e 20 5f 73 65 71 75 65     return _seque
12050 6e 63 65 2e 43 6f 6d 70 61 72 65 54 6f 28 6f 74  nce.CompareTo(ot
12060 68 65 72 2e 5f 73 65 71 75 65 6e 63 65 29 3b 0d  her._sequence);.
12070 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64  .    }..    #end
12080 72 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20  region..  }.... 
12090 20 69 6e 74 65 72 6e 61 6c 20 65 6e 75 6d 20 54   internal enum T
120a0 65 73 74 52 65 73 75 6c 74 45 6e 75 6d 0d 0a 20  estResultEnum.. 
120b0 20 7b 0d 0a 20 20 20 20 53 75 63 63 65 65 64 65   {..    Succeede
120c0 64 20 3d 20 30 2c 0d 0a 20 20 20 20 46 61 69 6c  d = 0,..    Fail
120d0 65 64 20 3d 20 31 2c 0d 0a 20 20 20 20 49 6e 63  ed = 1,..    Inc
120e0 6f 6e 63 6c 75 73 69 76 65 20 3d 20 32 2c 0d 0a  onclusive = 2,..
120f0 20 20 7d 0d 0a 0d 0a 20 20 69 6e 74 65 72 6e 61    }....  interna
12100 6c 20 63 6c 61 73 73 20 49 6e 63 6f 6e 63 6c 75  l class Inconclu
12110 73 69 76 65 45 78 63 65 70 74 69 6f 6e 20 3a 20  siveException : 
12120 45 78 63 65 70 74 69 6f 6e 0d 0a 20 20 7b 0d 0a  Exception..  {..
12130 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e 63      internal Inc
12140 6f 6e 63 6c 75 73 69 76 65 45 78 63 65 70 74 69  onclusiveExcepti
12150 6f 6e 28 29 0d 0a 20 20 20 20 20 20 3a 20 62 61  on()..      : ba
12160 73 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  se()..    {..   
12170 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
12180 61 6c 20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45  al InconclusiveE
12190 78 63 65 70 74 69 6f 6e 28 73 74 72 69 6e 67 20  xception(string 
121a0 6d 65 73 73 61 67 65 29 0d 0a 20 20 20 20 20 20  message)..      
121b0 3a 20 62 61 73 65 28 6d 65 73 73 61 67 65 29 0d  : base(message).
121c0 0a 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 20  .    {..    }.. 
121d0 20 7d 0d 0a 0d 0a 20 20 69 6e 74 65 72 6e 61 6c   }....  internal
121e0 20 63 6c 61 73 73 20 54 65 73 74 45 76 65 6e 74   class TestEvent
121f0 41 72 67 73 20 3a 20 45 76 65 6e 74 41 72 67 73  Args : EventArgs
12200 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c 69  ..  {..    publi
12210 63 20 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e  c readonly strin
12220 67 20 54 65 73 74 4e 61 6d 65 3b 0d 0a 20 20 20  g TestName;..   
12230 20 70 75 62 6c 69 63 20 72 65 61 64 6f 6e 6c 79   public readonly
12240 20 54 65 73 74 52 65 73 75 6c 74 45 6e 75 6d 20   TestResultEnum 
12250 52 65 73 75 6c 74 3b 0d 0a 20 20 20 20 70 75 62  Result;..    pub
12260 6c 69 63 20 72 65 61 64 6f 6e 6c 79 20 45 78 63  lic readonly Exc
12270 65 70 74 69 6f 6e 20 45 78 63 65 70 74 69 6f 6e  eption Exception
12280 3b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 72 65  ;..    public re
12290 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 4d 65  adonly string Me
122a0 73 73 61 67 65 3b 0d 0a 20 20 20 20 70 75 62 6c  ssage;..    publ
122b0 69 63 20 72 65 61 64 6f 6e 6c 79 20 69 6e 74 20  ic readonly int 
122c0 44 75 72 61 74 69 6f 6e 3b 0d 0a 0d 0a 20 20 20  Duration;....   
122d0 20 69 6e 74 65 72 6e 61 6c 20 54 65 73 74 45 76   internal TestEv
122e0 65 6e 74 41 72 67 73 28 73 74 72 69 6e 67 20 74  entArgs(string t
122f0 65 73 74 4e 61 6d 65 2c 20 54 65 73 74 52 65 73  estName, TestRes
12300 75 6c 74 45 6e 75 6d 20 73 75 63 63 65 73 73 2c  ultEnum success,
12310 20 69 6e 74 20 64 75 72 61 74 69 6f 6e 2c 20 45   int duration, E
12320 78 63 65 70 74 69 6f 6e 20 65 2c 20 73 74 72 69  xception e, stri
12330 6e 67 20 6d 65 73 73 61 67 65 29 0d 0a 20 20 20  ng message)..   
12340 20 7b 0d 0a 20 20 20 20 20 20 54 65 73 74 4e 61   {..      TestNa
12350 6d 65 20 3d 20 74 65 73 74 4e 61 6d 65 3b 0d 0a  me = testName;..
12360 20 20 20 20 20 20 52 65 73 75 6c 74 20 3d 20 73        Result = s
12370 75 63 63 65 73 73 3b 0d 0a 20 20 20 20 20 20 45  uccess;..      E
12380 78 63 65 70 74 69 6f 6e 20 3d 20 65 3b 0d 0a 20  xception = e;.. 
12390 20 20 20 20 20 4d 65 73 73 61 67 65 20 3d 20 6d       Message = m
123a0 65 73 73 61 67 65 3b 0d 0a 20 20 20 20 20 20 44  essage;..      D
123b0 75 72 61 74 69 6f 6e 20 3d 20 64 75 72 61 74 69  uration = durati
123c0 6f 6e 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  on;..    }..  }.
123d0 0a 0d 0a 20 20 64 65 6c 65 67 61 74 65 20 76 6f  ...  delegate vo
123e0 69 64 20 54 65 73 74 43 6f 6d 70 6c 65 74 65 64  id TestCompleted
123f0 45 76 65 6e 74 28 6f 62 6a 65 63 74 20 73 65 6e  Event(object sen
12400 64 65 72 2c 20 54 65 73 74 45 76 65 6e 74 41 72  der, TestEventAr
12410 67 73 20 61 72 67 73 29 3b 0d 0a 20 20 64 65 6c  gs args);..  del
12420 65 67 61 74 65 20 76 6f 69 64 20 54 65 73 74 53  egate void TestS
12430 74 61 72 74 69 6e 67 45 76 65 6e 74 28 6f 62 6a  tartingEvent(obj
12440 65 63 74 20 73 65 6e 64 65 72 2c 20 54 65 73 74  ect sender, Test
12450 45 76 65 6e 74 41 72 67 73 20 61 72 67 73 29 3b  EventArgs args);
12460 0d 0a 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20 61  ....  internal a
12470 62 73 74 72 61 63 74 20 63 6c 61 73 73 20 54 65  bstract class Te
12480 73 74 43 61 73 65 42 61 73 65 0d 0a 20 20 7b 0d  stCaseBase..  {.
12490 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 44  .    protected D
124a0 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79  bProviderFactory
124b0 20 5f 66 61 63 74 3b 0d 0a 20 20 20 20 70 72 6f   _fact;..    pro
124c0 74 65 63 74 65 64 20 44 62 43 6f 6e 6e 65 63 74  tected DbConnect
124d0 69 6f 6e 20 5f 63 6e 6e 20 3d 20 6e 75 6c 6c 3b  ion _cnn = null;
124e0 0d 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20  ..    protected 
124f0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  DbConnectionStri
12500 6e 67 42 75 69 6c 64 65 72 20 5f 63 6e 6e 73 74  ngBuilder _cnnst
12510 72 69 6e 67 3b 0d 0a 20 20 20 20 70 72 6f 74 65  ring;..    prote
12520 63 74 65 64 20 44 69 63 74 69 6f 6e 61 72 79 3c  cted Dictionary<
12530 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 5f 74  string, bool> _t
12540 65 73 74 73 20 3d 20 6e 65 77 20 44 69 63 74 69  ests = new Dicti
12550 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 62 6f 6f  onary<string,boo
12560 6c 3e 28 29 3b 0d 0a 0d 0a 20 20 20 20 70 75 62  l>();....    pub
12570 6c 69 63 20 65 76 65 6e 74 20 54 65 73 74 43 6f  lic event TestCo
12580 6d 70 6c 65 74 65 64 45 76 65 6e 74 20 4f 6e 54  mpletedEvent OnT
12590 65 73 74 46 69 6e 69 73 68 65 64 3b 0d 0a 20 20  estFinished;..  
125a0 20 20 70 75 62 6c 69 63 20 65 76 65 6e 74 20 54    public event T
125b0 65 73 74 53 74 61 72 74 69 6e 67 45 76 65 6e 74  estStartingEvent
125c0 20 4f 6e 54 65 73 74 53 74 61 72 74 69 6e 67 3b   OnTestStarting;
125d0 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 65 76 65  ..    public eve
125e0 6e 74 20 45 76 65 6e 74 48 61 6e 64 6c 65 72 20  nt EventHandler 
125f0 4f 6e 41 6c 6c 54 65 73 74 73 44 6f 6e 65 3b 0d  OnAllTestsDone;.
12600 0a 0d 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64  ...    protected
12610 20 54 65 73 74 43 61 73 65 42 61 73 65 28 29 0d   TestCaseBase().
12620 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 6f  .    {..      So
12630 72 74 65 64 4c 69 73 74 3c 54 65 73 74 41 74 74  rtedList<TestAtt
12640 72 69 62 75 74 65 2c 20 53 79 73 74 65 6d 2e 52  ribute, System.R
12650 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64  eflection.Method
12660 49 6e 66 6f 3e 20 69 74 65 6d 73 20 3d 20 6e 65  Info> items = ne
12670 77 20 53 6f 72 74 65 64 4c 69 73 74 3c 54 65 73  w SortedList<Tes
12680 74 41 74 74 72 69 62 75 74 65 2c 20 53 79 73 74  tAttribute, Syst
12690 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65  em.Reflection.Me
126a0 74 68 6f 64 49 6e 66 6f 3e 28 29 3b 0d 0a 20 20  thodInfo>();..  
126b0 20 20 20 20 66 6f 72 65 61 63 68 20 28 53 79 73      foreach (Sys
126c0 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d  tem.Reflection.M
126d0 65 74 68 6f 64 49 6e 66 6f 20 6d 69 20 69 6e 20  ethodInfo mi in 
126e0 47 65 74 54 79 70 65 28 29 2e 47 65 74 4d 65 74  GetType().GetMet
126f0 68 6f 64 73 28 53 79 73 74 65 6d 2e 52 65 66 6c  hods(System.Refl
12700 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c  ection.BindingFl
12710 61 67 73 2e 49 6e 73 74 61 6e 63 65 20 7c 20 53  ags.Instance | S
12720 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
12730 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 4e 6f  .BindingFlags.No
12740 6e 50 75 62 6c 69 63 20 7c 20 53 79 73 74 65 6d  nPublic | System
12750 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64  .Reflection.Bind
12760 69 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d  ingFlags.InvokeM
12770 65 74 68 6f 64 29 29 0d 0a 20 20 20 20 20 20 7b  ethod))..      {
12780 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
12790 5b 5d 20 61 74 74 20 3d 20 6d 69 2e 47 65 74 43  [] att = mi.GetC
127a0 75 73 74 6f 6d 41 74 74 72 69 62 75 74 65 73 28  ustomAttributes(
127b0 74 79 70 65 6f 66 28 54 65 73 74 41 74 74 72 69  typeof(TestAttri
127c0 62 75 74 65 29 2c 20 66 61 6c 73 65 29 3b 0d 0a  bute), false);..
127d0 20 20 20 20 20 20 20 20 69 66 20 28 61 74 74 2e          if (att.
127e0 4c 65 6e 67 74 68 20 3d 3d 20 31 29 0d 0a 20 20  Length == 1)..  
127f0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12800 20 20 20 69 74 65 6d 73 2e 41 64 64 28 28 54 65     items.Add((Te
12810 73 74 41 74 74 72 69 62 75 74 65 29 61 74 74 5b  stAttribute)att[
12820 30 5d 2c 20 6d 69 29 3b 0d 0a 20 20 20 20 20 20  0], mi);..      
12830 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
12840 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 4b        foreach (K
12850 65 79 56 61 6c 75 65 50 61 69 72 3c 54 65 73 74  eyValuePair<Test
12860 41 74 74 72 69 62 75 74 65 2c 20 53 79 73 74 65  Attribute, Syste
12870 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74  m.Reflection.Met
12880 68 6f 64 49 6e 66 6f 3e 20 70 61 69 72 20 69 6e  hodInfo> pair in
12890 20 69 74 65 6d 73 29 0d 0a 20 20 20 20 20 20 7b   items)..      {
128a0 0d 0a 20 20 20 20 20 20 20 20 5f 74 65 73 74 73  ..        _tests
128b0 2e 41 64 64 28 70 61 69 72 2e 56 61 6c 75 65 2e  .Add(pair.Value.
128c0 4e 61 6d 65 2c 20 74 72 75 65 29 3b 0d 0a 20 20  Name, true);..  
128d0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
128e0 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 54 65      protected Te
128f0 73 74 43 61 73 65 42 61 73 65 28 44 62 50 72 6f  stCaseBase(DbPro
12900 76 69 64 65 72 46 61 63 74 6f 72 79 20 66 61 63  viderFactory fac
12910 74 6f 72 79 2c 20 73 74 72 69 6e 67 20 63 6f 6e  tory, string con
12920 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 29 0d 0a  nectionString)..
12930 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 5f 66 61      {..      _fa
12940 63 74 20 3d 20 66 61 63 74 6f 72 79 3b 0d 0a 20  ct = factory;.. 
12950 20 20 20 20 20 5f 63 6e 6e 20 3d 20 5f 66 61 63       _cnn = _fac
12960 74 2e 43 72 65 61 74 65 43 6f 6e 6e 65 63 74 69  t.CreateConnecti
12970 6f 6e 28 29 3b 0d 0a 20 20 20 20 20 20 5f 63 6e  on();..      _cn
12980 6e 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69  n.ConnectionStri
12990 6e 67 20 3d 20 63 6f 6e 6e 65 63 74 69 6f 6e 53  ng = connectionS
129a0 74 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20 5f 63  tring;..      _c
129b0 6e 6e 73 74 72 69 6e 67 20 3d 20 5f 66 61 63 74  nnstring = _fact
129c0 2e 43 72 65 61 74 65 43 6f 6e 6e 65 63 74 69 6f  .CreateConnectio
129d0 6e 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29  nStringBuilder()
129e0 3b 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 73 74 72  ;..      _cnnstr
129f0 69 6e 67 2e 43 6f 6e 6e 65 63 74 69 6f 6e 53 74  ing.ConnectionSt
12a00 72 69 6e 67 20 3d 20 63 6f 6e 6e 65 63 74 69 6f  ring = connectio
12a10 6e 53 74 72 69 6e 67 3b 0d 0a 20 20 20 20 20 20  nString;..      
12a20 5f 63 6e 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20  _cnn.Open();..  
12a30 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
12a40 6e 61 6c 20 44 69 63 74 69 6f 6e 61 72 79 3c 73  nal Dictionary<s
12a50 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 54 65 73  tring, bool> Tes
12a60 74 73 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ts..    {..     
12a70 20 67 65 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20   get..      {.. 
12a80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 74         return _t
12a90 65 73 74 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ests;..      }..
12aa0 20 20 20 20 20 20 73 65 74 0d 0a 20 20 20 20 20        set..     
12ab0 20 7b 0d 0a 20 20 20 20 20 20 20 20 5f 74 65 73   {..        _tes
12ac0 74 73 20 3d 20 76 61 6c 75 65 3b 0d 0a 20 20 20  ts = value;..   
12ad0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
12ae0 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
12af0 20 52 75 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20   Run()..    {.. 
12b00 20 20 20 20 20 53 6f 72 74 65 64 4c 69 73 74 3c       SortedList<
12b10 54 65 73 74 41 74 74 72 69 62 75 74 65 2c 20 53  TestAttribute, S
12b20 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
12b30 2e 4d 65 74 68 6f 64 49 6e 66 6f 3e 20 69 74 65  .MethodInfo> ite
12b40 6d 73 20 3d 20 6e 65 77 20 53 6f 72 74 65 64 4c  ms = new SortedL
12b50 69 73 74 3c 54 65 73 74 41 74 74 72 69 62 75 74  ist<TestAttribut
12b60 65 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63  e, System.Reflec
12b70 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f 3e  tion.MethodInfo>
12b80 28 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  ();..      forea
12b90 63 68 20 28 53 79 73 74 65 6d 2e 52 65 66 6c 65  ch (System.Refle
12ba0 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f  ction.MethodInfo
12bb0 20 6d 69 20 69 6e 20 47 65 74 54 79 70 65 28 29   mi in GetType()
12bc0 2e 47 65 74 4d 65 74 68 6f 64 73 28 53 79 73 74  .GetMethods(Syst
12bd0 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69  em.Reflection.Bi
12be0 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 73 74 61  ndingFlags.Insta
12bf0 6e 63 65 20 7c 20 53 79 73 74 65 6d 2e 52 65 66  nce | System.Ref
12c00 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46  lection.BindingF
12c10 6c 61 67 73 2e 4e 6f 6e 50 75 62 6c 69 63 20 7c  lags.NonPublic |
12c20 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
12c30 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e  on.BindingFlags.
12c40 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 29 29 0d 0a  InvokeMethod))..
12c50 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12c60 20 6f 62 6a 65 63 74 5b 5d 20 61 74 74 20 3d 20   object[] att = 
12c70 6d 69 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 72  mi.GetCustomAttr
12c80 69 62 75 74 65 73 28 74 79 70 65 6f 66 28 54 65  ibutes(typeof(Te
12c90 73 74 41 74 74 72 69 62 75 74 65 29 2c 20 66 61  stAttribute), fa
12ca0 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 69  lse);..        i
12cb0 66 20 28 61 74 74 2e 4c 65 6e 67 74 68 20 3d 3d  f (att.Length ==
12cc0 20 31 20 26 26 20 5f 74 65 73 74 73 5b 6d 69 2e   1 && _tests[mi.
12cd0 4e 61 6d 65 5d 20 3d 3d 20 74 72 75 65 29 0d 0a  Name] == true)..
12ce0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
12cf0 20 20 20 20 20 69 74 65 6d 73 2e 41 64 64 28 28       items.Add((
12d00 54 65 73 74 41 74 74 72 69 62 75 74 65 29 61 74  TestAttribute)at
12d10 74 5b 30 5d 2c 20 6d 69 29 3b 0d 0a 20 20 20 20  t[0], mi);..    
12d20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
12d30 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
12d40 28 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 54 65  (KeyValuePair<Te
12d50 73 74 41 74 74 72 69 62 75 74 65 2c 20 53 79 73  stAttribute, Sys
12d60 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d  tem.Reflection.M
12d70 65 74 68 6f 64 49 6e 66 6f 3e 20 70 61 69 72 20  ethodInfo> pair 
12d80 69 6e 20 69 74 65 6d 73 29 0d 0a 20 20 20 20 20  in items)..     
12d90 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28   {..        if (
12da0 4f 6e 54 65 73 74 53 74 61 72 74 69 6e 67 20 21  OnTestStarting !
12db0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
12dc0 20 20 20 4f 6e 54 65 73 74 53 74 61 72 74 69 6e     OnTestStartin
12dd0 67 28 74 68 69 73 2c 20 6e 65 77 20 54 65 73 74  g(this, new Test
12de0 45 76 65 6e 74 41 72 67 73 28 70 61 69 72 2e 56  EventArgs(pair.V
12df0 61 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73 74 52  alue.Name, TestR
12e00 65 73 75 6c 74 45 6e 75 6d 2e 49 6e 63 6f 6e 63  esultEnum.Inconc
12e10 6c 75 73 69 76 65 2c 20 30 2c 20 6e 75 6c 6c 2c  lusive, 0, null,
12e20 20 6e 75 6c 6c 29 29 3b 0d 0a 0d 0a 20 20 20 20   null));....    
12e30 20 20 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20      int start = 
12e40 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
12e50 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20  Count;..        
12e60 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  try..        {..
12e70 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
12e80 20 6f 62 6a 20 3d 20 70 61 69 72 2e 56 61 6c 75   obj = pair.Valu
12e90 65 2e 49 6e 76 6f 6b 65 28 74 68 69 73 2c 20 6e  e.Invoke(this, n
12ea0 75 6c 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ull);..         
12eb0 20 69 6e 74 20 64 75 72 61 74 69 6f 6e 20 3d 20   int duration = 
12ec0 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
12ed0 43 6f 75 6e 74 20 2d 20 73 74 61 72 74 3b 0d 0a  Count - start;..
12ee0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 4f 6e            if (On
12ef0 54 65 73 74 46 69 6e 69 73 68 65 64 20 21 3d 20  TestFinished != 
12f00 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
12f10 20 20 20 4f 6e 54 65 73 74 46 69 6e 69 73 68 65     OnTestFinishe
12f20 64 28 74 68 69 73 2c 20 6e 65 77 20 54 65 73 74  d(this, new Test
12f30 45 76 65 6e 74 41 72 67 73 28 70 61 69 72 2e 56  EventArgs(pair.V
12f40 61 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73 74 52  alue.Name, TestR
12f50 65 73 75 6c 74 45 6e 75 6d 2e 53 75 63 63 65 65  esultEnum.Succee
12f60 64 65 64 2c 20 64 75 72 61 74 69 6f 6e 2c 20 6e  ded, duration, n
12f70 75 6c 6c 2c 20 28 6f 62 6a 20 69 73 20 73 74 72  ull, (obj is str
12f80 69 6e 67 29 20 3f 20 28 73 74 72 69 6e 67 29 6f  ing) ? (string)o
12f90 62 6a 20 3a 20 53 74 72 69 6e 67 2e 45 6d 70 74  bj : String.Empt
12fa0 79 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  y));..        }.
12fb0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28  .        catch (
12fc0 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20  Exception e)..  
12fd0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12fe0 20 20 20 69 6e 74 20 64 75 72 61 74 69 6f 6e 20     int duration 
12ff0 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
13000 63 6b 43 6f 75 6e 74 20 2d 20 73 74 61 72 74 3b  ckCount - start;
13010 0d 0a 20 20 20 20 20 20 20 20 20 20 45 78 63 65  ..          Exce
13020 70 74 69 6f 6e 20 69 6e 6e 65 72 20 3d 20 65 2e  ption inner = e.
13030 49 6e 6e 65 72 45 78 63 65 70 74 69 6f 6e 3b 0d  InnerException;.
13040 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
13050 28 4f 6e 54 65 73 74 46 69 6e 69 73 68 65 64 20  (OnTestFinished 
13060 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
13070 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
13080 20 20 20 69 66 20 28 69 6e 6e 65 72 20 69 73 20     if (inner is 
13090 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65  InconclusiveExce
130a0 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ption)..        
130b0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
130c0 20 20 20 20 20 4f 6e 54 65 73 74 46 69 6e 69 73       OnTestFinis
130d0 68 65 64 28 74 68 69 73 2c 20 6e 65 77 20 54 65  hed(this, new Te
130e0 73 74 45 76 65 6e 74 41 72 67 73 28 70 61 69 72  stEventArgs(pair
130f0 2e 56 61 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73  .Value.Name, Tes
13100 74 52 65 73 75 6c 74 45 6e 75 6d 2e 49 6e 63 6f  tResultEnum.Inco
13110 6e 63 6c 75 73 69 76 65 2c 20 64 75 72 61 74 69  nclusive, durati
13120 6f 6e 2c 20 6e 75 6c 6c 2c 20 69 6e 6e 65 72 2e  on, null, inner.
13130 4d 65 73 73 61 67 65 29 29 3b 0d 0a 20 20 20 20  Message));..    
13140 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13150 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20         else..   
13160 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
13170 20 20 20 20 20 20 20 20 20 20 4f 6e 54 65 73 74            OnTest
13180 46 69 6e 69 73 68 65 64 28 74 68 69 73 2c 20 6e  Finished(this, n
13190 65 77 20 54 65 73 74 45 76 65 6e 74 41 72 67 73  ew TestEventArgs
131a0 28 70 61 69 72 2e 56 61 6c 75 65 2e 4e 61 6d 65  (pair.Value.Name
131b0 2c 20 54 65 73 74 52 65 73 75 6c 74 45 6e 75 6d  , TestResultEnum
131c0 2e 46 61 69 6c 65 64 2c 20 64 75 72 61 74 69 6f  .Failed, duratio
131d0 6e 2c 20 69 6e 6e 65 72 2c 20 6e 75 6c 6c 29 29  n, inner, null))
131e0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
131f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13200 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13210 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 4f  }....      if (O
13220 6e 41 6c 6c 54 65 73 74 73 44 6f 6e 65 20 21 3d  nAllTestsDone !=
13230 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
13240 4f 6e 41 6c 6c 54 65 73 74 73 44 6f 6e 65 28 74  OnAllTestsDone(t
13250 68 69 73 2c 20 45 76 65 6e 74 41 72 67 73 2e 45  his, EventArgs.E
13260 6d 70 74 79 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20  mpty);..    }.. 
13270 20 7d 0d 0a 7d 0d 0a                              }..}..