System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 773857e45d72efcdd2fe63b5ed1bf551be0fe652:


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 22 4c 6f 67 20 65 76 65 6e 74 20 63 6f  on("Log event co
e170: 75 6e 74 20 69 6e 63 6f 72 72 65 63 74 2e 22 29  unt incorrect.")
e180: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
e190: 20 63 6e 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a 0d   cnn.Close();...
e1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
e1b0: 72 65 6d 6f 76 65 20 74 68 65 20 6c 6f 67 20 68  remove the log h
e1c0: 61 6e 64 6c 65 72 20 62 65 66 6f 72 65 20 74 68  andler before th
e1d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
e1e0: 63 6c 6f 73 65 64 2e 0d 0a 20 20 20 20 20 20 20  closed...       
e1f0: 20 20 20 20 20 73 71 6c 69 74 65 5f 66 61 63 74       sqlite_fact
e200: 2e 4c 6f 67 20 2d 3d 20 6c 6f 67 48 61 6e 64 6c  .Log -= logHandl
e210: 65 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7d  er;....        }
e220: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
e230: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
e240: 20 20 2f 2f 2f 20 4f 70 65 6e 20 61 20 72 65 61    /// Open a rea
e250: 64 65 72 20 61 6e 64 20 74 68 65 6e 20 61 74 74  der and then att
e260: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
e270: 20 74 65 73 74 20 74 68 65 20 77 72 69 74 65 72   test the writer
e280: 27 73 20 63 6f 6d 6d 61 6e 64 20 74 69 6d 65 6f  's command timeo
e290: 75 74 20 70 72 6f 70 65 72 74 79 0d 0a 20 20 20  ut property..   
e2a0: 20 2f 2f 2f 20 53 51 4c 69 74 65 20 64 6f 65 73   /// SQLite does
e2b0: 6e 27 74 20 61 6c 6c 6f 77 20 61 20 77 72 69 74  n't allow a writ
e2c0: 65 20 77 68 65 6e 20 61 20 72 65 61 64 65 72 20  e when a reader 
e2d0: 69 73 20 61 63 74 69 76 65 2e 0d 0a 20 20 20 20  is active...    
e2e0: 2f 2f 2f 20 2a 2a 2a 20 4e 4f 54 45 20 41 53 20  /// *** NOTE AS 
e2f0: 4f 46 20 33 2e 33 2e 38 20 74 68 69 73 20 74 65  OF 3.3.8 this te
e300: 73 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 6c 6f  st no longer blo
e310: 63 6b 73 20 62 65 63 61 75 73 65 20 53 51 4c 69  cks because SQLi
e320: 74 65 20 6e 6f 77 20 61 6c 6c 6f 77 73 20 79 6f  te now allows yo
e330: 75 20 74 6f 20 75 70 64 61 74 65 20 74 61 62 6c  u to update tabl
e340: 65 28 73 29 0d 0a 20 20 20 20 2f 2f 2f 20 77 68  e(s)..    /// wh
e350: 69 6c 65 20 61 20 72 65 61 64 65 72 20 69 73 20  ile a reader is 
e360: 61 63 74 69 76 65 20 6f 6e 20 74 68 65 20 73 61  active on the sa
e370: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  me connection.  
e380: 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 74 69  Therefore the ti
e390: 6d 65 6f 75 74 20 74 65 73 74 20 69 73 20 69 6e  meout test is in
e3a0: 76 61 6c 69 64 0d 0a 20 20 20 20 2f 2f 2f 20 3c  valid..    /// <
e3b0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 69  /summary>..    i
e3c0: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 54 69 6d  nternal void Tim
e3d0: 65 6f 75 74 54 65 73 74 28 29 0d 0a 20 20 20 20  eoutTest()..    
e3e0: 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 53 51  {..      CheckSQ
e3f0: 4c 69 74 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Lite();....     
e400: 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e   using (DbComman
e410: 64 20 63 6d 64 52 65 61 64 20 3d 20 5f 63 6e 6e  d cmdRead = _cnn
e420: 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29  .CreateCommand()
e430: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
e440: 20 20 20 20 63 6d 64 52 65 61 64 2e 43 6f 6d 6d      cmdRead.Comm
e450: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
e460: 54 20 49 44 20 46 52 4f 4d 20 54 65 73 74 43 61  T ID FROM TestCa
e470: 73 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 75 73  se";..        us
e480: 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65  ing (DbDataReade
e490: 72 20 72 64 20 3d 20 63 6d 64 52 65 61 64 2e 45  r rd = cmdRead.E
e4a0: 78 65 63 75 74 65 52 65 61 64 65 72 28 29 29 0d  xecuteReader()).
e4b0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
e4c0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
e4d0: 6f 6d 6d 61 6e 64 20 63 6d 64 77 72 69 74 65 20  ommand cmdwrite 
e4e0: 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
e4f0: 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 20  mand())..       
e500: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
e510: 20 20 63 6d 64 77 72 69 74 65 2e 43 6f 6d 6d 61    cmdwrite.Comma
e520: 6e 64 54 65 78 74 20 3d 20 22 55 50 44 41 54 45  ndText = "UPDATE
e530: 20 5b 4b 65 79 49 6e 66 6f 54 65 73 74 5d 20 53   [KeyInfoTest] S
e540: 45 54 20 5b 49 44 5d 20 3d 20 5b 49 44 5d 22 3b  ET [ID] = [ID]";
e550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ..            cm
e560: 64 77 72 69 74 65 2e 43 6f 6d 6d 61 6e 64 54 69  dwrite.CommandTi
e570: 6d 65 6f 75 74 20 3d 20 35 3b 0d 0a 0d 0a 20 20  meout = 5;....  
e580: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 77            int dw
e590: 74 69 63 6b 20 3d 20 45 6e 76 69 72 6f 6e 6d 65  tick = Environme
e5a0: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20  nt.TickCount;.. 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64               cmd
e5e0: 77 72 69 74 65 2e 45 78 65 63 75 74 65 4e 6f 6e  write.ExecuteNon
e5f0: 51 75 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20  Query();..      
e600: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e610: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
e620: 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ption)..        
e630: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
e640: 20 20 20 20 20 64 77 74 69 63 6b 20 3d 20 28 45       dwtick = (E
e650: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
e660: 6f 75 6e 74 20 2d 20 64 77 74 69 63 6b 29 20 2f  ount - dwtick) /
e670: 20 31 30 30 30 3b 0d 0a 20 20 20 20 20 20 20 20   1000;..        
e680: 20 20 20 20 20 20 69 66 20 28 64 77 74 69 63 6b        if (dwtick
e690: 20 3c 20 35 20 7c 7c 20 64 77 74 69 63 6b 20 3e   < 5 || dwtick >
e6a0: 20 36 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   6)..           
e6b0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45       throw new E
e6c0: 78 63 65 70 74 69 6f 6e 28 22 54 69 6d 65 6f 75  xception("Timeou
e6d0: 74 20 64 69 64 6e 27 74 20 77 61 69 74 20 6c 6f  t didn't wait lo
e6e0: 6e 67 20 65 6e 6f 75 67 68 21 22 29 3b 0d 0a 0d  ng enough!");...
e6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
e700: 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20  eturn;..        
e710: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
e720: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63     throw new Exc
e730: 65 70 74 69 6f 6e 28 22 4f 70 65 72 61 74 69 6f  eption("Operatio
e740: 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61  n should have fa
e750: 69 6c 65 64 20 62 75 74 20 63 6f 6d 70 6c 65 74  iled but complet
e760: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 22  ed successfully"
e770: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
e780: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
e790: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
e7a0: 20 20 5b 54 65 73 74 28 53 65 71 75 65 6e 63 65    [Test(Sequence
e7b0: 20 3d 20 34 31 29 5d 0d 0a 20 20 20 20 69 6e 74   = 41)]..    int
e7c0: 65 72 6e 61 6c 20 76 6f 69 64 20 54 72 61 6e 73  ernal void Trans
e7d0: 61 63 74 69 6f 6e 53 63 6f 70 65 54 65 73 74 28  actionScopeTest(
e7e0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
e7f0: 75 73 69 6e 67 20 28 54 72 61 6e 73 61 63 74 69  using (Transacti
e800: 6f 6e 53 63 6f 70 65 20 73 63 6f 70 65 20 3d 20  onScope scope = 
e810: 6e 65 77 20 54 72 61 6e 73 61 63 74 69 6f 6e 53  new TransactionS
e820: 63 6f 70 65 28 29 29 0d 0a 20 20 20 20 20 20 7b  cope())..      {
e830: 0d 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ..        using 
e840: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e  (DbConnection cn
e850: 6e 32 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c  n2 = ((ICloneabl
e860: 65 29 5f 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20  e)_cnn).Clone() 
e870: 61 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29  as DbConnection)
e880: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
e890: 20 20 20 20 20 20 20 69 66 20 28 63 6e 6e 32 2e         if (cnn2.
e8a0: 53 74 61 74 65 20 21 3d 20 43 6f 6e 6e 65 63 74  State != Connect
e8b0: 69 6f 6e 53 74 61 74 65 2e 4f 70 65 6e 29 20 63  ionState.Open) c
e8c0: 6e 6e 32 2e 4f 70 65 6e 28 29 3b 0d 0a 20 20 20  nn2.Open();..   
e8d0: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
e8e0: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63 6e  Command cmd = cn
e8f0: 6e 32 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  n2.CreateCommand
e900: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ())..          {
e910: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
e920: 20 43 72 65 61 74 65 64 20 61 20 74 61 62 6c 65   Created a table
e930: 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 61 6e   inside the tran
e940: 73 61 63 74 69 6f 6e 20 73 63 6f 70 65 0d 0a 20  saction scope.. 
e950: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 43             cmd.C
e960: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52  ommandText = "CR
e970: 45 41 54 45 20 54 41 42 4c 45 20 56 6f 6c 61 74  EATE TABLE Volat
e980: 69 6c 65 54 61 62 6c 65 20 28 49 44 20 49 4e 54  ileTable (ID INT
e990: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
e9a0: 2c 20 4d 79 56 61 6c 75 65 20 56 41 52 43 48 41  , MyValue VARCHA
e9b0: 52 28 35 30 29 29 22 3b 0d 0a 20 20 20 20 20 20  R(50))";..      
e9c0: 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74        cmd.Execut
e9d0: 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 0d 0a  eNonQuery();....
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 79 64              mayd
e9f0: 72 6f 70 74 61 62 6c 65 2e 41 64 64 28 22 56 6f  roptable.Add("Vo
ea00: 6c 61 74 69 6c 65 54 61 62 6c 65 22 29 3b 0d 0a  latileTable");..
ea10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
ea20: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
ea30: 6d 64 32 20 3d 20 63 6e 6e 32 2e 43 72 65 61 74  md2 = cnn2.Creat
ea40: 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
ea50: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
ea60: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
ea70: 28 63 6d 64 32 2e 54 72 61 6e 73 61 63 74 69 6f  (cmd2.Transactio
ea80: 6e 20 3d 20 63 6e 6e 32 2e 42 65 67 69 6e 54 72  n = cnn2.BeginTr
ea90: 61 6e 73 61 63 74 69 6f 6e 28 29 29 0d 0a 20 20  ansaction())..  
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eac0: 2f 20 49 6e 73 65 72 74 69 6e 67 20 61 20 76 61  / Inserting a va
ead0: 6c 75 65 20 69 6e 73 69 64 65 20 74 68 65 20 74  lue inside the t
eae0: 61 62 6c 65 2c 20 69 6e 73 69 64 65 20 61 20 74  able, inside a t
eaf0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 68 69 63 68  ransaction which
eb00: 20 69 73 20 69 6e 73 69 64 65 20 74 68 65 20 74   is inside the t
eb10: 72 61 6e 73 61 63 74 69 6f 6e 20 73 63 6f 70 65  ransaction scope
eb20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb30: 20 20 63 6d 64 32 2e 43 6f 6d 6d 61 6e 64 54 65    cmd2.CommandTe
eb40: 78 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54  xt = "INSERT INT
eb50: 4f 20 56 6f 6c 61 74 69 6c 65 54 61 62 6c 65 20  O VolatileTable 
eb60: 28 49 44 2c 20 4d 79 56 61 6c 75 65 29 20 56 41  (ID, MyValue) VA
eb70: 4c 55 45 53 28 31 2c 20 27 48 65 6c 6c 6f 27 29  LUES(1, 'Hello')
eb80: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
eb90: 20 20 20 20 63 6d 64 32 2e 45 78 65 63 75 74 65      cmd2.Execute
eba0: 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64               cmd
ebc0: 32 2e 54 72 61 6e 73 61 63 74 69 6f 6e 2e 43 6f  2.Transaction.Co
ebd0: 6d 6d 69 74 28 29 3b 0d 0a 20 20 20 20 20 20 20  mmit();..       
ebe0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ebf0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
ec00: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ec10: 2f 2f 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  // Connection is
ec20: 20 64 69 73 70 6f 73 65 64 20 62 65 66 6f 72 65   disposed before
ec30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ec40: 73 63 6f 70 65 20 6c 65 61 76 65 73 2c 20 74 68  scope leaves, th
ec50: 65 72 65 62 79 20 66 6f 72 63 69 6e 67 20 74 68  ereby forcing th
ec60: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
ec70: 73 74 61 79 20 6f 70 65 6e 0d 0a 20 20 20 20 20  stay open..     
ec80: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 2f 2f     }..        //
ec90: 20 45 78 69 74 20 74 68 65 20 74 72 61 6e 73 61   Exit the transa
eca0: 63 74 69 6f 6e 73 63 6f 70 65 20 77 69 74 68 6f  ctionscope witho
ecb0: 75 74 20 63 6f 6d 6d 69 74 74 69 6e 67 20 69 74  ut committing it
ecc0: 2c 20 63 61 75 73 69 6e 67 20 61 20 72 6f 6c 6c  , causing a roll
ecd0: 62 61 63 6b 20 6f 66 20 62 6f 74 68 20 74 68 65  back of both the
ece0: 20 63 72 65 61 74 65 20 74 61 62 6c 65 20 61 6e   create table an
ecf0: 64 20 74 68 65 20 69 6e 73 65 72 74 0d 0a 20 20  d the insert..  
ed00: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f      }....      /
ed10: 2f 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  / Verify that th
ed20: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
ed30: 20 65 78 69 73 74 0d 0a 20 20 20 20 20 20 75 73   exist..      us
ed40: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
ed50: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
ed60: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
ed70: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64    {..        cmd
ed80: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
ed90: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20  SELECT COUNT(*) 
eda0: 46 52 4f 4d 20 56 6f 6c 61 74 69 6c 65 54 61 62  FROM VolatileTab
edb0: 6c 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 74 72  le";..        tr
edc0: 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  y..        {..  
edd0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 6f          object o
ede0: 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 53 63   = cmd.ExecuteSc
edf0: 61 6c 61 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  alar();..       
ee00: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
ee10: 78 74 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  xt = "DROP TABLE
ee20: 20 56 6f 6c 61 74 69 6c 65 54 61 62 6c 65 22 3b   VolatileTable";
ee30: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  ..          cmd.
ee40: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
ee50: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 68  );..          th
ee60: 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f  row new InvalidO
ee70: 70 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f  perationExceptio
ee80: 6e 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 20 66  n("Transaction f
ee90: 61 69 6c 65 64 21 20 54 68 65 20 74 61 62 6c 65  ailed! The table
eea0: 20 65 78 69 73 74 73 21 22 29 3b 0d 0a 20 20 20   exists!");..   
eeb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
eec0: 63 61 74 63 68 28 45 78 63 65 70 74 69 6f 6e 20  catch(Exception 
eed0: 65 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  e)..        {.. 
eee0: 20 20 20 20 20 20 20 20 20 69 66 20 28 65 20 69           if (e i
eef0: 73 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69  s InvalidOperati
ef00: 6f 6e 45 78 63 65 70 74 69 6f 6e 29 20 74 68 72  onException) thr
ef10: 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
ef20: 28 65 2e 4d 65 73 73 61 67 65 29 3b 0d 0a 20 20  (e.Message);..  
ef30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20          return; 
ef40: 2f 2f 20 53 75 63 63 65 65 64 65 64 2c 20 74 68  // Succeeded, th
ef50: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  e table should n
ef60: 6f 74 20 68 61 76 65 20 65 78 69 73 74 65 64 0d  ot have existed.
ef70: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ef80: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
ef90: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
efa0: 0a 20 20 20 20 2f 2f 2f 20 43 61 75 73 65 73 20  .    /// Causes 
efb0: 74 68 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64  the user-defined
efc0: 20 61 67 67 72 65 67 61 74 65 20 74 6f 20 62 65   aggregate to be
efd0: 20 69 74 65 72 61 74 65 64 20 74 68 72 6f 75 67   iterated throug
efe0: 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  h..    /// </sum
eff0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
f000: 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e  returns></return
f010: 73 3e 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a  s>..    [Test]..
f020: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72      internal str
f030: 69 6e 67 20 55 73 65 72 41 67 67 72 65 67 61 74  ing UserAggregat
f040: 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  e()..    {..    
f050: 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b    CheckSQLite();
f060: 0d 0a 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67  ....      String
f070: 42 75 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20  Builder builder 
f080: 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c  = new StringBuil
f090: 64 65 72 28 29 3b 0d 0a 20 20 20 20 20 20 75 73  der();..      us
f0a0: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
f0b0: 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65  md = _cnn.Create
f0c0: 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20  Command())..    
f0d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74    {..        int
f0e0: 20 64 74 53 74 61 72 74 3b 0d 0a 20 20 20 20 20   dtStart;..     
f0f0: 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0d 0a 20     int n = 0;.. 
f100: 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 75 6e         int nCoun
f110: 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d  t;....        cm
f120: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
f130: 22 53 45 4c 45 43 54 20 4d 79 43 6f 75 6e 74 28  "SELECT MyCount(
f140: 2a 29 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65  *) FROM TestCase
f150: 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6e 43  ";....        nC
f160: 6f 75 6e 74 20 3d 20 30 3b 0d 0a 20 20 20 20 20  ount = 0;..     
f170: 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76     dtStart = Env
f180: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
f190: 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69  nt;..        whi
f1a0: 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e  le (Environment.
f1b0: 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74  TickCount - dtSt
f1c0: 61 72 74 20 3c 20 31 30 30 30 29 0d 0a 20 20 20  art < 1000)..   
f1d0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
f1e0: 20 20 6e 20 3d 20 43 6f 6e 76 65 72 74 2e 54 6f    n = Convert.To
f1f0: 49 6e 74 33 32 28 63 6d 64 2e 45 78 65 63 75 74  Int32(cmd.Execut
f200: 65 53 63 61 6c 61 72 28 29 29 3b 0d 0a 20 20 20  eScalar());..   
f210: 20 20 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b         nCount++;
f220: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f230: 20 20 20 20 20 69 66 20 28 6e 20 21 3d 20 31 32       if (n != 12
f240: 30 30 30 33 29 20 74 68 72 6f 77 20 6e 65 77 20  0003) throw new 
f250: 45 78 63 65 70 74 69 6f 6e 28 22 55 6e 65 78 70  Exception("Unexp
f260: 65 63 74 65 64 20 63 6f 75 6e 74 22 29 3b 0d 0a  ected count");..
f270: 20 20 20 20 20 20 20 20 62 75 69 6c 64 65 72 2e          builder.
f280: 41 70 70 65 6e 64 28 53 74 72 69 6e 67 2e 46 6f  Append(String.Fo
f290: 72 6d 61 74 28 22 55 73 65 72 41 67 67 72 65 67  rmat("UserAggreg
f2a0: 61 74 65 20 65 78 65 63 75 74 65 64 20 7b 30 7d  ate executed {0}
f2b0: 20 74 69 6d 65 73 20 69 6e 20 31 20 73 65 63 6f   times in 1 seco
f2c0: 6e 64 2e 22 2c 20 6e 43 6f 75 6e 74 29 29 3b 0d  nd.", nCount));.
f2d0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
f2e0: 72 65 74 75 72 6e 20 62 75 69 6c 64 65 72 2e 54  return builder.T
f2f0: 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20  oString();..    
f300: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
f310: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
f320: 43 61 75 73 65 73 20 74 68 65 20 75 73 65 72 2d  Causes the user-
f330: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
f340: 6e 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  n sequence to be
f350: 20 69 74 65 72 61 74 65 64 20 74 68 72 6f 75 67   iterated throug
f360: 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  h..    /// </sum
f370: 6d 61 72 79 3e 0d 0a 20 20 20 20 5b 54 65 73 74  mary>..    [Test
f380: 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ]..    internal 
f390: 76 6f 69 64 20 55 73 65 72 43 6f 6c 6c 61 74 69  void UserCollati
f3a0: 6f 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  on()..    {..   
f3b0: 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29     CheckSQLite()
f3c0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 75 73 69 6e 67  ;....      using
f3d0: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
f3e0: 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
f3f0: 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b  mand())..      {
f400: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 55 73 69  ..        // Usi
f410: 6e 67 20 61 20 64 65 66 61 75 6c 74 20 63 6f 6c  ng a default col
f420: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
f430: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
f440: 64 65 72 2c 20 22 50 61 72 61 6d 20 46 69 65 6c  der, "Param Fiel
f450: 64 33 22 20 77 69 6c 6c 20 61 70 70 65 61 72 20  d3" will appear 
f460: 61 74 20 74 68 65 20 74 6f 70 0d 0a 20 20 20 20  at the top..    
f470: 20 20 20 20 2f 2f 20 61 6e 64 20 22 46 69 65 6c      // and "Fiel
f480: 64 33 22 20 77 69 6c 6c 20 62 65 20 6e 65 78 74  d3" will be next
f490: 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  , followed by a 
f4a0: 4e 55 4c 4c 2e 20 20 4f 75 72 20 75 73 65 72 2d  NULL.  Our user-
f4b0: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
f4c0: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
f4d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 64 65 6c  ..        // del
f4e0: 69 62 65 72 61 74 65 6c 79 20 70 6c 61 63 65 20  iberately place 
f4f0: 74 68 65 6d 20 6f 75 74 20 6f 66 20 6f 72 64 65  them out of orde
f500: 72 20 73 6f 20 46 69 65 6c 64 33 20 69 73 20 66  r so Field3 is f
f510: 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 63  irst...        c
f520: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
f530: 20 22 53 45 4c 45 43 54 20 5b 46 69 c3 ab 6c 64   "SELECT [Fi..ld
f540: 33 5d 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65  3] FROM TestCase
f550: 20 4f 52 44 45 52 20 42 59 20 5b 46 69 c3 ab 6c   ORDER BY [Fi..l
f560: 64 33 5d 20 43 4f 4c 4c 41 54 45 20 4d 59 53 45  d3] COLLATE MYSE
f570: 51 55 45 4e 43 45 20 44 45 53 43 22 3b 0d 0a 20  QUENCE DESC";.. 
f580: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 20         string s 
f590: 3d 20 28 73 74 72 69 6e 67 29 63 6d 64 2e 45 78  = (string)cmd.Ex
f5a0: 65 63 75 74 65 53 63 61 6c 61 72 28 29 3b 0d 0a  ecuteScalar();..
f5b0: 20 20 20 20 20 20 20 20 69 66 20 28 73 20 21 3d          if (s !=
f5c0: 20 22 46 69 c3 ab 6c 64 33 22 29 20 74 68 72 6f   "Fi..ld3") thro
f5d0: 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
f5e0: 22 4d 79 53 65 71 75 65 6e 63 65 20 64 69 64 6e  "MySequence didn
f5f0: 27 74 20 73 6f 72 74 20 70 72 6f 70 65 72 6c 79  't sort properly
f600: 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ");..      }..  
f610: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
f620: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
f630: 2f 20 43 61 75 73 65 73 20 74 68 65 20 75 73 65  / Causes the use
f640: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
f650: 6f 6e 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 0d  on to be called.
f660: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
f670: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ry>..    /// <re
f680: 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e 73 3e  turns></returns>
f690: 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20  ..    [Test]..  
f6a0: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e    internal strin
f6b0: 67 20 55 73 65 72 46 75 6e 63 74 69 6f 6e 31 28  g UserFunction1(
f6c0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
f6d0: 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a  CheckSQLite();..
f6e0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43        using (DbC
f6f0: 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e  ommand cmd = _cn
f700: 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  n.CreateCommand(
f710: 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ))..      {..   
f720: 20 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 73 3b       int nTimes;
f730: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 74  ..        int dt
f740: 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20 20 20 20  Start;....      
f750: 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b 0d 0a 20    nTimes = 0;.. 
f760: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
f770: 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54  ndText = "SELECT
f780: 20 46 6f 6f 28 27 65 65 27 2c 27 66 6f 6f 27 29   Foo('ee','foo')
f790: 22 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53 74  ";..        dtSt
f7a0: 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  art = Environmen
f7b0: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20  t.TickCount;..  
f7c0: 20 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e 76        while (Env
f7d0: 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75  ironment.TickCou
f7e0: 6e 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20 31  nt - dtStart < 1
f7f0: 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  000)..        {.
f800: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45  .          cmd.E
f810: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
f820: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69  ;..          nTi
f830: 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20  mes++;..        
f840: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
f850: 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  n String.Format(
f860: 22 55 73 65 72 20 28 74 65 78 74 29 20 63 6f 6d  "User (text) com
f870: 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20 7b 30  mand executed {0
f880: 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73 65 63  } times in 1 sec
f890: 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29 3b 0d  ond.", nTimes);.
f8a0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
f8b0: 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20  ...    [Test].. 
f8c0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69     internal stri
f8d0: 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f 6e 32  ng UserFunction2
f8e0: 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  ()..    {..     
f8f0: 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d   CheckSQLite();.
f900: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62  .      using (Db
f910: 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63  Command cmd = _c
f920: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
f930: 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ())..      {..  
f940: 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 73        int nTimes
f950: 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  ;..        int d
f960: 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20 20 20  tStart;....     
f970: 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b 0d 0a     nTimes = 0;..
f980: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
f990: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
f9a0: 54 20 46 6f 6f 28 31 30 2c 31 31 29 22 3b 0d 0a  T Foo(10,11)";..
f9b0: 20 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20          dtStart 
f9c0: 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
f9d0: 63 6b 43 6f 75 6e 74 3b 0d 0a 20 20 20 20 20 20  ckCount;..      
f9e0: 20 20 77 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e    while (Environ
f9f0: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d  ment.TickCount -
fa00: 20 64 74 53 74 61 72 74 20 3c 20 31 30 30 30 29   dtStart < 1000)
fa10: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
fa20: 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75         cmd.Execu
fa30: 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20  teNonQuery();.. 
fa40: 20 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 2b           nTimes+
fa50: 2b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  +;..        }.. 
fa60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 74         return St
fa70: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 55 73 65  ring.Format("Use
fa80: 72 46 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 61 6e  rFunction comman
fa90: 64 20 65 78 65 63 75 74 65 64 20 7b 30 7d 20 74  d executed {0} t
faa0: 69 6d 65 73 20 69 6e 20 31 20 73 65 63 6f 6e 64  imes in 1 second
fab0: 2e 22 2c 20 6e 54 69 6d 65 73 29 3b 0d 0a 20 20  .", nTimes);..  
fac0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
fad0: 20 20 20 20 5b 54 65 73 74 5d 0d 0a 20 20 20 20      [Test]..    
fae0: 69 6e 74 65 72 6e 61 6c 20 73 74 72 69 6e 67 20  internal string 
faf0: 55 73 65 72 46 75 6e 63 74 69 6f 6e 33 28 29 0d  UserFunction3().
fb00: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68  .    {..      Ch
fb10: 65 63 6b 53 51 4c 69 74 65 28 29 3b 0d 0a 20 20  eckSQLite();..  
fb20: 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
fb30: 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e  mand cmd = _cnn.
fb40: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
fb50: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
fb60: 20 20 20 69 6e 74 20 6e 54 69 6d 65 73 3b 0d 0a     int nTimes;..
fb70: 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 53 74          int dtSt
fb80: 61 72 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  art;....        
fb90: 6e 54 69 6d 65 73 20 3d 20 30 3b 0d 0a 20 20 20  nTimes = 0;..   
fba0: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
fbb0: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 41  Text = "SELECT A
fbc0: 42 53 28 31 29 22 3b 0d 0a 20 20 20 20 20 20 20  BS(1)";..       
fbd0: 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72   dtStart = Envir
fbe0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
fbf0: 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ;..        while
fc00: 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69   (Environment.Ti
fc10: 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72  ckCount - dtStar
fc20: 74 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20  t < 1000)..     
fc30: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
fc40: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
fc50: 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
fc60: 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20    nTimes++;..   
fc70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
fc80: 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f  return String.Fo
fc90: 72 6d 61 74 28 22 49 6e 74 72 69 6e 73 69 63 20  rmat("Intrinsic 
fca0: 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64  command executed
fcb0: 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
fcc0: 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73  second.", nTimes
fcd0: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
fce0: 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d   }....    [Test]
fcf0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
fd00: 74 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69  tring UserFuncti
fd10: 6f 6e 34 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  on4()..    {..  
fd20: 20 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28      CheckSQLite(
fd30: 29 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20  );..      using 
fd40: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
fd50: 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d   _cnn.CreateComm
fd60: 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d  and())..      {.
fd70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69  .        int nTi
fd80: 6d 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e  mes;..        in
fd90: 74 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20  t dtStart;....  
fda0: 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30        nTimes = 0
fdb0: 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
fdc0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45  ommandText = "SE
fdd0: 4c 45 43 54 20 6c 6f 77 65 72 28 27 46 4f 4f 27  LECT lower('FOO'
fde0: 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 64 74 53  )";..        dtS
fdf0: 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65  tart = Environme
fe00: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 20  nt.TickCount;.. 
fe10: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e         while (En
fe20: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
fe30: 75 6e 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20  unt - dtStart < 
fe40: 31 30 30 30 29 0d 0a 20 20 20 20 20 20 20 20 7b  1000)..        {
fe50: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  ..          cmd.
fe60: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
fe70: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 54  );..          nT
fe80: 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20 20 20 20 20  imes++;..       
fe90: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
fea0: 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  rn String.Format
feb0: 28 22 49 6e 74 72 69 6e 20 28 74 78 74 29 20 63  ("Intrin (txt) c
fec0: 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20  ommand executed 
fed0: 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73  {0} times in 1 s
fee0: 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29  econd.", nTimes)
fef0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
ff00: 7d 0d 0a 0d 0a 20 20 20 20 5b 54 65 73 74 5d 0d  }....    [Test].
ff10: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
ff20: 72 69 6e 67 20 55 73 65 72 46 75 6e 63 74 69 6f  ring UserFunctio
ff30: 6e 35 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  n5()..    {..   
ff40: 20 20 20 43 68 65 63 6b 53 51 4c 69 74 65 28 29     CheckSQLite()
ff50: 3b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28  ;..      using (
ff60: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
ff70: 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61  _cnn.CreateComma
ff80: 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  nd())..      {..
ff90: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 69 6d          int nTim
ffa0: 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  es;..        int
ffb0: 20 64 74 53 74 61 72 74 3b 0d 0a 0d 0a 20 20 20   dtStart;....   
ffc0: 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30 3b       nTimes = 0;
ffd0: 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
ffe0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
fff0: 45 43 54 20 31 22 3b 0d 0a 20 20 20 20 20 20 20  ECT 1";..       
10000 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72   dtStart = Envir
10010 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
10020 3b 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ;..        while
10030 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69   (Environment.Ti
10040 63 6b 43 6f 75 6e 74 20 2d 20 64 74 53 74 61 72  ckCount - dtStar
10050 74 20 3c 20 31 30 30 30 29 0d 0a 20 20 20 20 20  t < 1000)..     
10060 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
10070 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
10080 65 72 79 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ery();..        
10090 20 20 6e 54 69 6d 65 73 2b 2b 3b 0d 0a 20 20 20    nTimes++;..   
100a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
100b0 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f  return String.Fo
100c0 72 6d 61 74 28 22 52 61 77 20 56 61 6c 75 65 20  rmat("Raw Value 
100d0 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64  command executed
100e0 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
100f0 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73  second.", nTimes
10100 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  );..      }..   
10110 20 7d 0d 0a 20 20 20 20 0d 0a 20 20 20 20 5b 54   }..    ..    [T
10120 65 73 74 28 53 65 71 75 65 6e 63 65 20 3d 20 34  est(Sequence = 4
10130 32 29 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  2)]..    interna
10140 6c 20 76 6f 69 64 20 56 65 72 69 66 79 42 69 6e  l void VerifyBin
10150 61 72 79 44 61 74 61 28 29 0d 0a 20 20 20 20 7b  aryData()..    {
10160 0d 0a 20 20 20 20 20 20 42 69 6e 61 72 79 49 6e  ..      BinaryIn
10170 73 65 72 74 28 29 3b 0d 0a 20 20 20 20 20 20 75  sert();..      u
10180 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
10190 63 6d 64 20 3d 20 5f 63 6e 6e 2e 43 72 65 61 74  cmd = _cnn.Creat
101a0 65 43 6f 6d 6d 61 6e 64 28 29 29 0d 0a 20 20 20  eCommand())..   
101b0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6d     {..        cm
101c0 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
101d0 22 53 45 4c 45 43 54 20 46 69 65 6c 64 36 20 46  "SELECT Field6 F
101e0 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57 48 45  ROM TestCase WHE
101f0 52 45 20 46 69 65 6c 64 36 20 49 53 20 4e 4f 54  RE Field6 IS NOT
10200 20 4e 55 4c 4c 22 3b 0d 0a 20 20 20 20 20 20 20   NULL";..       
10210 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20   byte[] b = new 
10220 62 79 74 65 5b 34 30 30 30 5d 3b 0d 0a 0d 0a 20  byte[4000];.... 
10230 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 62         using (Db
10240 44 61 74 61 52 65 61 64 65 72 20 72 64 20 3d 20  DataReader rd = 
10250 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65  cmd.ExecuteReade
10260 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  r())..        {.
10270 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72  .          if (r
10280 64 2e 52 65 61 64 28 29 20 3d 3d 20 66 61 6c 73  d.Read() == fals
10290 65 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  e) throw new Exc
102a0 65 70 74 69 6f 6e 28 22 4e 6f 20 64 61 74 61 20  eption("No data 
102b0 74 6f 20 72 65 61 64 21 22 29 3b 0d 0a 0d 0a 20  to read!");.... 
102c0 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6e 20           long n 
102d0 3d 20 72 64 2e 47 65 74 42 79 74 65 73 28 30 2c  = rd.GetBytes(0,
102e0 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c 20 30 29 3b   0, null, 0, 0);
102f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
10300 6e 20 21 3d 20 34 30 30 30 29 20 74 68 72 6f 77  n != 4000) throw
10310 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22   new Exception("
10320 49 6e 76 61 6c 69 64 20 62 79 74 65 20 6c 65 6e  Invalid byte len
10330 67 74 68 21 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  gth!");....     
10340 20 20 20 20 20 72 64 2e 47 65 74 42 79 74 65 73       rd.GetBytes
10350 28 30 2c 20 30 2c 20 62 2c 20 30 2c 20 34 30 30  (0, 0, b, 0, 400
10360 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  0);....         
10370 20 69 66 20 28 62 5b 30 5d 20 21 3d 20 31 29 20   if (b[0] != 1) 
10380 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
10390 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61 6c 75  ion("Binary valu
103a0 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65  e non-match byte
103b0 20 30 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20   0");..         
103c0 20 69 66 20 28 62 5b 31 30 30 5d 20 21 3d 20 32   if (b[100] != 2
103d0 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
103e0 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76 61  ption("Binary va
103f0 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62 79  lue non-match by
10400 74 65 20 31 30 30 22 29 3b 0d 0a 20 20 20 20 20  te 100");..     
10410 20 20 20 20 20 69 66 20 28 62 5b 31 30 30 30 5d       if (b[1000]
10420 20 21 3d 20 33 29 20 74 68 72 6f 77 20 6e 65 77   != 3) throw new
10430 20 45 78 63 65 70 74 69 6f 6e 28 22 42 69 6e 61   Exception("Bina
10440 72 79 20 76 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74  ry value non-mat
10450 63 68 20 62 79 74 65 20 31 30 30 30 22 29 3b 0d  ch byte 1000");.
10460 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62  .          if (b
10470 5b 32 30 30 30 5d 20 21 3d 20 34 29 20 74 68 72  [2000] != 4) thr
10480 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
10490 28 22 42 69 6e 61 72 79 20 76 61 6c 75 65 20 6e  ("Binary value n
104a0 6f 6e 2d 6d 61 74 63 68 20 62 79 74 65 20 32 30  on-match byte 20
104b0 30 30 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  00");..         
104c0 20 69 66 20 28 62 5b 33 30 30 30 5d 20 21 3d 20   if (b[3000] != 
104d0 35 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  5) throw new Exc
104e0 65 70 74 69 6f 6e 28 22 42 69 6e 61 72 79 20 76  eption("Binary v
104f0 61 6c 75 65 20 6e 6f 6e 2d 6d 61 74 63 68 20 62  alue non-match b
10500 79 74 65 20 33 30 30 30 22 29 3b 0d 0a 20 20 20  yte 3000");..   
10510 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
10520 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 5b 54  .    }....    [T
10530 65 73 74 5d 0d 0a 20 20 20 20 69 6e 74 65 72 6e  est]..    intern
10540 61 6c 20 76 6f 69 64 20 44 65 63 69 6d 61 6c 54  al void DecimalT
10550 65 73 74 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  est()..    {..  
10560 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d      using (DbCom
10570 6d 61 6e 64 20 63 6d 64 20 3d 20 5f 63 6e 6e 2e  mand cmd = _cnn.
10580 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
10590 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
105a0 20 20 20 64 72 6f 70 74 61 62 6c 65 73 2e 41 64     droptables.Ad
105b0 64 28 22 44 45 43 54 45 53 54 22 29 3b 0d 0a 0d  d("DECTEST");...
105c0 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
105d0 6d 61 6e 64 54 65 78 74 20 3d 20 22 43 52 45 41  mandText = "CREA
105e0 54 45 20 54 41 42 4c 45 20 44 45 43 54 45 53 54  TE TABLE DECTEST
105f0 28 78 20 44 45 43 49 4d 41 4c 28 33 38 2c 31 38  (x DECIMAL(38,18
10600 29 29 22 3b 0d 0a 20 20 20 20 20 20 20 20 63 6d  ))";..        cm
10610 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
10620 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  y();....        
10630 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
10640 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 44  = "INSERT INTO D
10650 45 43 54 45 53 54 28 78 29 20 56 41 4c 55 45 53  ECTEST(x) VALUES
10660 28 30 2e 30 30 30 30 31 29 22 3b 0d 0a 20 20 20  (0.00001)";..   
10670 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
10680 4e 6f 6e 51 75 65 72 79 28 29 3b 0d 0a 20 20 20  NonQuery();..   
10690 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 63       ..        c
106a0 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
106b0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
106c0 44 45 43 54 45 53 54 22 3b 0d 0a 20 20 20 20 20  DECTEST";..     
106d0 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61     using (DbData
106e0 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20  Reader reader = 
106f0 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65  cmd.ExecuteReade
10700 72 28 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  r())..        {.
10710 0a 20 20 20 20 20 20 20 20 20 20 72 65 61 64 65  .          reade
10720 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20  r.Read();..     
10730 20 20 20 20 20 64 65 63 69 6d 61 6c 20 64 20 3d       decimal d =
10740 20 28 64 65 63 69 6d 61 6c 29 72 65 61 64 65 72   (decimal)reader
10750 2e 47 65 74 56 61 6c 75 65 28 30 29 3b 0d 0a 20  .GetValue(0);.. 
10760 20 20 20 20 20 20 20 20 20 64 20 3d 20 72 65 61           d = rea
10770 64 65 72 2e 47 65 74 44 65 63 69 6d 61 6c 28 30  der.GetDecimal(0
10780 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
10790 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
107a0 0a 20 20 20 20 5b 54 65 73 74 28 53 65 71 75 65  .    [Test(Seque
107b0 6e 63 65 20 3d 20 33 30 29 5d 0d 0a 20 20 20 20  nce = 30)]..    
107c0 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 56 65  internal void Ve
107d0 72 69 66 79 49 6e 73 65 72 74 28 29 0d 0a 20 20  rifyInsert()..  
107e0 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69 6e 67    {..      using
107f0 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
10800 3d 20 5f 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d  = _cnn.CreateCom
10810 6d 61 6e 64 28 29 29 0d 0a 20 20 20 20 20 20 7b  mand())..      {
10820 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
10830 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
10840 45 43 54 20 46 69 65 6c 64 31 2c 20 46 69 65 6c  ECT Field1, Fiel
10850 64 32 2c 20 5b 46 69 c3 ab 6c 64 33 5d 2c 20 5b  d2, [Fi..ld3], [
10860 46 69 c3 a6 6c 64 34 5d 2c 20 46 69 65 6c 64 35  Fi..ld4], Field5
10870 20 46 52 4f 4d 20 54 65 73 74 43 61 73 65 22 3b   FROM TestCase";
10880 0d 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 72  ..        cmd.Pr
10890 65 70 61 72 65 28 29 3b 0d 0a 20 20 20 20 20 20  epare();..      
108a0 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
108b0 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64 2e 45  eader rd = cmd.E
108c0 78 65 63 75 74 65 52 65 61 64 65 72 28 29 29 0d  xecuteReader()).
108d0 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
108e0 20 20 20 20 20 20 69 66 20 28 72 64 2e 52 65 61        if (rd.Rea
108f0 64 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  d())..          
10900 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
10910 6e 74 20 46 69 65 6c 64 31 20 3d 20 72 64 2e 47  nt Field1 = rd.G
10920 65 74 49 6e 74 33 32 28 30 29 3b 0d 0a 20 20 20  etInt32(0);..   
10930 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
10940 46 69 65 6c 64 32 20 3d 20 72 64 2e 47 65 74 44  Field2 = rd.GetD
10950 6f 75 62 6c 65 28 31 29 3b 0d 0a 20 20 20 20 20  ouble(1);..     
10960 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 46 69         string Fi
10970 65 6c 64 33 20 3d 20 72 64 2e 47 65 74 53 74 72  eld3 = rd.GetStr
10980 69 6e 67 28 32 29 3b 0d 0a 20 20 20 20 20 20 20  ing(2);..       
10990 20 20 20 20 20 73 74 72 69 6e 67 20 46 69 65 6c       string Fiel
109a0 64 34 20 3d 20 72 64 2e 47 65 74 53 74 72 69 6e  d4 = rd.GetStrin
109b0 67 28 33 29 2e 54 72 69 6d 45 6e 64 28 29 3b 0d  g(3).TrimEnd();.
109c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 61 74  .            Dat
109d0 65 54 69 6d 65 20 46 69 65 6c 64 35 20 3d 20 72  eTime Field5 = r
109e0 64 2e 47 65 74 44 61 74 65 54 69 6d 65 28 34 29  d.GetDateTime(4)
109f0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
10a00 20 69 66 20 28 46 69 65 6c 64 31 20 21 3d 20 31   if (Field1 != 1
10a10 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65  ) throw new Exce
10a20 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72  ption(String.For
10a30 6d 61 74 28 22 46 69 65 6c 64 31 20 7b 30 7d 20  mat("Field1 {0} 
10a40 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 7b 31  did not match {1
10a50 7d 22 2c 20 46 69 65 6c 64 31 2c 20 31 29 29 3b  }", Field1, 1));
10a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
10a70 20 28 46 69 65 6c 64 32 20 21 3d 20 33 2e 31 34   (Field2 != 3.14
10a80 31 35 39 29 20 74 68 72 6f 77 20 6e 65 77 20 45  159) throw new E
10a90 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e  xception(String.
10aa0 46 6f 72 6d 61 74 28 22 46 69 65 6c 64 32 20 7b  Format("Field2 {
10ab0 30 7d 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68  0} did not match
10ac0 20 7b 31 7d 22 2c 20 46 69 65 6c 64 32 2c 20 33   {1}", Field2, 3
10ad0 2e 31 34 31 35 39 29 29 3b 0d 0a 20 20 20 20 20  .14159));..     
10ae0 20 20 20 20 20 20 20 69 66 20 28 46 69 65 6c 64         if (Field
10af0 33 20 21 3d 20 22 46 69 c3 ab 6c 64 33 22 29 20  3 != "Fi..ld3") 
10b00 74 68 72 6f 77 20 6e 65 77 20 45 78 63 65 70 74  throw new Except
10b10 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ion(String.Forma
10b20 74 28 22 46 69 65 6c 64 33 20 7b 30 7d 20 64 69  t("Field3 {0} di
10b30 64 20 6e 6f 74 20 6d 61 74 63 68 20 7b 31 7d 22  d not match {1}"
10b40 2c 20 46 69 65 6c 64 33 2c 20 22 46 69 c3 ab 6c  , Field3, "Fi..l
10b50 64 33 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  d3"));..        
10b60 20 20 20 20 69 66 20 28 46 69 65 6c 64 34 20 21      if (Field4 !
10b70 3d 20 22 46 69 c3 a6 6c 64 34 22 29 20 74 68 72  = "Fi..ld4") thr
10b80 6f 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e  ow new Exception
10b90 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
10ba0 46 69 65 6c 64 34 20 7b 30 7d 20 64 69 64 20 6e  Field4 {0} did n
10bb0 6f 74 20 6d 61 74 63 68 20 7b 31 7d 22 2c 20 46  ot match {1}", F
10bc0 69 65 6c 64 34 2c 20 22 46 69 c3 a6 6c 64 34 22  ield4, "Fi..ld4"
10bd0 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ));..           
10be0 20 69 66 20 28 46 69 65 6c 64 35 2e 43 6f 6d 70   if (Field5.Comp
10bf0 61 72 65 54 6f 28 44 61 74 65 54 69 6d 65 2e 50  areTo(DateTime.P
10c00 61 72 73 65 28 22 32 30 30 35 2d 30 31 2d 30 31  arse("2005-01-01
10c10 20 31 33 3a 34 39 3a 30 30 22 29 29 20 21 3d 20   13:49:00")) != 
10c20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78 63  0) throw new Exc
10c30 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f  eption(String.Fo
10c40 72 6d 61 74 28 22 46 69 65 6c 64 35 20 7b 30 7d  rmat("Field5 {0}
10c50 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 7b   did not match {
10c60 31 7d 22 2c 20 46 69 65 6c 64 34 2c 20 44 61 74  1}", Field4, Dat
10c70 65 54 69 6d 65 2e 50 61 72 73 65 28 22 32 30 30  eTime.Parse("200
10c80 35 2d 30 31 2d 30 31 20 31 33 3a 34 39 3a 30 30  5-01-01 13:49:00
10c90 22 29 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ")));....       
10ca0 20 20 20 20 20 69 66 20 28 72 64 2e 47 65 74 4e       if (rd.GetN
10cb0 61 6d 65 28 30 29 20 21 3d 20 22 46 69 65 6c 64  ame(0) != "Field
10cc0 31 22 29 20 74 68 72 6f 77 20 6e 65 77 20 45 78  1") throw new Ex
10cd0 63 65 70 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74  ception("Non-Mat
10ce0 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 46  ch column name F
10cf0 69 65 6c 64 31 22 29 3b 0d 0a 20 20 20 20 20 20  ield1");..      
10d00 20 20 20 20 20 20 69 66 20 28 72 64 2e 47 65 74        if (rd.Get
10d10 4e 61 6d 65 28 31 29 20 21 3d 20 22 46 69 65 6c  Name(1) != "Fiel
10d20 64 32 22 29 20 74 68 72 6f 77 20 6e 65 77 20 45  d2") throw new E
10d30 78 63 65 70 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61  xception("Non-Ma
10d40 74 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  tch column name 
10d50 46 69 65 6c 64 32 22 29 3b 0d 0a 20 20 20 20 20  Field2");..     
10d60 20 20 20 20 20 20 20 69 66 20 28 72 64 2e 47 65         if (rd.Ge
10d70 74 4e 61 6d 65 28 32 29 20 21 3d 20 22 46 69 c3  tName(2) != "Fi.
10d80 ab 6c 64 33 22 29 20 74 68 72 6f 77 20 6e 65 77  .ld3") throw new
10d90 20 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 6e 2d   Exception("Non-
10da0 4d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d  Match column nam
10db0 65 20 46 69 65 6c 64 33 22 29 3b 0d 0a 20 20 20  e Field3");..   
10dc0 20 20 20 20 20 20 20 20 20 69 66 20 28 72 64 2e           if (rd.
10dd0 47 65 74 4e 61 6d 65 28 33 29 20 21 3d 20 22 46  GetName(3) != "F
10de0 69 c3 a6 6c 64 34 22 29 20 74 68 72 6f 77 20 6e  i..ld4") throw n
10df0 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f  ew Exception("No
10e00 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6e  n-Match column n
10e10 61 6d 65 20 46 69 65 6c 64 34 22 29 3b 0d 0a 20  ame Field4");.. 
10e20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
10e30 64 2e 47 65 74 4e 61 6d 65 28 34 29 20 21 3d 20  d.GetName(4) != 
10e40 22 46 69 65 6c 64 35 22 29 20 74 68 72 6f 77 20  "Field5") throw 
10e50 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 22 4e  new Exception("N
10e60 6f 6e 2d 4d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  on-Match column 
10e70 6e 61 6d 65 20 46 69 65 6c 64 35 22 29 3b 0d 0a  name Field5");..
10e80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10e90 20 20 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f         else thro
10ea0 77 20 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28  w new Exception(
10eb0 22 4e 6f 20 64 61 74 61 20 69 6e 20 74 61 62 6c  "No data in tabl
10ec0 65 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  e");..        }.
10ed0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
10ee0 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73  .  }....  /// <s
10ef0 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 53  ummary>..  /// S
10f00 63 61 6c 61 72 20 75 73 65 72 2d 64 65 66 69 6e  calar user-defin
10f10 65 64 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e  ed function.  In
10f20 20 74 68 69 73 20 65 78 61 6d 70 6c 65 2c 20 74   this example, t
10f30 68 65 20 73 61 6d 65 20 63 6c 61 73 73 20 69 73  he same class is
10f40 20 64 65 63 6c 61 72 65 64 20 74 77 69 63 65 20   declared twice 
10f50 77 69 74 68 20 0d 0a 20 20 2f 2f 2f 20 64 69 66  with ..  /// dif
10f60 66 65 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e 20  ferent function 
10f70 6e 61 6d 65 73 20 74 6f 20 64 65 6d 6f 6e 73 74  names to demonst
10f80 72 61 74 65 20 68 6f 77 20 74 6f 20 75 73 65 20  rate how to use 
10f90 61 6c 69 61 73 20 6e 61 6d 65 73 20 66 6f 72 20  alias names for 
10fa0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
10fb0 63 74 69 6f 6e 73 2e 0d 0a 20 20 2f 2f 2f 20 3c  ctions...  /// <
10fc0 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 5b 53 51  /summary>..  [SQ
10fd0 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 4e 61 6d  LiteFunction(Nam
10fe0 65 20 3d 20 22 46 6f 6f 22 2c 20 41 72 67 75 6d  e = "Foo", Argum
10ff0 65 6e 74 73 20 3d 20 32 2c 20 46 75 6e 63 54 79  ents = 2, FuncTy
11000 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70  pe = FunctionTyp
11010 65 2e 53 63 61 6c 61 72 29 5d 0d 0a 20 20 5b 53  e.Scalar)]..  [S
11020 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 4e 61  QLiteFunction(Na
11030 6d 65 20 3d 20 22 54 65 73 74 46 75 6e 63 22 2c  me = "TestFunc",
11040 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 32 2c 20   Arguments = 2, 
11050 46 75 6e 63 54 79 70 65 20 3d 20 46 75 6e 63 74  FuncType = Funct
11060 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 29 5d  ionType.Scalar)]
11070 0d 0a 20 20 63 6c 61 73 73 20 54 65 73 74 46 75  ..  class TestFu
11080 6e 63 20 3a 20 53 51 4c 69 74 65 46 75 6e 63 74  nc : SQLiteFunct
11090 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 75  ion..  {..    pu
110a0 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f 62  blic override ob
110b0 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a 65  ject Invoke(obje
110c0 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20 20 20 20  ct[] args)..    
110d0 7b 0d 0a 20 20 20 20 20 20 69 66 20 28 61 72 67  {..      if (arg
110e0 73 5b 30 5d 2e 47 65 74 54 79 70 65 28 29 20 21  s[0].GetType() !
110f0 3d 20 74 79 70 65 6f 66 28 69 6e 74 29 29 20 72  = typeof(int)) r
11100 65 74 75 72 6e 20 61 72 67 73 5b 30 5d 3b 0d 0a  eturn args[0];..
11110 0d 0a 20 20 20 20 20 20 69 6e 74 20 50 61 72 61  ..      int Para
11120 6d 31 20 3d 20 43 6f 6e 76 65 72 74 2e 54 6f 49  m1 = Convert.ToI
11130 6e 74 33 32 28 61 72 67 73 5b 30 5d 29 3b 20 2f  nt32(args[0]); /
11140 2f 20 46 69 72 73 74 20 70 61 72 61 6d 65 74 65  / First paramete
11150 72 0d 0a 20 20 20 20 20 20 69 6e 74 20 50 61 72  r..      int Par
11160 61 6d 32 20 3d 20 43 6f 6e 76 65 72 74 2e 54 6f  am2 = Convert.To
11170 49 6e 74 33 32 28 61 72 67 73 5b 31 5d 29 3b 20  Int32(args[1]); 
11180 2f 2f 20 53 65 63 6f 6e 64 20 70 61 72 61 6d 65  // Second parame
11190 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74  ter....      ret
111a0 75 72 6e 20 50 61 72 61 6d 31 20 2b 20 50 61 72  urn Param1 + Par
111b0 61 6d 32 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  am2;..    }..  }
111c0 0d 0a 0d 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e  ....  [SQLiteFun
111d0 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 43 41  ction(Name = "CA
111e0 53 45 54 45 53 54 22 2c 20 41 72 67 75 6d 65 6e  SETEST", Argumen
111f0 74 73 20 3d 20 32 2c 20 46 75 6e 63 54 79 70 65  ts = 2, FuncType
11200 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e   = FunctionType.
11210 53 63 61 6c 61 72 29 5d 0d 0a 20 20 63 6c 61 73  Scalar)]..  clas
11220 73 20 43 61 73 65 54 65 73 74 46 75 6e 63 20 3a  s CaseTestFunc :
11230 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 45   SQLiteFunctionE
11240 78 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 75 62 6c  x..  {..    publ
11250 69 63 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65  ic override obje
11260 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a 65 63 74  ct Invoke(object
11270 5b 5d 20 61 72 67 73 29 0d 0a 20 20 20 20 7b 0d  [] args)..    {.
11280 0a 20 20 20 20 20 20 43 6f 6c 6c 61 74 69 6f 6e  .      Collation
11290 53 65 71 75 65 6e 63 65 20 73 65 71 20 3d 20 47  Sequence seq = G
112a0 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65  etCollationSeque
112b0 6e 63 65 28 29 3b 0d 0a 20 20 20 20 20 20 72 65  nce();..      re
112c0 74 75 72 6e 20 73 65 71 2e 43 6f 6d 70 61 72 65  turn seq.Compare
112d0 28 61 72 67 73 5b 30 5d 2e 54 6f 53 74 72 69 6e  (args[0].ToStrin
112e0 67 28 29 2c 20 61 72 67 73 5b 31 5d 2e 54 6f 53  g(), args[1].ToS
112f0 74 72 69 6e 67 28 29 29 3b 0d 0a 20 20 20 20 7d  tring());..    }
11300 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c  ..  }....  /// <
11310 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
11320 41 67 67 72 65 67 61 74 65 20 75 73 65 72 2d 64  Aggregate user-d
11330 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e  efined function.
11340 20 20 41 72 67 75 6d 65 6e 74 73 20 3d 20 2d 31    Arguments = -1
11350 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65   means any numbe
11360 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
11370 73 20 61 63 63 65 70 74 61 62 6c 65 0d 0a 20 20  s acceptable..  
11380 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
11390 20 20 5b 53 51 4c 69 74 65 46 75 6e 63 74 69 6f    [SQLiteFunctio
113a0 6e 28 4e 61 6d 65 20 3d 20 22 4d 79 43 6f 75 6e  n(Name = "MyCoun
113b0 74 22 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d 20  t", Arguments = 
113c0 2d 31 2c 20 46 75 6e 63 54 79 70 65 20 3d 20 46  -1, FuncType = F
113d0 75 6e 63 74 69 6f 6e 54 79 70 65 2e 41 67 67 72  unctionType.Aggr
113e0 65 67 61 74 65 29 5d 0d 0a 20 20 63 6c 61 73 73  egate)]..  class
113f0 20 4d 79 43 6f 75 6e 74 20 3a 20 53 51 4c 69 74   MyCount : SQLit
11400 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a  eFunction..  {..
11410 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
11420 69 64 65 20 76 6f 69 64 20 53 74 65 70 28 6f 62  ide void Step(ob
11430 6a 65 63 74 5b 5d 20 61 72 67 73 2c 20 69 6e 74  ject[] args, int
11440 20 6e 53 74 65 70 2c 20 72 65 66 20 6f 62 6a 65   nStep, ref obje
11450 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 29 0d  ct contextData).
11460 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66  .    {..      if
11470 20 28 63 6f 6e 74 65 78 74 44 61 74 61 20 3d 3d   (contextData ==
11480 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b 0d   null)..      {.
11490 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
114a0 44 61 74 61 20 3d 20 31 3b 0d 0a 20 20 20 20 20  Data = 1;..     
114b0 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a   }..      else..
114c0 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 44          contextD
114d0 61 74 61 20 3d 20 28 69 6e 74 29 63 6f 6e 74 65  ata = (int)conte
114e0 78 74 44 61 74 61 20 2b 20 31 3b 0d 0a 20 20 20  xtData + 1;..   
114f0 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63   }....    public
11500 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63 74   override object
11510 20 46 69 6e 61 6c 28 6f 62 6a 65 63 74 20 63 6f   Final(object co
11520 6e 74 65 78 74 44 61 74 61 29 0d 0a 20 20 20 20  ntextData)..    
11530 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
11540 63 6f 6e 74 65 78 74 44 61 74 61 3b 0d 0a 20 20  contextData;..  
11550 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f    }..  }....  //
11560 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f  / <summary>..  /
11570 2f 2f 20 53 61 6d 70 6c 65 20 72 65 67 75 6c 61  // Sample regula
11580 72 20 65 78 70 72 65 73 73 69 6f 6e 20 66 75 6e  r expression fun
11590 63 74 69 6f 6e 2e 20 20 45 78 61 6d 70 6c 65 20  ction.  Example 
115a0 55 73 61 67 65 3a 0d 0a 20 20 2f 2f 2f 20 53 45  Usage:..  /// SE
115b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f 6f 20  LECT * FROM foo 
115c0 57 48 45 52 45 20 6e 61 6d 65 20 52 45 47 45 58  WHERE name REGEX
115d0 50 20 27 24 62 61 72 27 0d 0a 20 20 2f 2f 2f 20  P '$bar'..  /// 
115e0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f  SELECT * FROM fo
115f0 6f 20 57 48 45 52 45 20 52 45 47 45 58 50 28 27  o WHERE REGEXP('
11600 24 62 61 72 27 2c 20 6e 61 6d 65 29 0d 0a 20 20  $bar', name)..  
11610 2f 2f 2f 20 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75  /// ..  /// </su
11620 6d 6d 61 72 79 3e 0d 0a 20 20 5b 53 51 4c 69 74  mmary>..  [SQLit
11630 65 46 75 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d  eFunction(Name =
11640 20 22 52 45 47 45 58 50 22 2c 20 41 72 67 75 6d   "REGEXP", Argum
11650 65 6e 74 73 20 3d 20 32 2c 20 46 75 6e 63 54 79  ents = 2, FuncTy
11660 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70  pe = FunctionTyp
11670 65 2e 53 63 61 6c 61 72 29 5d 0d 0a 20 20 63 6c  e.Scalar)]..  cl
11680 61 73 73 20 4d 79 52 65 67 45 78 20 3a 20 53 51  ass MyRegEx : SQ
11690 4c 69 74 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20  LiteFunction..  
116a0 7b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  {..    public ov
116b0 65 72 72 69 64 65 20 6f 62 6a 65 63 74 20 49 6e  erride object In
116c0 76 6f 6b 65 28 6f 62 6a 65 63 74 5b 5d 20 61 72  voke(object[] ar
116d0 67 73 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  gs)..    {..    
116e0 20 20 72 65 74 75 72 6e 20 53 79 73 74 65 6d 2e    return System.
116f0 54 65 78 74 2e 52 65 67 75 6c 61 72 45 78 70 72  Text.RegularExpr
11700 65 73 73 69 6f 6e 73 2e 52 65 67 65 78 2e 49 73  essions.Regex.Is
11710 4d 61 74 63 68 28 43 6f 6e 76 65 72 74 2e 54 6f  Match(Convert.To
11720 53 74 72 69 6e 67 28 61 72 67 73 5b 31 5d 29 2c  String(args[1]),
11730 20 43 6f 6e 76 65 72 74 2e 54 6f 53 74 72 69 6e   Convert.ToStrin
11740 67 28 61 72 67 73 5b 30 5d 29 29 3b 0d 0a 20 20  g(args[0]));..  
11750 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f    }..  }....  //
11760 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f  / <summary>..  /
11770 2f 2f 20 55 73 65 72 2d 64 65 66 69 6e 65 64 20  // User-defined 
11780 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
11790 63 65 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ce...  /// </sum
117a0 6d 61 72 79 3e 0d 0a 20 20 5b 53 51 4c 69 74 65  mary>..  [SQLite
117b0 46 75 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20  Function(Name = 
117c0 22 4d 59 53 45 51 55 45 4e 43 45 22 2c 20 46 75  "MYSEQUENCE", Fu
117d0 6e 63 54 79 70 65 20 3d 20 46 75 6e 63 74 69 6f  ncType = Functio
117e0 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29  nType.Collation)
117f0 5d 0d 0a 20 20 63 6c 61 73 73 20 4d 79 53 65 71  ]..  class MySeq
11800 75 65 6e 63 65 20 3a 20 53 51 4c 69 74 65 46 75  uence : SQLiteFu
11810 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20  nction..  {..   
11820 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
11830 20 69 6e 74 20 43 6f 6d 70 61 72 65 28 73 74 72   int Compare(str
11840 69 6e 67 20 70 61 72 61 6d 31 2c 20 73 74 72 69  ing param1, stri
11850 6e 67 20 70 61 72 61 6d 32 29 0d 0a 20 20 20 20  ng param2)..    
11860 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 4d 61 6b 65  {..      // Make
11870 20 73 75 72 65 20 74 68 65 20 73 74 72 69 6e 67   sure the string
11880 20 22 46 69 c3 ab 6c 64 33 22 20 69 73 20 73 6f   "Fi..ld3" is so
11890 72 74 65 64 20 6f 75 74 20 6f 66 20 6f 72 64 65  rted out of orde
118a0 72 0d 0a 20 20 20 20 20 20 69 66 20 28 70 61 72  r..      if (par
118b0 61 6d 31 20 3d 3d 20 22 46 69 c3 ab 6c 64 33 22  am1 == "Fi..ld3"
118c0 29 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20  ) return 1;..   
118d0 20 20 20 69 66 20 28 70 61 72 61 6d 32 20 3d 3d     if (param2 ==
118e0 20 22 46 69 c3 ab 6c 64 33 22 29 20 72 65 74 75   "Fi..ld3") retu
118f0 72 6e 20 2d 31 3b 0d 0a 20 20 20 20 20 20 72 65  rn -1;..      re
11900 74 75 72 6e 20 53 74 72 69 6e 67 2e 43 6f 6d 70  turn String.Comp
11910 61 72 65 28 70 61 72 61 6d 31 2c 20 70 61 72 61  are(param1, para
11920 6d 32 2c 20 74 72 75 65 29 3b 0d 0a 20 20 20 20  m2, true);..    
11930 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 5b 41 74 74  }..  }....  [Att
11940 72 69 62 75 74 65 55 73 61 67 65 28 41 74 74 72  ributeUsage(Attr
11950 69 62 75 74 65 54 61 72 67 65 74 73 2e 4d 65 74  ibuteTargets.Met
11960 68 6f 64 2c 20 49 6e 68 65 72 69 74 65 64 20 3d  hod, Inherited =
11970 20 66 61 6c 73 65 2c 20 41 6c 6c 6f 77 4d 75 6c   false, AllowMul
11980 74 69 70 6c 65 20 3d 20 66 61 6c 73 65 29 5d 0d  tiple = false)].
11990 0a 20 20 70 75 62 6c 69 63 20 73 65 61 6c 65 64  .  public sealed
119a0 20 63 6c 61 73 73 20 54 65 73 74 41 74 74 72 69   class TestAttri
119b0 62 75 74 65 20 3a 20 41 74 74 72 69 62 75 74 65  bute : Attribute
119c0 2c 20 49 43 6f 6d 70 61 72 61 62 6c 65 3c 54 65  , IComparable<Te
119d0 73 74 41 74 74 72 69 62 75 74 65 3e 0d 0a 20 20  stAttribute>..  
119e0 7b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  {..    private s
119f0 74 61 74 69 63 20 69 6e 74 20 5f 73 74 61 72 74  tatic int _start
11a00 20 3d 20 36 35 35 33 35 3b 0d 0a 20 20 20 20 70   = 65535;..    p
11a10 72 69 76 61 74 65 20 69 6e 74 20 5f 73 65 71 75  rivate int _sequ
11a20 65 6e 63 65 3b 0d 0a 0d 0a 20 20 20 20 70 75 62  ence;....    pub
11a30 6c 69 63 20 54 65 73 74 41 74 74 72 69 62 75 74  lic TestAttribut
11a40 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  e()..    {..    
11a50 20 20 5f 73 65 71 75 65 6e 63 65 20 3d 20 5f 73    _sequence = _s
11a60 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 5f 73 74  tart;..      _st
11a70 61 72 74 2b 2b 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  art++;..    }...
11a80 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20  .    public int 
11a90 53 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 7b 0d  Sequence..    {.
11aa0 0a 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74  .      get { ret
11ab0 75 72 6e 20 5f 73 65 71 75 65 6e 63 65 3b 20 7d  urn _sequence; }
11ac0 0d 0a 20 20 20 20 20 20 73 65 74 20 7b 20 5f 73  ..      set { _s
11ad0 65 71 75 65 6e 63 65 20 3d 20 76 61 6c 75 65 3b  equence = value;
11ae0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
11af0 20 23 72 65 67 69 6f 6e 20 49 43 6f 6d 70 61 72   #region ICompar
11b00 61 62 6c 65 3c 54 65 73 74 41 74 74 72 69 62 75  able<TestAttribu
11b10 74 65 3e 20 4d 65 6d 62 65 72 73 0d 0a 0d 0a 20  te> Members.... 
11b20 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 43 6f     public int Co
11b30 6d 70 61 72 65 54 6f 28 54 65 73 74 41 74 74 72  mpareTo(TestAttr
11b40 69 62 75 74 65 20 6f 74 68 65 72 29 0d 0a 20 20  ibute other)..  
11b50 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72    {..      retur
11b60 6e 20 5f 73 65 71 75 65 6e 63 65 2e 43 6f 6d 70  n _sequence.Comp
11b70 61 72 65 54 6f 28 6f 74 68 65 72 2e 5f 73 65 71  areTo(other._seq
11b80 75 65 6e 63 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a  uence);..    }..
11b90 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
11ba0 20 20 7d 0d 0a 0d 0a 20 20 69 6e 74 65 72 6e 61    }....  interna
11bb0 6c 20 65 6e 75 6d 20 54 65 73 74 52 65 73 75 6c  l enum TestResul
11bc0 74 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20 20 20  tEnum..  {..    
11bd0 53 75 63 63 65 65 64 65 64 20 3d 20 30 2c 0d 0a  Succeeded = 0,..
11be0 20 20 20 20 46 61 69 6c 65 64 20 3d 20 31 2c 0d      Failed = 1,.
11bf0 0a 20 20 20 20 49 6e 63 6f 6e 63 6c 75 73 69 76  .    Inconclusiv
11c00 65 20 3d 20 32 2c 0d 0a 20 20 7d 0d 0a 0d 0a 20  e = 2,..  }.... 
11c10 20 69 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73 20   internal class 
11c20 49 6e 63 6f 6e 63 6c 75 73 69 76 65 45 78 63 65  InconclusiveExce
11c30 70 74 69 6f 6e 20 3a 20 45 78 63 65 70 74 69 6f  ption : Exceptio
11c40 6e 0d 0a 20 20 7b 0d 0a 20 20 20 20 69 6e 74 65  n..  {..    inte
11c50 72 6e 61 6c 20 49 6e 63 6f 6e 63 6c 75 73 69 76  rnal Inconclusiv
11c60 65 45 78 63 65 70 74 69 6f 6e 28 29 0d 0a 20 20  eException()..  
11c70 20 20 20 20 3a 20 62 61 73 65 28 29 0d 0a 20 20      : base()..  
11c80 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    {..    }....  
11c90 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e 63 6f 6e    internal Incon
11ca0 63 6c 75 73 69 76 65 45 78 63 65 70 74 69 6f 6e  clusiveException
11cb0 28 73 74 72 69 6e 67 20 6d 65 73 73 61 67 65 29  (string message)
11cc0 0d 0a 20 20 20 20 20 20 3a 20 62 61 73 65 28 6d  ..      : base(m
11cd0 65 73 73 61 67 65 29 0d 0a 20 20 20 20 7b 0d 0a  essage)..    {..
11ce0 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
11cf0 69 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73 20 54  internal class T
11d00 65 73 74 45 76 65 6e 74 41 72 67 73 20 3a 20 45  estEventArgs : E
11d10 76 65 6e 74 41 72 67 73 0d 0a 20 20 7b 0d 0a 20  ventArgs..  {.. 
11d20 20 20 20 70 75 62 6c 69 63 20 72 65 61 64 6f 6e     public readon
11d30 6c 79 20 73 74 72 69 6e 67 20 54 65 73 74 4e 61  ly string TestNa
11d40 6d 65 3b 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  me;..    public 
11d50 72 65 61 64 6f 6e 6c 79 20 54 65 73 74 52 65 73  readonly TestRes
11d60 75 6c 74 45 6e 75 6d 20 52 65 73 75 6c 74 3b 0d  ultEnum Result;.
11d70 0a 20 20 20 20 70 75 62 6c 69 63 20 72 65 61 64  .    public read
11d80 6f 6e 6c 79 20 45 78 63 65 70 74 69 6f 6e 20 45  only Exception E
11d90 78 63 65 70 74 69 6f 6e 3b 0d 0a 20 20 20 20 70  xception;..    p
11da0 75 62 6c 69 63 20 72 65 61 64 6f 6e 6c 79 20 73  ublic readonly s
11db0 74 72 69 6e 67 20 4d 65 73 73 61 67 65 3b 0d 0a  tring Message;..
11dc0 20 20 20 20 70 75 62 6c 69 63 20 72 65 61 64 6f      public reado
11dd0 6e 6c 79 20 69 6e 74 20 44 75 72 61 74 69 6f 6e  nly int Duration
11de0 3b 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  ;....    interna
11df0 6c 20 54 65 73 74 45 76 65 6e 74 41 72 67 73 28  l TestEventArgs(
11e00 73 74 72 69 6e 67 20 74 65 73 74 4e 61 6d 65 2c  string testName,
11e10 20 54 65 73 74 52 65 73 75 6c 74 45 6e 75 6d 20   TestResultEnum 
11e20 73 75 63 63 65 73 73 2c 20 69 6e 74 20 64 75 72  success, int dur
11e30 61 74 69 6f 6e 2c 20 45 78 63 65 70 74 69 6f 6e  ation, Exception
11e40 20 65 2c 20 73 74 72 69 6e 67 20 6d 65 73 73 61   e, string messa
11e50 67 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ge)..    {..    
11e60 20 20 54 65 73 74 4e 61 6d 65 20 3d 20 74 65 73    TestName = tes
11e70 74 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 52 65  tName;..      Re
11e80 73 75 6c 74 20 3d 20 73 75 63 63 65 73 73 3b 0d  sult = success;.
11e90 0a 20 20 20 20 20 20 45 78 63 65 70 74 69 6f 6e  .      Exception
11ea0 20 3d 20 65 3b 0d 0a 20 20 20 20 20 20 4d 65 73   = e;..      Mes
11eb0 73 61 67 65 20 3d 20 6d 65 73 73 61 67 65 3b 0d  sage = message;.
11ec0 0a 20 20 20 20 20 20 44 75 72 61 74 69 6f 6e 20  .      Duration 
11ed0 3d 20 64 75 72 61 74 69 6f 6e 3b 0d 0a 20 20 20  = duration;..   
11ee0 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 64 65 6c   }..  }....  del
11ef0 65 67 61 74 65 20 76 6f 69 64 20 54 65 73 74 43  egate void TestC
11f00 6f 6d 70 6c 65 74 65 64 45 76 65 6e 74 28 6f 62  ompletedEvent(ob
11f10 6a 65 63 74 20 73 65 6e 64 65 72 2c 20 54 65 73  ject sender, Tes
11f20 74 45 76 65 6e 74 41 72 67 73 20 61 72 67 73 29  tEventArgs args)
11f30 3b 0d 0a 20 20 64 65 6c 65 67 61 74 65 20 76 6f  ;..  delegate vo
11f40 69 64 20 54 65 73 74 53 74 61 72 74 69 6e 67 45  id TestStartingE
11f50 76 65 6e 74 28 6f 62 6a 65 63 74 20 73 65 6e 64  vent(object send
11f60 65 72 2c 20 54 65 73 74 45 76 65 6e 74 41 72 67  er, TestEventArg
11f70 73 20 61 72 67 73 29 3b 0d 0a 0d 0a 20 20 69 6e  s args);....  in
11f80 74 65 72 6e 61 6c 20 61 62 73 74 72 61 63 74 20  ternal abstract 
11f90 63 6c 61 73 73 20 54 65 73 74 43 61 73 65 42 61  class TestCaseBa
11fa0 73 65 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 72 6f  se..  {..    pro
11fb0 74 65 63 74 65 64 20 44 62 50 72 6f 76 69 64 65  tected DbProvide
11fc0 72 46 61 63 74 6f 72 79 20 5f 66 61 63 74 3b 0d  rFactory _fact;.
11fd0 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 44  .    protected D
11fe0 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 5f 63 6e 6e  bConnection _cnn
11ff0 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 70 72   = null;..    pr
12000 6f 74 65 63 74 65 64 20 44 62 43 6f 6e 6e 65 63  otected DbConnec
12010 74 69 6f 6e 53 74 72 69 6e 67 42 75 69 6c 64 65  tionStringBuilde
12020 72 20 5f 63 6e 6e 73 74 72 69 6e 67 3b 0d 0a 20  r _cnnstring;.. 
12030 20 20 20 70 72 6f 74 65 63 74 65 64 20 44 69 63     protected Dic
12040 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20  tionary<string, 
12050 62 6f 6f 6c 3e 20 5f 74 65 73 74 73 20 3d 20 6e  bool> _tests = n
12060 65 77 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74  ew Dictionary<st
12070 72 69 6e 67 2c 62 6f 6f 6c 3e 28 29 3b 0d 0a 0d  ring,bool>();...
12080 0a 20 20 20 20 70 75 62 6c 69 63 20 65 76 65 6e  .    public even
12090 74 20 54 65 73 74 43 6f 6d 70 6c 65 74 65 64 45  t TestCompletedE
120a0 76 65 6e 74 20 4f 6e 54 65 73 74 46 69 6e 69 73  vent OnTestFinis
120b0 68 65 64 3b 0d 0a 20 20 20 20 70 75 62 6c 69 63  hed;..    public
120c0 20 65 76 65 6e 74 20 54 65 73 74 53 74 61 72 74   event TestStart
120d0 69 6e 67 45 76 65 6e 74 20 4f 6e 54 65 73 74 53  ingEvent OnTestS
120e0 74 61 72 74 69 6e 67 3b 0d 0a 20 20 20 20 70 75  tarting;..    pu
120f0 62 6c 69 63 20 65 76 65 6e 74 20 45 76 65 6e 74  blic event Event
12100 48 61 6e 64 6c 65 72 20 4f 6e 41 6c 6c 54 65 73  Handler OnAllTes
12110 74 73 44 6f 6e 65 3b 0d 0a 0d 0a 20 20 20 20 70  tsDone;....    p
12120 72 6f 74 65 63 74 65 64 20 54 65 73 74 43 61 73  rotected TestCas
12130 65 42 61 73 65 28 29 0d 0a 20 20 20 20 7b 0d 0a  eBase()..    {..
12140 20 20 20 20 20 20 53 6f 72 74 65 64 4c 69 73 74        SortedList
12150 3c 54 65 73 74 41 74 74 72 69 62 75 74 65 2c 20  <TestAttribute, 
12160 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
12170 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f 3e 20 69 74  n.MethodInfo> it
12180 65 6d 73 20 3d 20 6e 65 77 20 53 6f 72 74 65 64  ems = new Sorted
12190 4c 69 73 74 3c 54 65 73 74 41 74 74 72 69 62 75  List<TestAttribu
121a0 74 65 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65  te, System.Refle
121b0 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f  ction.MethodInfo
121c0 3e 28 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 65  >();..      fore
121d0 61 63 68 20 28 53 79 73 74 65 6d 2e 52 65 66 6c  ach (System.Refl
121e0 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66  ection.MethodInf
121f0 6f 20 6d 69 20 69 6e 20 47 65 74 54 79 70 65 28  o mi in GetType(
12200 29 2e 47 65 74 4d 65 74 68 6f 64 73 28 53 79 73  ).GetMethods(Sys
12210 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42  tem.Reflection.B
12220 69 6e 64 69 6e 67 46 6c 61 67 73 2e 49 6e 73 74  indingFlags.Inst
12230 61 6e 63 65 20 7c 20 53 79 73 74 65 6d 2e 52 65  ance | System.Re
12240 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67  flection.Binding
12250 46 6c 61 67 73 2e 4e 6f 6e 50 75 62 6c 69 63 20  Flags.NonPublic 
12260 7c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74  | System.Reflect
12270 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61 67 73  ion.BindingFlags
12280 2e 49 6e 76 6f 6b 65 4d 65 74 68 6f 64 29 29 0d  .InvokeMethod)).
12290 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
122a0 20 20 6f 62 6a 65 63 74 5b 5d 20 61 74 74 20 3d    object[] att =
122b0 20 6d 69 2e 47 65 74 43 75 73 74 6f 6d 41 74 74   mi.GetCustomAtt
122c0 72 69 62 75 74 65 73 28 74 79 70 65 6f 66 28 54  ributes(typeof(T
122d0 65 73 74 41 74 74 72 69 62 75 74 65 29 2c 20 66  estAttribute), f
122e0 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alse);..        
122f0 69 66 20 28 61 74 74 2e 4c 65 6e 67 74 68 20 3d  if (att.Length =
12300 3d 20 31 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  = 1)..        {.
12310 0a 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 73  .          items
12320 2e 41 64 64 28 28 54 65 73 74 41 74 74 72 69 62  .Add((TestAttrib
12330 75 74 65 29 61 74 74 5b 30 5d 2c 20 6d 69 29 3b  ute)att[0], mi);
12340 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12350 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f     }....      fo
12360 72 65 61 63 68 20 28 4b 65 79 56 61 6c 75 65 50  reach (KeyValueP
12370 61 69 72 3c 54 65 73 74 41 74 74 72 69 62 75 74  air<TestAttribut
12380 65 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63  e, System.Reflec
12390 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66 6f 3e  tion.MethodInfo>
123a0 20 70 61 69 72 20 69 6e 20 69 74 65 6d 73 29 0d   pair in items).
123b0 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
123c0 20 20 5f 74 65 73 74 73 2e 41 64 64 28 70 61 69    _tests.Add(pai
123d0 72 2e 56 61 6c 75 65 2e 4e 61 6d 65 2c 20 74 72  r.Value.Name, tr
123e0 75 65 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ue);..      }.. 
123f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 72 6f 74     }....    prot
12400 65 63 74 65 64 20 54 65 73 74 43 61 73 65 42 61  ected TestCaseBa
12410 73 65 28 44 62 50 72 6f 76 69 64 65 72 46 61 63  se(DbProviderFac
12420 74 6f 72 79 20 66 61 63 74 6f 72 79 2c 20 73 74  tory factory, st
12430 72 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 53  ring connectionS
12440 74 72 69 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a 20  tring)..    {.. 
12450 20 20 20 20 20 5f 66 61 63 74 20 3d 20 66 61 63       _fact = fac
12460 74 6f 72 79 3b 0d 0a 20 20 20 20 20 20 5f 63 6e  tory;..      _cn
12470 6e 20 3d 20 5f 66 61 63 74 2e 43 72 65 61 74 65  n = _fact.Create
12480 43 6f 6e 6e 65 63 74 69 6f 6e 28 29 3b 0d 0a 20  Connection();.. 
12490 20 20 20 20 20 5f 63 6e 6e 2e 43 6f 6e 6e 65 63       _cnn.Connec
124a0 74 69 6f 6e 53 74 72 69 6e 67 20 3d 20 63 6f 6e  tionString = con
124b0 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 3b 0d 0a  nectionString;..
124c0 20 20 20 20 20 20 5f 63 6e 6e 73 74 72 69 6e 67        _cnnstring
124d0 20 3d 20 5f 66 61 63 74 2e 43 72 65 61 74 65 43   = _fact.CreateC
124e0 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 42  onnectionStringB
124f0 75 69 6c 64 65 72 28 29 3b 0d 0a 20 20 20 20 20  uilder();..     
12500 20 5f 63 6e 6e 73 74 72 69 6e 67 2e 43 6f 6e 6e   _cnnstring.Conn
12510 65 63 74 69 6f 6e 53 74 72 69 6e 67 20 3d 20 63  ectionString = c
12520 6f 6e 6e 65 63 74 69 6f 6e 53 74 72 69 6e 67 3b  onnectionString;
12530 0d 0a 20 20 20 20 20 20 5f 63 6e 6e 2e 4f 70 65  ..      _cnn.Ope
12540 6e 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  n();..    }.... 
12550 20 20 20 69 6e 74 65 72 6e 61 6c 20 44 69 63 74     internal Dict
12560 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 62  ionary<string, b
12570 6f 6f 6c 3e 20 54 65 73 74 73 0d 0a 20 20 20 20  ool> Tests..    
12580 7b 0d 0a 20 20 20 20 20 20 67 65 74 0d 0a 20 20  {..      get..  
12590 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72      {..        r
125a0 65 74 75 72 6e 20 5f 74 65 73 74 73 3b 0d 0a 20  eturn _tests;.. 
125b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 73 65       }..      se
125c0 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  t..      {..    
125d0 20 20 20 20 5f 74 65 73 74 73 20 3d 20 76 61 6c      _tests = val
125e0 75 65 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ue;..      }..  
125f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
12600 6e 61 6c 20 76 6f 69 64 20 52 75 6e 28 29 0d 0a  nal void Run()..
12610 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53 6f 72      {..      Sor
12620 74 65 64 4c 69 73 74 3c 54 65 73 74 41 74 74 72  tedList<TestAttr
12630 69 62 75 74 65 2c 20 53 79 73 74 65 6d 2e 52 65  ibute, System.Re
12640 66 6c 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49  flection.MethodI
12650 6e 66 6f 3e 20 69 74 65 6d 73 20 3d 20 6e 65 77  nfo> items = new
12660 20 53 6f 72 74 65 64 4c 69 73 74 3c 54 65 73 74   SortedList<Test
12670 41 74 74 72 69 62 75 74 65 2c 20 53 79 73 74 65  Attribute, Syste
12680 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65 74  m.Reflection.Met
12690 68 6f 64 49 6e 66 6f 3e 28 29 3b 0d 0a 20 20 20  hodInfo>();..   
126a0 20 20 20 66 6f 72 65 61 63 68 20 28 53 79 73 74     foreach (Syst
126b0 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 4d 65  em.Reflection.Me
126c0 74 68 6f 64 49 6e 66 6f 20 6d 69 20 69 6e 20 47  thodInfo mi in G
126d0 65 74 54 79 70 65 28 29 2e 47 65 74 4d 65 74 68  etType().GetMeth
126e0 6f 64 73 28 53 79 73 74 65 6d 2e 52 65 66 6c 65  ods(System.Refle
126f0 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46 6c 61  ction.BindingFla
12700 67 73 2e 49 6e 73 74 61 6e 63 65 20 7c 20 53 79  gs.Instance | Sy
12710 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e  stem.Reflection.
12720 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 4e 6f 6e  BindingFlags.Non
12730 50 75 62 6c 69 63 20 7c 20 53 79 73 74 65 6d 2e  Public | System.
12740 52 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69  Reflection.Bindi
12750 6e 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d 65  ngFlags.InvokeMe
12760 74 68 6f 64 29 29 0d 0a 20 20 20 20 20 20 7b 0d  thod))..      {.
12770 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 5b  .        object[
12780 5d 20 61 74 74 20 3d 20 6d 69 2e 47 65 74 43 75  ] att = mi.GetCu
12790 73 74 6f 6d 41 74 74 72 69 62 75 74 65 73 28 74  stomAttributes(t
127a0 79 70 65 6f 66 28 54 65 73 74 41 74 74 72 69 62  ypeof(TestAttrib
127b0 75 74 65 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 20  ute), false);.. 
127c0 20 20 20 20 20 20 20 69 66 20 28 61 74 74 2e 4c         if (att.L
127d0 65 6e 67 74 68 20 3d 3d 20 31 20 26 26 20 5f 74  ength == 1 && _t
127e0 65 73 74 73 5b 6d 69 2e 4e 61 6d 65 5d 20 3d 3d  ests[mi.Name] ==
127f0 20 74 72 75 65 29 0d 0a 20 20 20 20 20 20 20 20   true)..        
12800 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 74 65  {..          ite
12810 6d 73 2e 41 64 64 28 28 54 65 73 74 41 74 74 72  ms.Add((TestAttr
12820 69 62 75 74 65 29 61 74 74 5b 30 5d 2c 20 6d 69  ibute)att[0], mi
12830 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
12840 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12850 66 6f 72 65 61 63 68 20 28 4b 65 79 56 61 6c 75  foreach (KeyValu
12860 65 50 61 69 72 3c 54 65 73 74 41 74 74 72 69 62  ePair<TestAttrib
12870 75 74 65 2c 20 53 79 73 74 65 6d 2e 52 65 66 6c  ute, System.Refl
12880 65 63 74 69 6f 6e 2e 4d 65 74 68 6f 64 49 6e 66  ection.MethodInf
12890 6f 3e 20 70 61 69 72 20 69 6e 20 69 74 65 6d 73  o> pair in items
128a0 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
128b0 20 20 20 20 69 66 20 28 4f 6e 54 65 73 74 53 74      if (OnTestSt
128c0 61 72 74 69 6e 67 20 21 3d 20 6e 75 6c 6c 29 0d  arting != null).
128d0 0a 20 20 20 20 20 20 20 20 20 20 4f 6e 54 65 73  .          OnTes
128e0 74 53 74 61 72 74 69 6e 67 28 74 68 69 73 2c 20  tStarting(this, 
128f0 6e 65 77 20 54 65 73 74 45 76 65 6e 74 41 72 67  new TestEventArg
12900 73 28 70 61 69 72 2e 56 61 6c 75 65 2e 4e 61 6d  s(pair.Value.Nam
12910 65 2c 20 54 65 73 74 52 65 73 75 6c 74 45 6e 75  e, TestResultEnu
12920 6d 2e 49 6e 63 6f 6e 63 6c 75 73 69 76 65 2c 20  m.Inconclusive, 
12930 30 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 29 3b  0, null, null));
12940 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ....        int 
12950 73 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d  start = Environm
12960 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a  ent.TickCount;..
12970 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
12980 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
12990 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20 3d 20 70    object obj = p
129a0 61 69 72 2e 56 61 6c 75 65 2e 49 6e 76 6f 6b 65  air.Value.Invoke
129b0 28 74 68 69 73 2c 20 6e 75 6c 6c 29 3b 0d 0a 20  (this, null);.. 
129c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 75 72           int dur
129d0 61 74 69 6f 6e 20 3d 20 45 6e 76 69 72 6f 6e 6d  ation = Environm
129e0 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20  ent.TickCount - 
129f0 73 74 61 72 74 3b 0d 0a 20 20 20 20 20 20 20 20  start;..        
12a00 20 20 69 66 20 28 4f 6e 54 65 73 74 46 69 6e 69    if (OnTestFini
12a10 73 68 65 64 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  shed != null).. 
12a20 20 20 20 20 20 20 20 20 20 20 20 4f 6e 54 65 73             OnTes
12a30 74 46 69 6e 69 73 68 65 64 28 74 68 69 73 2c 20  tFinished(this, 
12a40 6e 65 77 20 54 65 73 74 45 76 65 6e 74 41 72 67  new TestEventArg
12a50 73 28 70 61 69 72 2e 56 61 6c 75 65 2e 4e 61 6d  s(pair.Value.Nam
12a60 65 2c 20 54 65 73 74 52 65 73 75 6c 74 45 6e 75  e, TestResultEnu
12a70 6d 2e 53 75 63 63 65 65 64 65 64 2c 20 64 75 72  m.Succeeded, dur
12a80 61 74 69 6f 6e 2c 20 6e 75 6c 6c 2c 20 28 6f 62  ation, null, (ob
12a90 6a 20 69 73 20 73 74 72 69 6e 67 29 20 3f 20 28  j is string) ? (
12aa0 73 74 72 69 6e 67 29 6f 62 6a 20 3a 20 53 74 72  string)obj : Str
12ab0 69 6e 67 2e 45 6d 70 74 79 29 29 3b 0d 0a 20 20  ing.Empty));..  
12ac0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12ad0 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
12ae0 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  n e)..        {.
12af0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64  .          int d
12b00 75 72 61 74 69 6f 6e 20 3d 20 45 6e 76 69 72 6f  uration = Enviro
12b10 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20  nment.TickCount 
12b20 2d 20 73 74 61 72 74 3b 0d 0a 20 20 20 20 20 20  - start;..      
12b30 20 20 20 20 45 78 63 65 70 74 69 6f 6e 20 69 6e      Exception in
12b40 6e 65 72 20 3d 20 65 2e 49 6e 6e 65 72 45 78 63  ner = e.InnerExc
12b50 65 70 74 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 20  eption;....     
12b60 20 20 20 20 20 69 66 20 28 4f 6e 54 65 73 74 46       if (OnTestF
12b70 69 6e 69 73 68 65 64 20 21 3d 20 6e 75 6c 6c 29  inished != null)
12b80 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
12b90 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 69             if (i
12ba0 6e 6e 65 72 20 69 73 20 49 6e 63 6f 6e 63 6c 75  nner is Inconclu
12bb0 73 69 76 65 45 78 63 65 70 74 69 6f 6e 29 0d 0a  siveException)..
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 6e 54               OnT
12be0 65 73 74 46 69 6e 69 73 68 65 64 28 74 68 69 73  estFinished(this
12bf0 2c 20 6e 65 77 20 54 65 73 74 45 76 65 6e 74 41  , new TestEventA
12c00 72 67 73 28 70 61 69 72 2e 56 61 6c 75 65 2e 4e  rgs(pair.Value.N
12c10 61 6d 65 2c 20 54 65 73 74 52 65 73 75 6c 74 45  ame, TestResultE
12c20 6e 75 6d 2e 49 6e 63 6f 6e 63 6c 75 73 69 76 65  num.Inconclusive
12c30 2c 20 64 75 72 61 74 69 6f 6e 2c 20 6e 75 6c 6c  , duration, null
12c40 2c 20 69 6e 6e 65 72 2e 4d 65 73 73 61 67 65 29  , inner.Message)
12c50 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
12c60 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  }..            e
12c70 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
12c80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12c90 20 20 4f 6e 54 65 73 74 46 69 6e 69 73 68 65 64    OnTestFinished
12ca0 28 74 68 69 73 2c 20 6e 65 77 20 54 65 73 74 45  (this, new TestE
12cb0 76 65 6e 74 41 72 67 73 28 70 61 69 72 2e 56 61  ventArgs(pair.Va
12cc0 6c 75 65 2e 4e 61 6d 65 2c 20 54 65 73 74 52 65  lue.Name, TestRe
12cd0 73 75 6c 74 45 6e 75 6d 2e 46 61 69 6c 65 64 2c  sultEnum.Failed,
12ce0 20 64 75 72 61 74 69 6f 6e 2c 20 69 6e 6e 65 72   duration, inner
12cf0 2c 20 6e 75 6c 6c 29 29 3b 0d 0a 20 20 20 20 20  , null));..     
12d00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12d10 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
12d20 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12d30 20 20 20 69 66 20 28 4f 6e 41 6c 6c 54 65 73 74     if (OnAllTest
12d40 73 44 6f 6e 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a  sDone != null)..
12d50 20 20 20 20 20 20 20 20 4f 6e 41 6c 6c 54 65 73          OnAllTes
12d60 74 73 44 6f 6e 65 28 74 68 69 73 2c 20 45 76 65  tsDone(this, Eve
12d70 6e 74 41 72 67 73 2e 45 6d 70 74 79 29 3b 0d 0a  ntArgs.Empty);..
12d80 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a         }..  }..}..