System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 240bf564f4b8b5e438a5a795d2dfefb0b4841458:


0000: ef bb bf 75 73 69 6e 67 20 53 79 73 74 65 6d 3b  ...using System;
0010: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61  .using System.Da
0020: 74 61 2e 43 6f 6d 6d 6f 6e 3b 0a 75 73 69 6e 67  ta.Common;.using
0030: 20 53 79 73 74 65 6d 2e 44 61 74 61 3b 0a 75 73   System.Data;.us
0040: 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ing System.Data.
0050: 53 51 4c 69 74 65 3b 0a 75 73 69 6e 67 20 53 79  SQLite;.using Sy
0060: 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
0070: 73 3b 0a 0a 6e 61 6d 65 73 70 61 63 65 20 74 65  s;..namespace te
0080: 73 74 0a 7b 0a 0a 20 20 2f 2f 2f 20 3c 73 75 6d  st.{..  /// <sum
0090: 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 53 63 61 6c  mary>.  /// Scal
00a0: 61 72 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ar user-defined 
00b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 6e 20 74 68  function.  In th
00c0: 69 73 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  is example, the 
00d0: 73 61 6d 65 20 63 6c 61 73 73 20 69 73 20 64 65  same class is de
00e0: 63 6c 61 72 65 64 20 74 77 69 63 65 20 77 69 74  clared twice wit
00f0: 68 20 0a 20 20 2f 2f 2f 20 64 69 66 66 65 72 65  h .  /// differe
0100: 6e 74 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  nt function name
0110: 73 20 74 6f 20 64 65 6d 6f 6e 73 74 72 61 74 65  s to demonstrate
0120: 20 68 6f 77 20 74 6f 20 75 73 65 20 61 6c 69 61   how to use alia
0130: 73 20 6e 61 6d 65 73 20 66 6f 72 20 75 73 65 72  s names for user
0140: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
0150: 6e 73 2e 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ns..  /// </summ
0160: 61 72 79 3e 0a 20 20 5b 53 51 4c 69 74 65 46 75  ary>.  [SQLiteFu
0170: 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 46  nction(Name = "F
0180: 6f 6f 22 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d  oo", Arguments =
0190: 20 32 2c 20 46 75 6e 63 54 79 70 65 20 3d 20 46   2, FuncType = F
01a0: 75 6e 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c  unctionType.Scal
01b0: 61 72 29 5d 0a 20 20 5b 53 51 4c 69 74 65 46 75  ar)].  [SQLiteFu
01c0: 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 54  nction(Name = "T
01d0: 65 73 74 46 75 6e 63 22 2c 20 41 72 67 75 6d 65  estFunc", Argume
01e0: 6e 74 73 20 3d 20 32 2c 20 46 75 6e 63 54 79 70  nts = 2, FuncTyp
01f0: 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65  e = FunctionType
0200: 2e 53 63 61 6c 61 72 29 5d 0a 20 20 63 6c 61 73  .Scalar)].  clas
0210: 73 20 54 65 73 74 46 75 6e 63 20 3a 20 53 51 4c  s TestFunc : SQL
0220: 69 74 65 46 75 6e 63 74 69 6f 6e 0a 20 20 7b 0a  iteFunction.  {.
0230: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
0240: 69 64 65 20 6f 62 6a 65 63 74 20 49 6e 76 6f 6b  ide object Invok
0250: 65 28 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 29  e(object[] args)
0260: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20  .    {.      if 
0270: 28 61 72 67 73 5b 30 5d 2e 47 65 74 54 79 70 65  (args[0].GetType
0280: 28 29 20 21 3d 20 74 79 70 65 6f 66 28 69 6e 74  () != typeof(int
0290: 29 29 20 72 65 74 75 72 6e 20 61 72 67 73 5b 30  )) return args[0
02a0: 5d 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20 50 61  ];..      int Pa
02b0: 72 61 6d 31 20 3d 20 43 6f 6e 76 65 72 74 2e 54  ram1 = Convert.T
02c0: 6f 49 6e 74 33 32 28 61 72 67 73 5b 30 5d 29 3b  oInt32(args[0]);
02d0: 20 2f 2f 20 46 69 72 73 74 20 70 61 72 61 6d 65   // First parame
02e0: 74 65 72 0a 20 20 20 20 20 20 69 6e 74 20 50 61  ter.      int Pa
02f0: 72 61 6d 32 20 3d 20 43 6f 6e 76 65 72 74 2e 54  ram2 = Convert.T
0300: 6f 49 6e 74 33 32 28 61 72 67 73 5b 31 5d 29 3b  oInt32(args[1]);
0310: 20 2f 2f 20 53 65 63 6f 6e 64 20 70 61 72 61 6d   // Second param
0320: 65 74 65 72 0a 0a 20 20 20 20 20 20 72 65 74 75  eter..      retu
0330: 72 6e 20 50 61 72 61 6d 31 20 2b 20 50 61 72 61  rn Param1 + Para
0340: 6d 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  m2;.    }.  }.. 
0350: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
0360: 20 2f 2f 2f 20 41 67 67 72 65 67 61 74 65 20 75   /// Aggregate u
0370: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
0380: 74 69 6f 6e 2e 20 20 41 72 67 75 6d 65 6e 74 73  tion.  Arguments
0390: 20 3d 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20   = -1 means any 
03a0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
03b0: 6e 74 73 20 69 73 20 61 63 63 65 70 74 61 62 6c  nts is acceptabl
03c0: 65 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72  e.  /// </summar
03d0: 79 3e 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e 63  y>.  [SQLiteFunc
03e0: 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 4d 79 43  tion(Name = "MyC
03f0: 6f 75 6e 74 22 2c 20 41 72 67 75 6d 65 6e 74 73  ount", Arguments
0400: 20 3d 20 2d 31 2c 20 46 75 6e 63 54 79 70 65 20   = -1, FuncType 
0410: 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 41  = FunctionType.A
0420: 67 67 72 65 67 61 74 65 29 5d 0a 20 20 63 6c 61  ggregate)].  cla
0430: 73 73 20 4d 79 43 6f 75 6e 74 20 3a 20 53 51 4c  ss MyCount : SQL
0440: 69 74 65 46 75 6e 63 74 69 6f 6e 0a 20 20 7b 0a  iteFunction.  {.
0450: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
0460: 69 64 65 20 76 6f 69 64 20 53 74 65 70 28 6f 62  ide void Step(ob
0470: 6a 65 63 74 5b 5d 20 61 72 67 73 2c 20 69 6e 74  ject[] args, int
0480: 20 6e 53 74 65 70 2c 20 72 65 66 20 6f 62 6a 65   nStep, ref obje
0490: 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 29 0a  ct contextData).
04a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28      {.      if (
04b0: 63 6f 6e 74 65 78 74 44 61 74 61 20 3d 3d 20 6e  contextData == n
04c0: 75 6c 6c 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  ull).      {.   
04d0: 20 20 20 20 20 63 6f 6e 74 65 78 74 44 61 74 61       contextData
04e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
04f0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20      else.       
0500: 20 63 6f 6e 74 65 78 74 44 61 74 61 20 3d 20 28   contextData = (
0510: 69 6e 74 29 63 6f 6e 74 65 78 74 44 61 74 61 20  int)contextData 
0520: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
0530: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
0540: 6f 62 6a 65 63 74 20 46 69 6e 61 6c 28 6f 62 6a  object Final(obj
0550: 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 29  ect contextData)
0560: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74  .    {.      ret
0570: 75 72 6e 20 63 6f 6e 74 65 78 74 44 61 74 61 3b  urn contextData;
0580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2f  .    }.  }..  //
0590: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f  / <summary>.  //
05a0: 2f 20 53 61 6d 70 6c 65 20 72 65 67 75 6c 61 72  / Sample regular
05b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 75 6e 63   expression func
05c0: 74 69 6f 6e 2e 20 20 45 78 61 6d 70 6c 65 20 55  tion.  Example U
05d0: 73 61 67 65 3a 0a 20 20 2f 2f 2f 20 53 45 4c 45  sage:.  /// SELE
05e0: 43 54 20 2a 20 46 52 4f 4d 20 66 6f 6f 20 57 48  CT * FROM foo WH
05f0: 45 52 45 20 6e 61 6d 65 20 52 45 47 45 58 50 20  ERE name REGEXP 
0600: 27 24 62 61 72 27 0a 20 20 2f 2f 2f 20 53 45 4c  '$bar'.  /// SEL
0610: 45 43 54 20 2a 20 46 52 4f 4d 20 66 6f 6f 20 57  ECT * FROM foo W
0620: 48 45 52 45 20 52 45 47 45 58 50 28 27 24 62 61  HERE REGEXP('$ba
0630: 72 27 2c 20 6e 61 6d 65 29 0a 20 20 2f 2f 2f 20  r', name).  /// 
0640: 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
0650: 3e 0a 20 20 5b 53 51 4c 69 74 65 46 75 6e 63 74  >.  [SQLiteFunct
0660: 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 52 45 47 45  ion(Name = "REGE
0670: 58 50 22 2c 20 41 72 67 75 6d 65 6e 74 73 20 3d  XP", Arguments =
0680: 20 32 2c 20 46 75 6e 63 54 79 70 65 20 3d 20 46   2, FuncType = F
0690: 75 6e 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c  unctionType.Scal
06a0: 61 72 29 5d 0a 20 20 63 6c 61 73 73 20 4d 79 52  ar)].  class MyR
06b0: 65 67 45 78 20 3a 20 53 51 4c 69 74 65 46 75 6e  egEx : SQLiteFun
06c0: 63 74 69 6f 6e 0a 20 20 7b 0a 20 20 20 20 70 75  ction.  {.    pu
06d0: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f 62  blic override ob
06e0: 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a 65  ject Invoke(obje
06f0: 63 74 5b 5d 20 61 72 67 73 29 0a 20 20 20 20 7b  ct[] args).    {
0700: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 79  .      return Sy
0710: 73 74 65 6d 2e 54 65 78 74 2e 52 65 67 75 6c 61  stem.Text.Regula
0720: 72 45 78 70 72 65 73 73 69 6f 6e 73 2e 52 65 67  rExpressions.Reg
0730: 65 78 2e 49 73 4d 61 74 63 68 28 43 6f 6e 76 65  ex.IsMatch(Conve
0740: 72 74 2e 54 6f 53 74 72 69 6e 67 28 61 72 67 73  rt.ToString(args
0750: 5b 31 5d 29 2c 20 43 6f 6e 76 65 72 74 2e 54 6f  [1]), Convert.To
0760: 53 74 72 69 6e 67 28 61 72 67 73 5b 30 5d 29 29  String(args[0]))
0770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
0780: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f  // <summary>.  /
0790: 2f 2f 20 55 73 65 72 2d 64 65 66 69 6e 65 64 20  // User-defined 
07a0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
07b0: 63 65 2e 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ce..  /// </summ
07c0: 61 72 79 3e 0a 20 20 5b 53 51 4c 69 74 65 46 75  ary>.  [SQLiteFu
07d0: 6e 63 74 69 6f 6e 28 4e 61 6d 65 20 3d 20 22 4d  nction(Name = "M
07e0: 59 53 45 51 55 45 4e 43 45 22 2c 20 46 75 6e 63  YSEQUENCE", Func
07f0: 54 79 70 65 20 3d 20 46 75 6e 63 74 69 6f 6e 54  Type = FunctionT
0800: 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 5d 0a  ype.Collation)].
0810: 20 20 63 6c 61 73 73 20 4d 79 53 65 71 75 65 6e    class MySequen
0820: 63 65 20 3a 20 53 51 4c 69 74 65 46 75 6e 63 74  ce : SQLiteFunct
0830: 69 6f 6e 0a 20 20 7b 0a 20 20 20 20 70 75 62 6c  ion.  {.    publ
0840: 69 63 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20  ic override int 
0850: 43 6f 6d 70 61 72 65 28 73 74 72 69 6e 67 20 70  Compare(string p
0860: 61 72 61 6d 31 2c 20 73 74 72 69 6e 67 20 70 61  aram1, string pa
0870: 72 61 6d 32 29 0a 20 20 20 20 7b 0a 20 20 20 20  ram2).    {.    
0880: 20 20 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20 74    // Make sure t
0890: 68 65 20 73 74 72 69 6e 67 20 22 46 69 65 6c 64  he string "Field
08a0: 33 22 20 69 73 20 73 6f 72 74 65 64 20 6f 75 74  3" is sorted out
08b0: 20 6f 66 20 6f 72 64 65 72 0a 20 20 20 20 20 20   of order.      
08c0: 69 66 20 28 70 61 72 61 6d 31 20 3d 3d 20 22 46  if (param1 == "F
08d0: 69 65 6c 64 33 22 29 20 72 65 74 75 72 6e 20 31  ield3") return 1
08e0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 61 72 61  ;.      if (para
08f0: 6d 32 20 3d 3d 20 22 46 69 65 6c 64 33 22 29 20  m2 == "Field3") 
0900: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
0910: 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 43   return String.C
0920: 6f 6d 70 61 72 65 28 70 61 72 61 6d 31 2c 20 70  ompare(param1, p
0930: 61 72 61 6d 32 2c 20 74 72 75 65 29 3b 0a 20 20  aram2, true);.  
0940: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 6e 74 65 72    }.  }..  inter
0950: 6e 61 6c 20 63 6c 61 73 73 20 54 65 73 74 43 61  nal class TestCa
0960: 73 65 73 0a 20 20 7b 0a 20 20 20 20 69 6e 74 65  ses.  {.    inte
0970: 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64  rnal static void
0980: 20 52 75 6e 28 44 62 50 72 6f 76 69 64 65 72 46   Run(DbProviderF
0990: 61 63 74 6f 72 79 20 66 61 63 74 2c 20 44 62 43  actory fact, DbC
09a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20  onnection cnn). 
09b0: 20 20 20 7b 0a 20 20 20 20 20 20 43 6f 6e 73 6f     {.      Conso
09c0: 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 5c 72  le.WriteLine("\r
09d0: 5c 6e 42 65 67 69 6e 6e 69 6e 67 20 54 65 73 74  \nBeginning Test
09e0: 20 6f 6e 20 22 20 2b 20 63 6e 6e 2e 47 65 74 54   on " + cnn.GetT
09f0: 79 70 65 28 29 2e 54 6f 53 74 72 69 6e 67 28 29  ype().ToString()
0a00: 29 3b 0a 20 20 20 20 20 20 74 72 79 20 7b 20 43  );.      try { C
0a10: 72 65 61 74 65 54 61 62 6c 65 28 63 6e 6e 29 3b  reateTable(cnn);
0a20: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
0a30: 6e 65 28 22 53 55 43 43 45 53 53 20 2d 20 43 72  ne("SUCCESS - Cr
0a40: 65 61 74 65 54 61 62 6c 65 22 29 3b 20 7d 0a 20  eateTable"); }. 
0a50: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
0a60: 70 74 69 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65  ption) { Console
0a70: 2e 57 72 69 74 65 4c 69 6e 65 28 22 46 41 49 4c  .WriteLine("FAIL
0a80: 20 2d 20 43 72 65 61 74 65 54 61 62 6c 65 22 29   - CreateTable")
0a90: 3b 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b  ; }..      try {
0aa0: 20 46 75 6c 6c 54 65 78 74 54 65 73 74 28 63 6e   FullTextTest(cn
0ab0: 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74  n); Console.Writ
0ac0: 65 4c 69 6e 65 28 22 53 55 43 43 45 53 53 20 2d  eLine("SUCCESS -
0ad0: 20 46 75 6c 6c 20 54 65 78 74 20 53 65 61 72 63   Full Text Searc
0ae0: 68 22 29 3b 20 7d 0a 20 20 20 20 20 20 63 61 74  h"); }.      cat
0af0: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29 20 7b  ch (Exception) {
0b00: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
0b10: 6e 65 28 22 46 41 49 4c 20 2d 20 46 75 6c 6c 20  ne("FAIL - Full 
0b20: 54 65 78 74 20 53 65 61 72 63 68 22 29 3b 20 7d  Text Search"); }
0b30: 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20 44 69  ..      try { Di
0b40: 73 70 6f 73 65 50 61 74 74 65 6e 54 65 73 74 28  sposePattenTest(
0b50: 63 6e 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72  cnn); Console.Wr
0b60: 69 74 65 4c 69 6e 65 28 22 53 55 43 43 45 53 53  iteLine("SUCCESS
0b70: 20 2d 20 44 69 73 70 6f 73 65 20 70 61 74 74 65   - Dispose patte
0b80: 72 6e 20 74 65 73 74 22 29 3b 20 7d 0a 20 20 20  rn test"); }.   
0b90: 20 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74     catch (Except
0ba0: 69 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57  ion) { Console.W
0bb0: 72 69 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d  riteLine("FAIL -
0bc0: 20 44 69 73 70 6f 73 65 20 70 61 74 74 65 72 6e   Dispose pattern
0bd0: 20 74 65 73 74 22 29 3b 20 7d 0a 0a 20 20 20 20   test"); }..    
0be0: 20 20 74 72 79 20 7b 20 4b 65 79 49 6e 66 6f 54    try { KeyInfoT
0bf0: 65 73 74 28 66 61 63 74 2c 20 63 6e 6e 29 3b 20  est(fact, cnn); 
0c00: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
0c10: 65 28 22 53 55 43 43 45 53 53 20 2d 20 4b 65 79  e("SUCCESS - Key
0c20: 49 6e 66 6f 20 46 65 74 63 68 22 29 3b 20 7d 0a  Info Fetch"); }.
0c30: 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63        catch (Exc
0c40: 65 70 74 69 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c  eption) { Consol
0c50: 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 46 41 49  e.WriteLine("FAI
0c60: 4c 20 2d 20 4b 65 79 49 6e 66 6f 20 46 65 74 63  L - KeyInfo Fetc
0c70: 68 22 29 3b 20 7d 0a 0a 20 20 20 20 20 20 74 72  h"); }..      tr
0c80: 79 20 7b 20 54 72 61 6e 73 61 63 74 69 6f 6e 54  y { TransactionT
0c90: 65 73 74 28 63 6e 6e 29 3b 20 43 6f 6e 73 6f 6c  est(cnn); Consol
0ca0: 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 53 55 43  e.WriteLine("SUC
0cb0: 43 45 53 53 20 2d 20 54 72 61 6e 73 61 63 74 69  CESS - Transacti
0cc0: 6f 6e 20 45 6e 6c 69 73 74 6d 65 6e 74 22 29 3b  on Enlistment");
0cd0: 20 7d 0a 20 20 20 20 20 20 63 61 74 63 68 20 28   }.      catch (
0ce0: 45 78 63 65 70 74 69 6f 6e 29 20 7b 20 43 6f 6e  Exception) { Con
0cf0: 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22  sole.WriteLine("
0d00: 46 41 49 4c 20 2d 20 54 72 61 6e 73 61 63 74 69  FAIL - Transacti
0d10: 6f 6e 20 45 6e 6c 69 73 74 6d 65 6e 74 22 29 3b  on Enlistment");
0d20: 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20   }..      try { 
0d30: 47 75 69 64 54 65 73 74 28 63 6e 6e 29 3b 20 43  GuidTest(cnn); C
0d40: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
0d50: 28 22 53 55 43 43 45 53 53 20 2d 20 47 75 69 64  ("SUCCESS - Guid
0d60: 20 54 65 73 74 22 29 3b 20 7d 0a 20 20 20 20 20   Test"); }.     
0d70: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
0d80: 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  n) { Console.Wri
0d90: 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 47  teLine("FAIL - G
0da0: 75 69 64 20 54 65 73 74 22 29 3b 20 7d 0a 0a 20  uid Test"); }.. 
0db0: 20 20 20 20 20 74 72 79 20 7b 20 49 6e 73 65 72       try { Inser
0dc0: 74 54 61 62 6c 65 28 63 6e 6e 29 3b 20 43 6f 6e  tTable(cnn); Con
0dd0: 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22  sole.WriteLine("
0de0: 53 55 43 43 45 53 53 20 2d 20 49 6e 73 65 72 74  SUCCESS - Insert
0df0: 54 61 62 6c 65 22 29 3b 20 7d 0a 20 20 20 20 20  Table"); }.     
0e00: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
0e10: 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  n) { Console.Wri
0e20: 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 49  teLine("FAIL - I
0e30: 6e 73 65 72 74 54 61 62 6c 65 22 29 3b 20 7d 0a  nsertTable"); }.
0e40: 0a 20 20 20 20 20 20 74 72 79 20 7b 20 56 65 72  .      try { Ver
0e50: 69 66 79 49 6e 73 65 72 74 28 63 6e 6e 29 3b 20  ifyInsert(cnn); 
0e60: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
0e70: 65 28 22 53 55 43 43 45 53 53 20 2d 20 56 65 72  e("SUCCESS - Ver
0e80: 69 66 79 49 6e 73 65 72 74 22 29 3b 20 7d 0a 20  ifyInsert"); }. 
0e90: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
0ea0: 70 74 69 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65  ption) { Console
0eb0: 2e 57 72 69 74 65 4c 69 6e 65 28 22 46 41 49 4c  .WriteLine("FAIL
0ec0: 20 2d 20 56 65 72 69 66 79 49 6e 73 65 72 74 22   - VerifyInsert"
0ed0: 29 3b 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20  ); }..      try 
0ee0: 7b 20 43 6f 65 72 73 69 6f 6e 54 65 73 74 28 63  { CoersionTest(c
0ef0: 6e 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  nn); Console.Wri
0f00: 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 43  teLine("FAIL - C
0f10: 6f 65 72 73 69 6f 6e 54 65 73 74 22 29 3b 20 7d  oersionTest"); }
0f20: 0a 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78  .      catch (Ex
0f30: 63 65 70 74 69 6f 6e 29 20 7b 20 43 6f 6e 73 6f  ception) { Conso
0f40: 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 53 55  le.WriteLine("SU
0f50: 43 43 45 53 53 20 2d 20 43 6f 65 72 73 69 6f 6e  CCESS - Coersion
0f60: 54 65 73 74 22 29 3b 20 7d 0a 0a 20 20 20 20 20  Test"); }..     
0f70: 20 74 72 79 20 7b 20 50 61 72 61 6d 65 74 65 72   try { Parameter
0f80: 69 7a 65 64 49 6e 73 65 72 74 28 63 6e 6e 29 3b  izedInsert(cnn);
0f90: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
0fa0: 6e 65 28 22 53 55 43 43 45 53 53 20 2d 20 50 61  ne("SUCCESS - Pa
0fb0: 72 61 6d 65 74 65 72 69 7a 65 64 49 6e 73 65 72  rameterizedInser
0fc0: 74 22 29 3b 20 7d 0a 20 20 20 20 20 20 63 61 74  t"); }.      cat
0fd0: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29 20 7b  ch (Exception) {
0fe0: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
0ff0: 6e 65 28 22 46 41 49 4c 20 2d 20 50 61 72 61 6d  ne("FAIL - Param
1000: 65 74 65 72 69 7a 65 64 49 6e 73 65 72 74 22 29  eterizedInsert")
1010: 3b 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b  ; }..      try {
1020: 20 42 69 6e 61 72 79 49 6e 73 65 72 74 28 63 6e   BinaryInsert(cn
1030: 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74  n); Console.Writ
1040: 65 4c 69 6e 65 28 22 53 55 43 43 45 53 53 20 2d  eLine("SUCCESS -
1050: 20 42 69 6e 61 72 79 49 6e 73 65 72 74 20 28 75   BinaryInsert (u
1060: 73 69 6e 67 20 6e 61 6d 65 64 20 70 61 72 61 6d  sing named param
1070: 65 74 65 72 29 22 29 3b 20 7d 0a 20 20 20 20 20  eter)"); }.     
1080: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
1090: 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  n) { Console.Wri
10a0: 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 42  teLine("FAIL - B
10b0: 69 6e 61 72 79 49 6e 73 65 72 74 22 29 3b 20 7d  inaryInsert"); }
10c0: 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20 56 65  ..      try { Ve
10d0: 72 69 66 79 42 69 6e 61 72 79 44 61 74 61 28 63  rifyBinaryData(c
10e0: 6e 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  nn); Console.Wri
10f0: 74 65 4c 69 6e 65 28 22 53 55 43 43 45 53 53 20  teLine("SUCCESS 
1100: 2d 20 56 65 72 69 66 79 42 69 6e 61 72 79 44 61  - VerifyBinaryDa
1110: 74 61 22 29 3b 20 7d 0a 20 20 20 20 20 20 63 61  ta"); }.      ca
1120: 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29 20  tch (Exception) 
1130: 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c  { Console.WriteL
1140: 69 6e 65 28 22 46 41 49 4c 20 2d 20 56 65 72 69  ine("FAIL - Veri
1150: 66 79 42 69 6e 61 72 79 44 61 74 61 22 29 3b 20  fyBinaryData"); 
1160: 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20 4c  }..      try { L
1170: 6f 63 6b 54 65 73 74 28 63 6e 6e 29 3b 20 43 6f  ockTest(cnn); Co
1180: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
1190: 22 53 55 43 43 45 53 53 20 2d 20 4c 6f 63 6b 54  "SUCCESS - LockT
11a0: 65 73 74 22 29 3b 20 7d 0a 20 20 20 20 20 20 63  est"); }.      c
11b0: 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29  atch (Exception)
11c0: 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65   { Console.Write
11d0: 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 4c 6f 63  Line("FAIL - Loc
11e0: 6b 54 65 73 74 22 29 3b 20 7d 0a 0a 20 20 20 20  kTest"); }..    
11f0: 20 20 74 72 79 20 7b 20 50 61 72 61 6d 65 74 65    try { Paramete
1200: 72 69 7a 65 64 49 6e 73 65 72 74 4d 69 73 73 69  rizedInsertMissi
1210: 6e 67 50 61 72 61 6d 73 28 63 6e 6e 29 3b 20 43  ngParams(cnn); C
1220: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
1230: 28 22 46 41 49 4c 20 2d 20 50 61 72 61 6d 65 74  ("FAIL - Paramet
1240: 65 72 69 7a 65 64 49 6e 73 65 72 74 4d 69 73 73  erizedInsertMiss
1250: 69 6e 67 50 61 72 61 6d 73 5c 72 5c 6e 22 29 3b  ingParams\r\n");
1260: 20 7d 0a 20 20 20 20 20 20 63 61 74 63 68 20 28   }.      catch (
1270: 45 78 63 65 70 74 69 6f 6e 29 20 7b 20 43 6f 6e  Exception) { Con
1280: 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22  sole.WriteLine("
1290: 53 55 43 43 45 53 53 20 2d 20 50 61 72 61 6d 65  SUCCESS - Parame
12a0: 74 65 72 69 7a 65 64 49 6e 73 65 72 74 4d 69 73  terizedInsertMis
12b0: 73 69 6e 67 50 61 72 61 6d 73 5c 72 5c 6e 22 29  singParams\r\n")
12c0: 3b 20 7d 0a 0a 20 20 20 20 20 20 2f 2f 74 72 79  ; }..      //try
12d0: 20 7b 20 54 69 6d 65 6f 75 74 54 65 73 74 28 63   { TimeoutTest(c
12e0: 6e 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  nn); Console.Wri
12f0: 74 65 4c 69 6e 65 28 22 53 55 43 43 45 53 53 20  teLine("SUCCESS 
1300: 2d 20 54 69 6d 65 6f 75 74 54 65 73 74 22 29 3b  - TimeoutTest");
1310: 20 7d 0a 20 20 20 20 20 20 2f 2f 63 61 74 63 68   }.      //catch
1320: 20 28 45 78 63 65 70 74 69 6f 6e 29 20 7b 20 43   (Exception) { C
1330: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
1340: 28 22 46 41 49 4c 20 2d 20 54 69 6d 65 6f 75 74  ("FAIL - Timeout
1350: 54 65 73 74 22 29 3b 20 7d 0a 0a 20 20 20 20 20  Test"); }..     
1360: 20 74 72 79 20 7b 20 44 61 74 61 41 64 61 70 74   try { DataAdapt
1370: 65 72 28 66 61 63 74 2c 20 63 6e 6e 2c 20 66 61  er(fact, cnn, fa
1380: 6c 73 65 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72  lse); Console.Wr
1390: 69 74 65 4c 69 6e 65 28 22 22 29 3b 20 7d 0a 20  iteLine(""); }. 
13a0: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
13b0: 70 74 69 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65  ption) { Console
13c0: 2e 57 72 69 74 65 4c 69 6e 65 28 22 46 41 49 4c  .WriteLine("FAIL
13d0: 20 2d 20 44 61 74 61 41 64 61 70 74 65 72 22 29   - DataAdapter")
13e0: 3b 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b  ; }..      try {
13f0: 20 44 61 74 61 41 64 61 70 74 65 72 28 66 61 63   DataAdapter(fac
1400: 74 2c 20 63 6e 6e 2c 20 74 72 75 65 29 3b 20 43  t, cnn, true); C
1410: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
1420: 28 22 22 29 3b 20 7d 0a 20 20 20 20 20 20 63 61  (""); }.      ca
1430: 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29 20  tch (Exception) 
1440: 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c  { Console.WriteL
1450: 69 6e 65 28 22 46 41 49 4c 20 2d 20 44 61 74 61  ine("FAIL - Data
1460: 41 64 61 70 74 65 72 57 69 74 68 49 64 65 6e 74  AdapterWithIdent
1470: 69 74 79 46 65 74 63 68 22 29 3b 20 7d 0a 0a 20  ityFetch"); }.. 
1480: 20 20 20 20 20 74 72 79 20 7b 20 46 61 73 74 49       try { FastI
1490: 6e 73 65 72 74 4d 61 6e 79 28 63 6e 6e 29 3b 20  nsertMany(cnn); 
14a0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
14b0: 65 28 22 22 29 3b 20 7d 0a 20 20 20 20 20 20 63  e(""); }.      c
14c0: 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 29  atch (Exception)
14d0: 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65   { Console.Write
14e0: 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 46 61 73  Line("FAIL - Fas
14f0: 74 49 6e 73 65 72 74 4d 61 6e 79 22 29 3b 20 7d  tInsertMany"); }
1500: 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20 49 74  ..      try { It
1510: 65 72 61 74 69 6f 6e 54 65 73 74 28 63 6e 6e 29  erationTest(cnn)
1520: 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c  ; Console.WriteL
1530: 69 6e 65 28 22 22 29 3b 20 7d 0a 20 20 20 20 20  ine(""); }.     
1540: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
1550: 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69  n) { Console.Wri
1560: 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20 49  teLine("FAIL - I
1570: 74 65 72 61 74 69 6f 6e 20 54 65 73 74 22 29 3b  teration Test");
1580: 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20   }..      try { 
1590: 55 73 65 72 46 75 6e 63 74 69 6f 6e 28 63 6e 6e  UserFunction(cnn
15a0: 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65  ); Console.Write
15b0: 4c 69 6e 65 28 22 22 29 3b 20 7d 0a 20 20 20 20  Line(""); }.    
15c0: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
15d0: 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72  on) { Console.Wr
15e0: 69 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20  iteLine("FAIL - 
15f0: 55 73 65 72 46 75 6e 63 74 69 6f 6e 22 29 3b 20  UserFunction"); 
1600: 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20 55  }..      try { U
1610: 73 65 72 41 67 67 72 65 67 61 74 65 28 63 6e 6e  serAggregate(cnn
1620: 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65  ); Console.Write
1630: 4c 69 6e 65 28 22 22 29 3b 20 7d 0a 20 20 20 20  Line(""); }.    
1640: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
1650: 6f 6e 29 20 7b 20 43 6f 6e 73 6f 6c 65 2e 57 72  on) { Console.Wr
1660: 69 74 65 4c 69 6e 65 28 22 46 41 49 4c 20 2d 20  iteLine("FAIL - 
1670: 55 73 65 72 41 67 67 72 65 67 61 74 65 22 29 3b  UserAggregate");
1680: 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 20 7b 20   }..      try { 
1690: 55 73 65 72 43 6f 6c 6c 61 74 69 6f 6e 28 63 6e  UserCollation(cn
16a0: 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74  n); Console.Writ
16b0: 65 4c 69 6e 65 28 22 53 55 43 43 45 53 53 20 2d  eLine("SUCCESS -
16c0: 20 55 73 65 72 43 6f 6c 6c 61 74 69 6f 6e 22 29   UserCollation")
16d0: 3b 20 7d 0a 20 20 20 20 20 20 63 61 74 63 68 20  ; }.      catch 
16e0: 28 45 78 63 65 70 74 69 6f 6e 29 20 7b 20 43 6f  (Exception) { Co
16f0: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
1700: 22 46 41 49 4c 20 2d 20 55 73 65 72 43 6f 6c 6c  "FAIL - UserColl
1710: 61 74 69 6f 6e 22 29 3b 20 7d 0a 0a 20 20 20 20  ation"); }..    
1720: 20 20 74 72 79 20 7b 20 44 72 6f 70 54 61 62 6c    try { DropTabl
1730: 65 28 63 6e 6e 29 3b 20 43 6f 6e 73 6f 6c 65 2e  e(cnn); Console.
1740: 57 72 69 74 65 4c 69 6e 65 28 22 53 55 43 43 45  WriteLine("SUCCE
1750: 53 53 20 2d 20 44 72 6f 70 54 61 62 6c 65 22 29  SS - DropTable")
1760: 3b 20 7d 0a 20 20 20 20 20 20 63 61 74 63 68 20  ; }.      catch 
1770: 28 45 78 63 65 70 74 69 6f 6e 29 20 7b 20 43 6f  (Exception) { Co
1780: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
1790: 22 46 41 49 4c 20 2d 20 44 72 6f 70 54 61 62 6c  "FAIL - DropTabl
17a0: 65 22 29 3b 20 7d 0a 0a 20 20 20 20 20 20 43 6f  e"); }..      Co
17b0: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
17c0: 22 5c 72 5c 6e 54 65 73 74 73 20 46 69 6e 69 73  "\r\nTests Finis
17d0: 68 65 64 2e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  hed.");.    }.. 
17e0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74     internal stat
17f0: 69 63 20 76 6f 69 64 20 44 69 73 70 6f 73 65 50  ic void DisposeP
1800: 61 74 74 65 6e 54 65 73 74 28 44 62 43 6f 6e 6e  attenTest(DbConn
1810: 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20 20 20 20  ection cnn).    
1820: 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  {.      using (D
1830: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 77 63  bConnection newc
1840: 6e 6e 20 3d 20 28 28 49 43 6c 6f 6e 65 61 62 6c  nn = ((ICloneabl
1850: 65 29 63 6e 6e 29 2e 43 6c 6f 6e 65 28 29 20 61  e)cnn).Clone() a
1860: 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 29 0a  s DbConnection).
1870: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1880: 66 6f 72 20 28 69 6e 74 20 78 20 3d 20 30 3b 20  for (int x = 0; 
1890: 78 20 3c 20 31 30 30 30 30 3b 20 78 2b 2b 29 0a  x < 10000; x++).
18a0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
18b0: 20 20 20 20 44 62 43 6f 6d 6d 61 6e 64 20 63 6d      DbCommand cm
18c0: 64 20 3d 20 6e 65 77 63 6e 6e 2e 43 72 65 61 74  d = newcnn.Creat
18d0: 65 43 6f 6d 6d 61 6e 64 28 29 3b 0a 20 20 20 20  eCommand();.    
18e0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
18f0: 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20  dText = "SELECT 
1900: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
1910: 73 74 65 72 22 3b 0a 20 20 20 20 20 20 20 20 20  ster";.         
1920: 20 44 62 44 61 74 61 52 65 61 64 65 72 20 72 65   DbDataReader re
1930: 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75  ader = cmd.Execu
1940: 74 65 52 65 61 64 65 72 28 29 3b 0a 20 20 20 20  teReader();.    
1950: 20 20 20 20 20 20 72 65 61 64 65 72 2e 52 65 61        reader.Rea
1960: 64 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d();.        }. 
1970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1980: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
1990: 63 20 76 6f 69 64 20 4b 65 79 49 6e 66 6f 54 65  c void KeyInfoTe
19a0: 73 74 28 44 62 50 72 6f 76 69 64 65 72 46 61 63  st(DbProviderFac
19b0: 74 6f 72 79 20 66 61 63 74 2c 20 44 62 43 6f 6e  tory fact, DbCon
19c0: 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20 20 20  nection cnn).   
19d0: 20 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28   {.      using (
19e0: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
19f0: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
1a00: 64 28 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  d()).      {.   
1a10: 20 20 20 20 20 2f 2f 20 46 69 72 73 74 20 74 65       // First te
1a20: 73 74 20 61 67 61 69 6e 73 74 20 69 6e 74 65 67  st against integ
1a30: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28  er primary key (
1a40: 6f 70 74 69 6d 69 7a 65 64 29 20 6b 65 79 69 6e  optimized) keyin
1a50: 66 6f 20 66 65 74 63 68 0a 20 20 20 20 20 20 20  fo fetch.       
1a60: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
1a70: 20 3d 20 22 43 72 65 61 74 65 20 74 61 62 6c 65   = "Create table
1a80: 20 6b 65 79 69 6e 66 6f 74 65 73 74 20 28 69 64   keyinfotest (id
1a90: 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   integer primary
1aa0: 20 6b 65 79 2c 20 6d 79 75 6e 69 71 75 65 76 61   key, myuniqueva
1ab0: 6c 75 65 20 69 6e 74 65 67 65 72 20 75 6e 69 71  lue integer uniq
1ac0: 75 65 20 6e 6f 74 20 6e 75 6c 6c 2c 20 6d 79 76  ue not null, myv
1ad0: 61 6c 75 65 20 76 61 72 63 68 61 72 28 35 30 29  alue varchar(50)
1ae0: 29 22 3b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  )";.        cmd.
1af0: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
1b00: 29 3b 0a 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  );..        cmd.
1b10: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
1b20: 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 6b 65 79  elect * from key
1b30: 69 6e 66 6f 74 65 73 74 22 3b 0a 20 20 20 20 20  infotest";.     
1b40: 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61     using (DbData
1b50: 52 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20  Reader reader = 
1b60: 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65  cmd.ExecuteReade
1b70: 72 28 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f  r(CommandBehavio
1b80: 72 2e 4b 65 79 49 6e 66 6f 20 7c 20 43 6f 6d 6d  r.KeyInfo | Comm
1b90: 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63 68 65  andBehavior.Sche
1ba0: 6d 61 4f 6e 6c 79 29 29 0a 20 20 20 20 20 20 20  maOnly)).       
1bb0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 73 69   {.          usi
1bc0: 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62  ng (DataTable tb
1bd0: 6c 20 3d 20 72 65 61 64 65 72 2e 47 65 74 53 63  l = reader.GetSc
1be0: 68 65 6d 61 54 61 62 6c 65 28 29 29 0a 20 20 20  hemaTable()).   
1bf0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1c00: 20 20 20 20 20 69 66 20 28 74 62 6c 2e 52 6f 77       if (tbl.Row
1c10: 73 2e 43 6f 75 6e 74 20 21 3d 20 33 29 20 74 68  s.Count != 3) th
1c20: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
1c30: 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74  OutOfRangeExcept
1c40: 69 6f 6e 28 22 57 72 6f 6e 67 20 6e 75 6d 62 65  ion("Wrong numbe
1c50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
1c60: 75 72 6e 65 64 22 29 3b 0a 20 20 20 20 20 20 20  urned");.       
1c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
1c80: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
1c90: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
1ca0: 54 20 4d 79 56 61 6c 75 65 20 46 52 4f 4d 20 6b  T MyValue FROM k
1cb0: 65 79 69 6e 66 6f 74 65 73 74 22 3b 0a 20 20 20  eyinfotest";.   
1cc0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
1cd0: 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72 20  taReader reader 
1ce0: 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65 61  = cmd.ExecuteRea
1cf0: 64 65 72 28 43 6f 6d 6d 61 6e 64 42 65 68 61 76  der(CommandBehav
1d00: 69 6f 72 2e 4b 65 79 49 6e 66 6f 20 7c 20 43 6f  ior.KeyInfo | Co
1d10: 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63  mmandBehavior.Sc
1d20: 68 65 6d 61 4f 6e 6c 79 29 29 0a 20 20 20 20 20  hemaOnly)).     
1d30: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
1d40: 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20  sing (DataTable 
1d50: 74 62 6c 20 3d 20 72 65 61 64 65 72 2e 47 65 74  tbl = reader.Get
1d60: 53 63 68 65 6d 61 54 61 62 6c 65 28 29 29 0a 20  SchemaTable()). 
1d70: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1d80: 20 20 20 20 20 20 20 69 66 20 28 74 62 6c 2e 52         if (tbl.R
1d90: 6f 77 73 2e 43 6f 75 6e 74 20 21 3d 20 32 29 20  ows.Count != 2) 
1da0: 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65  throw new Argume
1db0: 6e 74 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65  ntOutOfRangeExce
1dc0: 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e 75 6d  ption("Wrong num
1dd0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72  ber of columns r
1de0: 65 74 75 72 6e 65 64 22 29 3b 0a 20 20 20 20 20  eturned");.     
1df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e00: 0a 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
1e10: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 44 52 4f  mmandText = "DRO
1e20: 50 20 54 41 42 4c 45 20 6b 65 79 69 6e 66 6f 74  P TABLE keyinfot
1e30: 65 73 74 22 3b 0a 20 20 20 20 20 20 20 20 63 6d  est";.        cm
1e40: 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72  d.ExecuteNonQuer
1e50: 79 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  y();..        //
1e60: 20 4e 6f 77 20 74 65 73 74 20 61 67 61 69 6e 73   Now test agains
1e70: 74 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 70 72  t non-integer pr
1e80: 69 6d 61 72 79 20 6b 65 79 20 28 75 6e 6f 70 74  imary key (unopt
1e90: 69 6d 69 7a 65 64 29 20 73 75 62 71 75 65 72 79  imized) subquery
1ea0: 20 6b 65 79 69 6e 66 6f 20 66 65 74 63 68 0a 20   keyinfo fetch. 
1eb0: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
1ec0: 6e 64 54 65 78 74 20 3d 20 22 43 72 65 61 74 65  ndText = "Create
1ed0: 20 74 61 62 6c 65 20 6b 65 79 69 6e 66 6f 74 65   table keyinfote
1ee0: 73 74 20 28 69 64 20 63 68 61 72 20 70 72 69 6d  st (id char prim
1ef0: 61 72 79 20 6b 65 79 2c 20 6d 79 75 6e 69 71 75  ary key, myuniqu
1f00: 65 76 61 6c 75 65 20 69 6e 74 65 67 65 72 20 75  evalue integer u
1f10: 6e 69 71 75 65 20 6e 6f 74 20 6e 75 6c 6c 2c 20  nique not null, 
1f20: 6d 79 76 61 6c 75 65 20 76 61 72 63 68 61 72 28  myvalue varchar(
1f30: 35 30 29 29 22 3b 0a 20 20 20 20 20 20 20 20 63  50))";.        c
1f40: 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65  md.ExecuteNonQue
1f50: 72 79 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 63  ry();..        c
1f60: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
1f70: 20 22 53 45 4c 45 43 54 20 4d 79 56 61 6c 75 65   "SELECT MyValue
1f80: 20 46 52 4f 4d 20 6b 65 79 69 6e 66 6f 74 65 73   FROM keyinfotes
1f90: 74 22 3b 0a 20 20 20 20 20 20 20 20 75 73 69 6e  t";.        usin
1fa0: 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20  g (DbDataReader 
1fb0: 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45 78 65  reader = cmd.Exe
1fc0: 63 75 74 65 52 65 61 64 65 72 28 43 6f 6d 6d 61  cuteReader(Comma
1fd0: 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65 79 49 6e  ndBehavior.KeyIn
1fe0: 66 6f 20 7c 20 43 6f 6d 6d 61 6e 64 42 65 68 61  fo | CommandBeha
1ff0: 76 69 6f 72 2e 53 63 68 65 6d 61 4f 6e 6c 79 29  vior.SchemaOnly)
2000: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
2010: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74        using (Dat
2020: 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 72 65 61  aTable tbl = rea
2030: 64 65 72 2e 47 65 74 53 63 68 65 6d 61 54 61 62  der.GetSchemaTab
2040: 6c 65 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  le()).          
2050: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2060: 20 28 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74   (tbl.Rows.Count
2070: 20 21 3d 20 32 29 20 74 68 72 6f 77 20 6e 65 77   != 2) throw new
2080: 20 41 72 67 75 6d 65 6e 74 4f 75 74 4f 66 52 61   ArgumentOutOfRa
2090: 6e 67 65 45 78 63 65 70 74 69 6f 6e 28 22 57 72  ngeException("Wr
20a0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  ong number of co
20b0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 22 29  lumns returned")
20c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20e0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
20f0: 20 3d 20 22 53 65 6c 65 63 74 20 2a 20 66 72 6f   = "Select * fro
2100: 6d 20 6b 65 79 69 6e 66 6f 74 65 73 74 22 3b 0a  m keyinfotest";.
2110: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
2120: 62 44 61 74 61 52 65 61 64 65 72 20 72 65 61 64  bDataReader read
2130: 65 72 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65  er = cmd.Execute
2140: 52 65 61 64 65 72 28 43 6f 6d 6d 61 6e 64 42 65  Reader(CommandBe
2150: 68 61 76 69 6f 72 2e 4b 65 79 49 6e 66 6f 20 7c  havior.KeyInfo |
2160: 20 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72   CommandBehavior
2170: 2e 53 63 68 65 6d 61 4f 6e 6c 79 29 29 0a 20 20  .SchemaOnly)).  
2180: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2190: 20 20 75 73 69 6e 67 20 28 44 61 74 61 54 61 62    using (DataTab
21a0: 6c 65 20 74 62 6c 20 3d 20 72 65 61 64 65 72 2e  le tbl = reader.
21b0: 47 65 74 53 63 68 65 6d 61 54 61 62 6c 65 28 29  GetSchemaTable()
21c0: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
21d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 62            if (tb
21e0: 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 21 3d 20  l.Rows.Count != 
21f0: 33 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67  3) throw new Arg
2200: 75 6d 65 6e 74 4f 75 74 4f 66 52 61 6e 67 65 45  umentOutOfRangeE
2210: 78 63 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20  xception("Wrong 
2220: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
2230: 73 20 72 65 74 75 72 6e 65 64 22 29 3b 0a 20 20  s returned");.  
2240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2250: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20    }..        // 
2260: 4d 61 6b 65 20 73 75 72 65 20 63 6f 6d 6d 61 6e  Make sure comman
2270: 64 62 75 69 6c 64 65 72 20 63 61 6e 20 67 65 6e  dbuilder can gen
2280: 65 72 61 74 65 20 61 6e 20 75 70 64 61 74 65 20  erate an update 
2290: 63 6f 6d 6d 61 6e 64 20 77 69 74 68 20 74 68 65  command with the
22a0: 20 63 6f 72 72 65 63 74 20 70 61 72 61 6d 65 74   correct paramet
22b0: 65 72 20 63 6f 75 6e 74 0a 20 20 20 20 20 20 20  er count.       
22c0: 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 41 64   using (DbDataAd
22d0: 61 70 74 65 72 20 61 64 70 20 3d 20 66 61 63 74  apter adp = fact
22e0: 2e 43 72 65 61 74 65 44 61 74 61 41 64 61 70 74  .CreateDataAdapt
22f0: 65 72 28 29 29 0a 20 20 20 20 20 20 20 20 75 73  er()).        us
2300: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 42 75  ing (DbCommandBu
2310: 69 6c 64 65 72 20 62 75 69 6c 64 65 72 20 3d 20  ilder builder = 
2320: 66 61 63 74 2e 43 72 65 61 74 65 43 6f 6d 6d 61  fact.CreateComma
2330: 6e 64 42 75 69 6c 64 65 72 28 29 29 0a 20 20 20  ndBuilder()).   
2340: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2350: 20 61 64 70 2e 53 65 6c 65 63 74 43 6f 6d 6d 61   adp.SelectComma
2360: 6e 64 20 3d 20 63 6d 64 3b 0a 20 20 20 20 20 20  nd = cmd;.      
2370: 20 20 20 20 62 75 69 6c 64 65 72 2e 44 61 74 61      builder.Data
2380: 41 64 61 70 74 65 72 20 3d 20 61 64 70 3b 0a 20  Adapter = adp;. 
2390: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 65 72           builder
23a0: 2e 43 6f 6e 66 6c 69 63 74 4f 70 74 69 6f 6e 20  .ConflictOption 
23b0: 3d 20 43 6f 6e 66 6c 69 63 74 4f 70 74 69 6f 6e  = ConflictOption
23c0: 2e 4f 76 65 72 77 72 69 74 65 43 68 61 6e 67 65  .OverwriteChange
23d0: 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 75 73  s;..          us
23e0: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 75  ing (DbCommand u
23f0: 70 64 61 74 65 63 6d 64 20 3d 20 62 75 69 6c 64  pdatecmd = build
2400: 65 72 2e 47 65 74 55 70 64 61 74 65 43 6f 6d 6d  er.GetUpdateComm
2410: 61 6e 64 28 29 29 0a 20 20 20 20 20 20 20 20 20  and()).         
2420: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
2430: 66 20 28 75 70 64 61 74 65 63 6d 64 2e 50 61 72  f (updatecmd.Par
2440: 61 6d 65 74 65 72 73 2e 43 6f 75 6e 74 20 21 3d  ameters.Count !=
2450: 20 34 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   4).            
2460: 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75    throw new Argu
2470: 6d 65 6e 74 4f 75 74 4f 66 52 61 6e 67 65 45 78  mentOutOfRangeEx
2480: 63 65 70 74 69 6f 6e 28 22 57 72 6f 6e 67 20 6e  ception("Wrong n
2490: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
24a0: 65 72 73 20 69 6e 20 75 70 64 61 74 65 20 63 6f  ers in update co
24b0: 6d 6d 61 6e 64 21 22 29 3b 0a 20 20 20 20 20 20  mmand!");.      
24c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
24e0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74     internal stat
24f0: 69 63 20 76 6f 69 64 20 46 75 6c 6c 54 65 78 74  ic void FullText
2500: 54 65 73 74 28 44 62 43 6f 6e 6e 65 63 74 69 6f  Test(DbConnectio
2510: 6e 20 63 6e 6e 29 0a 20 20 20 20 7b 0a 20 20 20  n cnn).    {.   
2520: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d     using (DbComm
2530: 61 6e 64 20 63 6d 64 20 3d 20 63 6e 6e 2e 43 72  and cmd = cnn.Cr
2540: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0a 20  eateCommand()). 
2550: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
2560: 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  md.CommandText =
2570: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
2580: 20 54 41 42 4c 45 20 46 75 6c 6c 54 65 78 74 20   TABLE FullText 
2590: 55 53 49 4e 47 20 46 54 53 32 28 6e 61 6d 65 2c  USING FTS2(name,
25a0: 20 69 6e 67 72 65 64 69 65 6e 74 73 29 3b 22 3b   ingredients);";
25b0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
25c0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0a  cuteNonQuery();.
25d0: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b  .        string[
25e0: 5d 20 6e 61 6d 65 73 20 3d 20 7b 20 22 62 72 6f  ] names = { "bro
25f0: 63 63 6f 6c 69 20 73 74 65 77 22 2c 20 22 70 75  ccoli stew", "pu
2600: 6d 70 6b 69 6e 20 73 74 65 77 22 2c 20 22 62 72  mpkin stew", "br
2610: 6f 63 63 6f 6c 69 20 70 69 65 22 2c 20 22 70 75  occoli pie", "pu
2620: 6d 70 6b 69 6e 20 70 69 65 22 20 7d 3b 0a 20 20  mpkin pie" };.  
2630: 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d 20 69        string[] i
2640: 6e 67 72 65 64 69 65 6e 74 73 20 3d 20 7b 20 22  ngredients = { "
2650: 62 72 6f 63 63 6f 6c 69 20 70 65 70 70 65 72 73  broccoli peppers
2660: 20 63 68 65 65 73 65 20 74 6f 6d 61 74 6f 65 73   cheese tomatoes
2670: 22 2c 20 22 70 75 6d 70 6b 69 6e 20 6f 6e 69 6f  ", "pumpkin onio
2680: 6e 73 20 67 61 72 6c 69 63 20 63 65 6c 65 72 79  ns garlic celery
2690: 22 2c 20 22 62 72 6f 63 63 6f 6c 69 20 63 68 65  ", "broccoli che
26a0: 65 73 65 20 6f 6e 69 6f 6e 73 20 66 6c 6f 75 72  ese onions flour
26b0: 22 2c 20 22 70 75 6d 70 6b 69 6e 20 73 75 67 61  ", "pumpkin suga
26c0: 72 20 66 6c 6f 75 72 20 62 75 74 74 65 72 22 20  r flour butter" 
26d0: 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  };.        int n
26e0: 3b 0a 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43  ;..        cmd.C
26f0: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 69 6e  ommandText = "in
2700: 73 65 72 74 20 69 6e 74 6f 20 46 75 6c 6c 54 65  sert into FullTe
2710: 78 74 20 28 6e 61 6d 65 2c 20 69 6e 67 72 65 64  xt (name, ingred
2720: 69 65 6e 74 73 29 20 76 61 6c 75 65 73 20 28 40  ients) values (@
2730: 6e 61 6d 65 2c 20 40 69 6e 67 72 65 64 69 65 6e  name, @ingredien
2740: 74 29 3b 22 3b 0a 20 20 20 20 20 20 20 20 44 62  t);";.        Db
2750: 50 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 3d  Parameter name =
2760: 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d   cmd.CreateParam
2770: 65 74 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  eter();.        
2780: 44 62 50 61 72 61 6d 65 74 65 72 20 69 6e 67 72  DbParameter ingr
2790: 65 64 69 65 6e 74 20 3d 20 63 6d 64 2e 43 72 65  edient = cmd.Cre
27a0: 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0a  ateParameter();.
27b0: 0a 20 20 20 20 20 20 20 20 6e 61 6d 65 2e 50 61  .        name.Pa
27c0: 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20 22 40  rameterName = "@
27d0: 6e 61 6d 65 22 3b 0a 20 20 20 20 20 20 20 20 69  name";.        i
27e0: 6e 67 72 65 64 69 65 6e 74 2e 50 61 72 61 6d 65  ngredient.Parame
27f0: 74 65 72 4e 61 6d 65 20 3d 20 22 40 69 6e 67 72  terName = "@ingr
2800: 65 64 69 65 6e 74 22 3b 0a 0a 20 20 20 20 20 20  edient";..      
2810: 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73    cmd.Parameters
2820: 2e 41 64 64 28 6e 61 6d 65 29 3b 0a 20 20 20 20  .Add(name);.    
2830: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
2840: 72 73 2e 41 64 64 28 69 6e 67 72 65 64 69 65 6e  rs.Add(ingredien
2850: 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  t);..        for
2860: 20 28 6e 20 3d 20 30 3b 20 6e 20 3c 20 6e 61 6d   (n = 0; n < nam
2870: 65 73 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a  es.Length; n++).
2880: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2890: 20 20 20 20 6e 61 6d 65 2e 56 61 6c 75 65 20 3d      name.Value =
28a0: 20 6e 61 6d 65 73 5b 6e 5d 3b 0a 20 20 20 20 20   names[n];.     
28b0: 20 20 20 20 20 69 6e 67 72 65 64 69 65 6e 74 2e       ingredient.
28c0: 56 61 6c 75 65 20 3d 20 69 6e 67 72 65 64 69 65  Value = ingredie
28d0: 6e 74 73 5b 6e 5d 3b 0a 0a 20 20 20 20 20 20 20  nts[n];..       
28e0: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
28f0: 6e 51 75 65 72 79 28 29 3b 0a 20 20 20 20 20 20  nQuery();.      
2900: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 6d 64    }..        cmd
2910: 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22  .CommandText = "
2920: 73 65 6c 65 63 74 20 72 6f 77 69 64 2c 20 6e 61  select rowid, na
2930: 6d 65 2c 20 69 6e 67 72 65 64 69 65 6e 74 73 20  me, ingredients 
2940: 66 72 6f 6d 20 46 75 6c 6c 54 65 78 74 20 77 68  from FullText wh
2950: 65 72 65 20 6e 61 6d 65 20 6d 61 74 63 68 20 27  ere name match '
2960: 70 69 65 27 3b 22 3b 0a 0a 20 20 20 20 20 20 20  pie';";..       
2970: 20 69 6e 74 5b 5d 20 72 6f 77 69 64 73 20 3d 20   int[] rowids = 
2980: 7b 20 33 2c 20 34 20 7d 3b 0a 20 20 20 20 20 20  { 3, 4 };.      
2990: 20 20 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20    n = 0;..      
29a0: 20 20 75 73 69 6e 67 20 28 44 62 44 61 74 61 52    using (DbDataR
29b0: 65 61 64 65 72 20 72 65 61 64 65 72 20 3d 20 63  eader reader = c
29c0: 6d 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72  md.ExecuteReader
29d0: 28 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ()).        {.  
29e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 72          while (r
29f0: 65 61 64 65 72 2e 52 65 61 64 28 29 29 0a 20 20  eader.Read()).  
2a00: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2a10: 20 20 20 20 20 20 69 66 20 28 72 65 61 64 65 72        if (reader
2a20: 2e 47 65 74 49 6e 74 36 34 28 30 29 20 21 3d 20  .GetInt64(0) != 
2a30: 72 6f 77 69 64 73 5b 6e 2b 2b 5d 29 0a 20 20 20  rowids[n++]).   
2a40: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
2a50: 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63   new ArgumentExc
2a60: 65 70 74 69 6f 6e 28 22 55 6e 65 78 70 65 63 74  eption("Unexpect
2a70: 65 64 20 72 6f 77 69 64 20 72 65 74 75 72 6e 65  ed rowid returne
2a80: 64 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d");..          
2a90: 20 20 69 66 20 28 6e 20 3e 20 72 6f 77 69 64 73    if (n > rowids
2aa0: 2e 4c 65 6e 67 74 68 29 20 74 68 72 6f 77 20 6e  .Length) throw n
2ab0: 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70  ew ArgumentExcep
2ac0: 74 69 6f 6e 28 22 54 6f 6f 20 6d 61 6e 79 20 72  tion("Too many r
2ad0: 6f 77 73 20 72 65 74 75 72 6e 65 64 22 29 3b 0a  ows returned");.
2ae0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b00: 20 20 7d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c    }.    internal
2b10: 20 73 74 61 74 69 63 20 76 6f 69 64 20 54 72 61   static void Tra
2b20: 6e 73 61 63 74 69 6f 6e 54 65 73 74 28 44 62 43  nsactionTest(DbC
2b30: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20  onnection cnn). 
2b40: 20 20 20 7b 0a 20 20 20 20 20 20 75 73 69 6e 67     {.      using
2b50: 20 28 54 72 61 6e 73 61 63 74 69 6f 6e 53 63 6f   (TransactionSco
2b60: 70 65 20 73 63 6f 70 65 20 3d 20 6e 65 77 20 54  pe scope = new T
2b70: 72 61 6e 73 61 63 74 69 6f 6e 53 63 6f 70 65 28  ransactionScope(
2b80: 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  )).      {.     
2b90: 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6e 6e     using (DbConn
2ba0: 65 63 74 69 6f 6e 20 63 6e 6e 32 20 3d 20 28 28  ection cnn2 = ((
2bb0: 49 43 6c 6f 6e 65 61 62 6c 65 29 63 6e 6e 29 2e  ICloneable)cnn).
2bc0: 43 6c 6f 6e 65 28 29 20 61 73 20 44 62 43 6f 6e  Clone() as DbCon
2bd0: 6e 65 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20  nection).       
2be0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 73 69   {.          usi
2bf0: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d  ng (DbCommand cm
2c00: 64 20 3d 20 63 6e 6e 32 2e 43 72 65 61 74 65 43  d = cnn2.CreateC
2c10: 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20 20  ommand()).      
2c20: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2c30: 20 20 2f 2f 20 43 72 65 61 74 65 64 20 61 20 74    // Created a t
2c40: 61 62 6c 65 20 69 6e 73 69 64 65 20 74 68 65 20  able inside the 
2c50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 63 6f 70  transaction scop
2c60: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  e.            cm
2c70: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
2c80: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 56 6f  "CREATE TABLE Vo
2c90: 6c 61 74 69 6c 65 54 61 62 6c 65 20 28 49 44 20  latileTable (ID 
2ca0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2cb0: 4b 45 59 2c 20 4d 79 56 61 6c 75 65 20 56 41 52  KEY, MyValue VAR
2cc0: 43 48 41 52 28 35 30 29 29 22 3b 0a 20 20 20 20  CHAR(50))";.    
2cd0: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
2ce0: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0a 0a  uteNonQuery();..
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
2d00: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
2d10: 32 20 3d 20 63 6e 6e 32 2e 43 72 65 61 74 65 43  2 = cnn2.CreateC
2d20: 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20 20  ommand()).      
2d30: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d40: 20 20 20 20 20 20 75 73 69 6e 67 20 28 63 6d 64        using (cmd
2d50: 32 2e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  2.Transaction = 
2d60: 63 6e 6e 32 2e 42 65 67 69 6e 54 72 61 6e 73 61  cnn2.BeginTransa
2d70: 63 74 69 6f 6e 28 29 29 0a 20 20 20 20 20 20 20  ction()).       
2d80: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2d90: 20 20 20 20 20 20 20 20 20 2f 2f 20 49 6e 73 65           // Inse
2da0: 72 74 69 6e 67 20 61 20 76 61 6c 75 65 20 69 6e  rting a value in
2db0: 73 69 64 65 20 74 68 65 20 74 61 62 6c 65 2c 20  side the table, 
2dc0: 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61 63  inside a transac
2dd0: 74 69 6f 6e 20 77 68 69 63 68 20 69 73 20 69 6e  tion which is in
2de0: 73 69 64 65 20 74 68 65 20 74 72 61 6e 73 61 63  side the transac
2df0: 74 69 6f 6e 20 73 63 6f 70 65 0a 20 20 20 20 20  tion scope.     
2e00: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 32 2e             cmd2.
2e10: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49  CommandText = "I
2e20: 4e 53 45 52 54 20 49 4e 54 4f 20 56 6f 6c 61 74  NSERT INTO Volat
2e30: 69 6c 65 54 61 62 6c 65 20 28 49 44 2c 20 4d 79  ileTable (ID, My
2e40: 56 61 6c 75 65 29 20 56 41 4c 55 45 53 28 31 2c  Value) VALUES(1,
2e50: 20 27 48 65 6c 6c 6f 27 29 22 3b 0a 20 20 20 20   'Hello')";.    
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 32              cmd2
2e70: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
2e80: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
2e90: 20 20 20 20 63 6d 64 32 2e 54 72 61 6e 73 61 63      cmd2.Transac
2ea0: 74 69 6f 6e 2e 43 6f 6d 6d 69 74 28 29 3b 0a 20  tion.Commit();. 
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ee0: 20 20 20 2f 2f 20 43 6f 6e 6e 65 63 74 69 6f 6e     // Connection
2ef0: 20 69 73 20 64 69 73 70 6f 73 65 64 20 62 65 66   is disposed bef
2f00: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
2f10: 69 6f 6e 73 63 6f 70 65 20 6c 65 61 76 65 73 2c  ionscope leaves,
2f20: 20 74 68 65 72 65 62 79 20 66 6f 72 63 69 6e 67   thereby forcing
2f30: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2f40: 74 6f 20 73 74 61 79 20 6f 70 65 6e 0a 20 20 20  to stay open.   
2f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2f60: 2f 20 45 78 69 74 20 74 68 65 20 74 72 61 6e 73  / Exit the trans
2f70: 61 63 74 69 6f 6e 73 63 6f 70 65 20 77 69 74 68  actionscope with
2f80: 6f 75 74 20 63 6f 6d 6d 69 74 74 69 6e 67 20 69  out committing i
2f90: 74 2c 20 63 61 75 73 69 6e 67 20 61 20 72 6f 6c  t, causing a rol
2fa0: 6c 62 61 63 6b 20 6f 66 20 62 6f 74 68 20 74 68  lback of both th
2fb0: 65 20 63 72 65 61 74 65 20 74 61 62 6c 65 20 61  e create table a
2fc0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 0a 20 20  nd the insert.  
2fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2f 20      }..      // 
2fe0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2ff0: 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  table does not e
3000: 78 69 73 74 0a 20 20 20 20 20 20 75 73 69 6e 67  xist.      using
3010: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
3020: 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d  = cnn.CreateComm
3030: 61 6e 64 28 29 29 0a 20 20 20 20 20 20 7b 0a 20  and()).      {. 
3040: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
3050: 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54  ndText = "SELECT
3060: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 56   COUNT(*) FROM V
3070: 6f 6c 61 74 69 6c 65 54 61 62 6c 65 22 3b 0a 20  olatileTable";. 
3080: 20 20 20 20 20 20 20 74 72 79 0a 20 20 20 20 20         try.     
3090: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6f     {.          o
30a0: 62 6a 65 63 74 20 6f 20 3d 20 63 6d 64 2e 45 78  bject o = cmd.Ex
30b0: 65 63 75 74 65 53 63 61 6c 61 72 28 29 3b 0a 20  ecuteScalar();. 
30c0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
30d0: 65 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74  ew InvalidOperat
30e0: 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28 22 54 72  ionException("Tr
30f0: 61 6e 73 61 63 74 69 6f 6e 20 66 61 69 6c 65 64  ansaction failed
3100: 21 20 54 68 65 20 74 61 62 6c 65 20 65 78 69 73  ! The table exis
3110: 74 73 21 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ts!");.        }
3120: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 28 53  .        catch(S
3130: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 29 0a  QLiteException).
3140: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
3150: 20 20 20 20 72 65 74 75 72 6e 3b 20 2f 2f 20 53      return; // S
3160: 75 63 63 65 65 64 65 64 2c 20 74 68 65 20 74 61  ucceeded, the ta
3170: 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  ble should not h
3180: 61 76 65 20 65 78 69 73 74 65 64 0a 20 20 20 20  ave existed.    
3190: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31a0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
31b0: 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20 43 72  l static void Cr
31c0: 65 61 74 65 54 61 62 6c 65 28 44 62 43 6f 6e 6e  eateTable(DbConn
31d0: 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20 20 20 20  ection cnn).    
31e0: 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  {.      using (D
31f0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63  bCommand cmd = c
3200: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
3210: 28 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ()).      {.    
3220: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
3230: 65 78 74 20 3d 20 22 43 52 45 41 54 45 20 54 41  ext = "CREATE TA
3240: 42 4c 45 20 54 65 73 74 43 61 73 65 20 28 49 44  BLE TestCase (ID
3250: 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   integer primary
3260: 20 6b 65 79 20 61 75 74 6f 69 6e 63 72 65 6d 65   key autoincreme
3270: 6e 74 2c 20 46 69 65 6c 64 31 20 49 6e 74 65 67  nt, Field1 Integ
3280: 65 72 2c 20 46 69 65 6c 64 32 20 46 6c 6f 61 74  er, Field2 Float
3290: 2c 20 46 69 65 6c 64 33 20 56 41 52 43 48 41 52  , Field3 VARCHAR
32a0: 28 35 30 29 2c 20 46 69 65 6c 64 34 20 43 48 41  (50), Field4 CHA
32b0: 52 28 31 30 29 2c 20 46 69 65 6c 64 35 20 44 61  R(10), Field5 Da
32c0: 74 65 54 69 6d 65 2c 20 46 69 65 6c 64 36 20 49  teTime, Field6 I
32d0: 6d 61 67 65 29 22 3b 0a 20 20 20 20 20 20 20 20  mage)";.        
32e0: 2f 2f 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78  //cmd.CommandTex
32f0: 74 20 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c  t = "CREATE TABL
3300: 45 20 54 65 73 74 43 61 73 65 20 28 49 44 20 62  E TestCase (ID b
3310: 69 67 69 6e 74 20 70 72 69 6d 61 72 79 20 6b 65  igint primary ke
3320: 79 20 69 64 65 6e 74 69 74 79 2c 20 46 69 65 6c  y identity, Fiel
3330: 64 31 20 49 6e 74 65 67 65 72 2c 20 46 69 65 6c  d1 Integer, Fiel
3340: 64 32 20 46 6c 6f 61 74 2c 20 46 69 65 6c 64 33  d2 Float, Field3
3350: 20 56 41 52 43 48 41 52 28 35 30 29 2c 20 46 69   VARCHAR(50), Fi
3360: 65 6c 64 34 20 43 48 41 52 28 31 30 29 2c 20 46  eld4 CHAR(10), F
3370: 69 65 6c 64 35 20 44 61 74 65 54 69 6d 65 2c 20  ield5 DateTime, 
3380: 46 69 65 6c 64 36 20 49 6d 61 67 65 29 22 3b 0a  Field6 Image)";.
3390: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
33a0: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0a 20  uteNonQuery();. 
33b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33c0: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
33d0: 63 20 76 6f 69 64 20 44 72 6f 70 54 61 62 6c 65  c void DropTable
33e0: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e  (DbConnection cn
33f0: 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  n).    {.      u
3400: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
3410: 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65  cmd = cnn.Create
3420: 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20  Command()).     
3430: 20 7b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43   {.        cmd.C
3440: 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 44 52  ommandText = "DR
3450: 4f 50 20 54 41 42 4c 45 20 54 65 73 74 43 61 73  OP TABLE TestCas
3460: 65 22 3b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  e";.        cmd.
3470: 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  ExecuteNonQuery(
3480: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3490: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
34a0: 74 61 74 69 63 20 76 6f 69 64 20 49 6e 73 65 72  tatic void Inser
34b0: 74 54 61 62 6c 65 28 44 62 43 6f 6e 6e 65 63 74  tTable(DbConnect
34c0: 69 6f 6e 20 63 6e 6e 29 0a 20 20 20 20 7b 0a 20  ion cnn).    {. 
34d0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
34e0: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63 6e 6e 2e  mmand cmd = cnn.
34f0: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
3500: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
3510: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
3520: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
3530: 54 65 73 74 43 61 73 65 28 46 69 65 6c 64 31 2c  TestCase(Field1,
3540: 20 46 69 65 6c 64 32 2c 20 46 69 65 6c 64 33 2c   Field2, Field3,
3550: 20 46 69 65 6c 64 34 2c 20 46 69 65 6c 64 35 29   Field4, Field5)
3560: 20 56 41 4c 55 45 53 28 31 2c 20 33 2e 31 34 31   VALUES(1, 3.141
3570: 35 39 2c 20 27 46 69 65 6c 64 33 27 2c 20 27 46  59, 'Field3', 'F
3580: 69 65 6c 64 34 27 2c 20 27 32 30 30 35 2d 30 31  ield4', '2005-01
3590: 2d 30 31 20 31 33 3a 34 39 3a 30 30 27 29 22 3b  -01 13:49:00')";
35a0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
35b0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0a  cuteNonQuery();.
35c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35d0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74     internal stat
35e0: 69 63 20 76 6f 69 64 20 47 75 69 64 54 65 73 74  ic void GuidTest
35f0: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e  (DbConnection cn
3600: 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  n).    {.      u
3610: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
3620: 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65  cmd = cnn.Create
3630: 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20  Command()).     
3640: 20 7b 0a 20 20 20 20 20 20 20 20 47 75 69 64 20   {.        Guid 
3650: 67 75 69 64 20 3d 20 47 75 69 64 2e 4e 65 77 47  guid = Guid.NewG
3660: 75 69 64 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  uid();..        
3670: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
3680: 3d 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  = "CREATE TABLE 
3690: 47 75 69 64 54 65 73 74 28 4d 79 47 75 69 64 20  GuidTest(MyGuid 
36a0: 47 55 49 44 29 22 3b 0a 20 20 20 20 20 20 20 20  GUID)";.        
36b0: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
36c0: 65 72 79 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ery();..        
36d0: 2f 2f 20 49 6e 73 65 72 74 20 61 20 67 75 69 64  // Insert a guid
36e0: 20 61 73 20 61 20 64 65 66 61 75 6c 74 20 62 69   as a default bi
36f0: 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  nary representat
3700: 69 6f 6e 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  ion.        cmd.
3710: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49  CommandText = "I
3720: 4e 53 45 52 54 20 49 4e 54 4f 20 47 75 69 64 54  NSERT INTO GuidT
3730: 65 73 74 28 4d 79 47 75 69 64 29 20 56 41 4c 55  est(MyGuid) VALU
3740: 45 53 28 40 62 29 22 3b 0a 20 20 20 20 20 20 20  ES(@b)";.       
3750: 20 28 28 53 51 4c 69 74 65 50 61 72 61 6d 65 74   ((SQLiteParamet
3760: 65 72 43 6f 6c 6c 65 63 74 69 6f 6e 29 63 6d 64  erCollection)cmd
3770: 2e 50 61 72 61 6d 65 74 65 72 73 29 2e 41 64 64  .Parameters).Add
3780: 57 69 74 68 56 61 6c 75 65 28 22 40 62 22 2c 20  WithValue("@b", 
3790: 67 75 69 64 29 3b 0a 0a 20 20 20 20 20 20 20 20  guid);..        
37a0: 2f 2f 20 49 6e 73 65 72 74 20 61 20 67 75 69 64  // Insert a guid
37b0: 20 61 73 20 74 65 78 74 0a 20 20 20 20 20 20 20   as text.       
37c0: 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51   cmd.ExecuteNonQ
37d0: 75 65 72 79 28 29 3b 0a 20 20 20 20 20 20 20 20  uery();.        
37e0: 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 5b 30  cmd.Parameters[0
37f0: 5d 2e 56 61 6c 75 65 20 3d 20 67 75 69 64 2e 54  ].Value = guid.T
3800: 6f 53 74 72 69 6e 67 28 29 3b 0a 20 20 20 20 20  oString();.     
3810: 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72     cmd.Parameter
3820: 73 5b 30 5d 2e 44 62 54 79 70 65 20 3d 20 44 62  s[0].DbType = Db
3830: 54 79 70 65 2e 53 74 72 69 6e 67 3b 0a 20 20 20  Type.String;.   
3840: 20 20 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65       cmd.Execute
3850: 4e 6f 6e 51 75 65 72 79 28 29 3b 0a 0a 20 20 20  NonQuery();..   
3860: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
3870: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 4d  Text = "SELECT M
3880: 79 47 75 69 64 20 46 52 4f 4d 20 47 75 69 64 54  yGuid FROM GuidT
3890: 65 73 74 22 3b 0a 20 20 20 20 20 20 20 20 75 73  est";.        us
38a0: 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64 65  ing (DbDataReade
38b0: 72 20 72 65 61 64 65 72 20 3d 20 63 6d 64 2e 45  r reader = cmd.E
38c0: 78 65 63 75 74 65 52 65 61 64 65 72 28 29 29 0a  xecuteReader()).
38d0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
38e0: 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64 28      reader.Read(
38f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  );.          if 
3900: 28 72 65 61 64 65 72 2e 47 65 74 46 69 65 6c 64  (reader.GetField
3910: 54 79 70 65 28 30 29 20 21 3d 20 74 79 70 65 6f  Type(0) != typeo
3920: 66 28 47 75 69 64 29 29 20 74 68 72 6f 77 20 6e  f(Guid)) throw n
3930: 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70  ew ArgumentExcep
3940: 74 69 6f 6e 28 22 43 6f 6c 75 6d 6e 20 69 73 20  tion("Column is 
3950: 6e 6f 74 20 61 20 47 75 69 64 22 29 3b 0a 20 20  not a Guid");.  
3960: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61 64          if (read
3970: 65 72 2e 47 65 74 47 75 69 64 28 30 29 20 21 3d  er.GetGuid(0) !=
3980: 20 67 75 69 64 29 20 74 68 72 6f 77 20 6e 65 77   guid) throw new
3990: 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69   ArgumentExcepti
39a0: 6f 6e 28 22 47 75 69 64 73 20 64 6f 6e 27 74 20  on("Guids don't 
39b0: 6d 61 74 63 68 21 22 29 3b 0a 0a 20 20 20 20 20  match!");..     
39c0: 20 20 20 20 20 72 65 61 64 65 72 2e 52 65 61 64       reader.Read
39d0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
39e0: 20 28 72 65 61 64 65 72 2e 47 65 74 46 69 65 6c   (reader.GetFiel
39f0: 64 54 79 70 65 28 30 29 20 21 3d 20 74 79 70 65  dType(0) != type
3a00: 6f 66 28 47 75 69 64 29 29 20 74 68 72 6f 77 20  of(Guid)) throw 
3a10: 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65  new ArgumentExce
3a20: 70 74 69 6f 6e 28 22 43 6f 6c 75 6d 6e 20 69 73  ption("Column is
3a30: 20 6e 6f 74 20 61 20 47 75 69 64 22 29 3b 0a 20   not a Guid");. 
3a40: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 61           if (rea
3a50: 64 65 72 2e 47 65 74 47 75 69 64 28 30 29 20 21  der.GetGuid(0) !
3a60: 3d 20 67 75 69 64 29 20 74 68 72 6f 77 20 6e 65  = guid) throw ne
3a70: 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  w ArgumentExcept
3a80: 69 6f 6e 28 22 47 75 69 64 73 20 64 6f 6e 27 74  ion("Guids don't
3a90: 20 6d 61 74 63 68 21 22 29 3b 0a 20 20 20 20 20   match!");.     
3aa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3ab0: 20 7d 0a 20 0a 20 20 20 20 69 6e 74 65 72 6e 61   }. .    interna
3ac0: 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20 56 65  l static void Ve
3ad0: 72 69 66 79 49 6e 73 65 72 74 28 44 62 43 6f 6e  rifyInsert(DbCon
3ae0: 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20 20 20  nection cnn).   
3af0: 20 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28   {.      using (
3b00: 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20  DbCommand cmd = 
3b10: 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e  cnn.CreateComman
3b20: 64 28 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  d()).      {.   
3b30: 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64       cmd.Command
3b40: 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20 46  Text = "SELECT F
3b50: 69 65 6c 64 31 2c 20 46 69 65 6c 64 32 2c 20 46  ield1, Field2, F
3b60: 69 65 6c 64 33 2c 20 46 69 65 6c 64 34 2c 20 46  ield3, Field4, F
3b70: 69 65 6c 64 35 20 46 52 4f 4d 20 54 65 73 74 43  ield5 FROM TestC
3b80: 61 73 65 22 3b 0a 20 20 20 20 20 20 20 20 63 6d  ase";.        cm
3b90: 64 2e 50 72 65 70 61 72 65 28 29 3b 0a 20 20 20  d.Prepare();.   
3ba0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
3bb0: 74 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d  taReader rd = cm
3bc0: 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
3bd0: 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  )).        {.   
3be0: 20 20 20 20 20 20 20 69 66 20 28 72 64 2e 52 65         if (rd.Re
3bf0: 61 64 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  ad()).          
3c00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  {.            lo
3c10: 6e 67 20 46 69 65 6c 64 31 20 3d 20 72 64 2e 47  ng Field1 = rd.G
3c20: 65 74 49 6e 74 36 34 28 30 29 3b 0a 20 20 20 20  etInt64(0);.    
3c30: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 46          double F
3c40: 69 65 6c 64 32 20 3d 20 72 64 2e 47 65 74 44 6f  ield2 = rd.GetDo
3c50: 75 62 6c 65 28 31 29 3b 0a 20 20 20 20 20 20 20  uble(1);.       
3c60: 20 20 20 20 20 73 74 72 69 6e 67 20 46 69 65 6c       string Fiel
3c70: 64 33 20 3d 20 72 64 2e 47 65 74 53 74 72 69 6e  d3 = rd.GetStrin
3c80: 67 28 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  g(2);.          
3c90: 20 20 73 74 72 69 6e 67 20 46 69 65 6c 64 34 20    string Field4 
3ca0: 3d 20 72 64 2e 47 65 74 53 74 72 69 6e 67 28 33  = rd.GetString(3
3cb0: 29 2e 54 72 69 6d 45 6e 64 28 29 3b 0a 20 20 20  ).TrimEnd();.   
3cc0: 20 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d           DateTim
3cd0: 65 20 46 69 65 6c 64 35 20 3d 20 72 64 2e 47 65  e Field5 = rd.Ge
3ce0: 74 44 61 74 65 54 69 6d 65 28 34 29 3b 0a 0a 20  tDateTime(4);.. 
3cf0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 46             if (F
3d00: 69 65 6c 64 31 20 21 3d 20 31 29 20 74 68 72 6f  ield1 != 1) thro
3d10: 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 4f 75  w new ArgumentOu
3d20: 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74 69 6f  tOfRangeExceptio
3d30: 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 6f 6e 20  n("Non-Match on 
3d40: 46 69 65 6c 64 31 22 29 3b 0a 20 20 20 20 20 20  Field1");.      
3d50: 20 20 20 20 20 20 69 66 20 28 46 69 65 6c 64 32        if (Field2
3d60: 20 21 3d 20 33 2e 31 34 31 35 39 29 20 74 68 72   != 3.14159) thr
3d70: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 4f  ow new ArgumentO
3d80: 75 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74 69  utOfRangeExcepti
3d90: 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 6f 6e  on("Non-Match on
3da0: 20 46 69 65 6c 64 32 22 29 3b 0a 20 20 20 20 20   Field2");.     
3db0: 20 20 20 20 20 20 20 69 66 20 28 46 69 65 6c 64         if (Field
3dc0: 33 20 21 3d 20 22 46 69 65 6c 64 33 22 29 20 74  3 != "Field3") t
3dd0: 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e  hrow new Argumen
3de0: 74 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65 70  tOutOfRangeExcep
3df0: 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20  tion("Non-Match 
3e00: 6f 6e 20 46 69 65 6c 64 33 22 29 3b 0a 20 20 20  on Field3");.   
3e10: 20 20 20 20 20 20 20 20 20 69 66 20 28 46 69 65           if (Fie
3e20: 6c 64 34 20 21 3d 20 22 46 69 65 6c 64 34 22 29  ld4 != "Field4")
3e30: 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d   throw new Argum
3e40: 65 6e 74 4f 75 74 4f 66 52 61 6e 67 65 45 78 63  entOutOfRangeExc
3e50: 65 70 74 69 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63  eption("Non-Matc
3e60: 68 20 6f 6e 20 46 69 65 6c 64 34 22 29 3b 0a 20  h on Field4");. 
3e70: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 46             if (F
3e80: 69 65 6c 64 35 2e 43 6f 6d 70 61 72 65 54 6f 28  ield5.CompareTo(
3e90: 44 61 74 65 54 69 6d 65 2e 50 61 72 73 65 28 22  DateTime.Parse("
3ea0: 32 30 30 35 2d 30 31 2d 30 31 20 31 33 3a 34 39  2005-01-01 13:49
3eb0: 3a 30 30 22 29 29 20 21 3d 20 30 29 20 74 68 72  :00")) != 0) thr
3ec0: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 4f  ow new ArgumentO
3ed0: 75 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74 69  utOfRangeExcepti
3ee0: 6f 6e 28 22 4e 6f 6e 2d 4d 61 74 63 68 20 6f 6e  on("Non-Match on
3ef0: 20 46 69 65 6c 64 35 22 29 3b 0a 20 20 20 20 20   Field5");.     
3f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3f10: 20 65 6c 73 65 20 74 68 72 6f 77 20 6e 65 77 20   else throw new 
3f20: 41 72 67 75 6d 65 6e 74 4f 75 74 4f 66 52 61 6e  ArgumentOutOfRan
3f30: 67 65 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f 20  geException("No 
3f40: 64 61 74 61 20 69 6e 20 74 61 62 6c 65 22 29 3b  data in table");
3f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3f60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20   }.    }.    .  
3f70: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
3f80: 63 20 76 6f 69 64 20 43 6f 65 72 73 69 6f 6e 54  c void CoersionT
3f90: 65 73 74 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  est(DbConnection
3fa0: 20 63 6e 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20   cnn).    {.    
3fb0: 20 20 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61    using (DbComma
3fc0: 6e 64 20 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65  nd cmd = cnn.Cre
3fd0: 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20  ateCommand()).  
3fe0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6d      {.        cm
3ff0: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
4000: 22 53 45 4c 45 43 54 20 46 69 65 6c 64 31 2c 20  "SELECT Field1, 
4010: 46 69 65 6c 64 32 2c 20 46 69 65 6c 64 33 2c 20  Field2, Field3, 
4020: 46 69 65 6c 64 34 2c 20 46 69 65 6c 64 35 2c 20  Field4, Field5, 
4030: 27 41 27 2c 20 31 2c 20 31 20 2b 20 31 2c 20 33  'A', 1, 1 + 1, 3
4040: 2e 31 34 31 35 39 20 46 52 4f 4d 20 54 65 73 74  .14159 FROM Test
4050: 43 61 73 65 22 3b 0a 20 20 20 20 20 20 20 20 75  Case";.        u
4060: 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61 64  sing (DbDataRead
4070: 65 72 20 72 64 20 3d 20 63 6d 64 2e 45 78 65 63  er rd = cmd.Exec
4080: 75 74 65 52 65 61 64 65 72 28 29 29 0a 20 20 20  uteReader()).   
4090: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
40a0: 20 69 66 20 28 72 64 2e 52 65 61 64 28 29 29 0a   if (rd.Read()).
40b0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
40c0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 46          object F
40d0: 69 65 6c 64 31 20 3d 20 72 64 2e 47 65 74 49 6e  ield1 = rd.GetIn
40e0: 74 33 32 28 30 29 3b 0a 20 20 20 20 20 20 20 20  t32(0);.        
40f0: 20 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c 64      object Field
4100: 32 20 3d 20 72 64 2e 47 65 74 44 6f 75 62 6c 65  2 = rd.GetDouble
4110: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
4120: 20 6f 62 6a 65 63 74 20 46 69 65 6c 64 33 20 3d   object Field3 =
4130: 20 72 64 2e 47 65 74 53 74 72 69 6e 67 28 32 29   rd.GetString(2)
4140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ;.            ob
4150: 6a 65 63 74 20 46 69 65 6c 64 34 20 3d 20 72 64  ject Field4 = rd
4160: 2e 47 65 74 53 74 72 69 6e 67 28 33 29 2e 54 72  .GetString(3).Tr
4170: 69 6d 45 6e 64 28 29 3b 0a 20 20 20 20 20 20 20  imEnd();.       
4180: 20 20 20 20 20 6f 62 6a 65 63 74 20 46 69 65 6c       object Fiel
4190: 64 35 20 3d 20 72 64 2e 47 65 74 44 61 74 65 54  d5 = rd.GetDateT
41a0: 69 6d 65 28 34 29 3b 0a 0a 20 20 20 20 20 20 20  ime(4);..       
41b0: 20 20 20 20 20 2f 2f 20 54 68 65 20 6e 65 78 74       // The next
41c0: 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 75 6c   statement shoul
41d0: 64 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70  d cause an excep
41e0: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
41f0: 20 46 69 65 6c 64 31 20 3d 20 72 64 2e 47 65 74   Field1 = rd.Get
4200: 53 74 72 69 6e 67 28 30 29 3b 0a 20 20 20 20 20  String(0);.     
4210: 20 20 20 20 20 20 20 46 69 65 6c 64 32 20 3d 20         Field2 = 
4220: 72 64 2e 47 65 74 53 74 72 69 6e 67 28 31 29 3b  rd.GetString(1);
4230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65  .            Fie
4240: 6c 64 33 20 3d 20 72 64 2e 47 65 74 53 74 72 69  ld3 = rd.GetStri
4250: 6e 67 28 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ng(2);.         
4260: 20 20 20 46 69 65 6c 64 34 20 3d 20 72 64 2e 47     Field4 = rd.G
4270: 65 74 53 74 72 69 6e 67 28 33 29 3b 0a 20 20 20  etString(3);.   
4280: 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 35 20           Field5 
4290: 3d 20 72 64 2e 47 65 74 53 74 72 69 6e 67 28 34  = rd.GetString(4
42a0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
42b0: 46 69 65 6c 64 31 20 3d 20 72 64 2e 47 65 74 49  Field1 = rd.GetI
42c0: 6e 74 33 32 28 30 29 3b 0a 20 20 20 20 20 20 20  nt32(0);.       
42d0: 20 20 20 20 20 46 69 65 6c 64 32 20 3d 20 72 64       Field2 = rd
42e0: 2e 47 65 74 49 6e 74 33 32 28 31 29 3b 0a 20 20  .GetInt32(1);.  
42f0: 20 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 33            Field3
4300: 20 3d 20 72 64 2e 47 65 74 49 6e 74 33 32 28 32   = rd.GetInt32(2
4310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  );.            F
4320: 69 65 6c 64 34 20 3d 20 72 64 2e 47 65 74 49 6e  ield4 = rd.GetIn
4330: 74 33 32 28 33 29 3b 0a 20 20 20 20 20 20 20 20  t32(3);.        
4340: 20 20 20 20 46 69 65 6c 64 35 20 3d 20 72 64 2e      Field5 = rd.
4350: 47 65 74 49 6e 74 33 32 28 34 29 3b 0a 0a 20 20  GetInt32(4);..  
4360: 20 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 31            Field1
4370: 20 3d 20 72 64 2e 47 65 74 44 65 63 69 6d 61 6c   = rd.GetDecimal
4380: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (0);.           
4390: 20 46 69 65 6c 64 32 20 3d 20 72 64 2e 47 65 74   Field2 = rd.Get
43a0: 44 65 63 69 6d 61 6c 28 31 29 3b 0a 20 20 20 20  Decimal(1);.    
43b0: 20 20 20 20 20 20 20 20 46 69 65 6c 64 33 20 3d          Field3 =
43c0: 20 72 64 2e 47 65 74 44 65 63 69 6d 61 6c 28 32   rd.GetDecimal(2
43d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  );.            F
43e0: 69 65 6c 64 34 20 3d 20 72 64 2e 47 65 74 44 65  ield4 = rd.GetDe
43f0: 63 69 6d 61 6c 28 33 29 3b 0a 20 20 20 20 20 20  cimal(3);.      
4400: 20 20 20 20 20 20 46 69 65 6c 64 35 20 3d 20 72        Field5 = r
4410: 64 2e 47 65 74 44 65 63 69 6d 61 6c 28 34 29 3b  d.GetDecimal(4);
4420: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4430: 20 20 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f         else thro
4440: 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 4f 75  w new ArgumentOu
4450: 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74 69 6f  tOfRangeExceptio
4460: 6e 28 22 4e 6f 20 64 61 74 61 20 69 6e 20 74 61  n("No data in ta
4470: 62 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ble");.        }
4480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
4490: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61      internal sta
44a0: 74 69 63 20 76 6f 69 64 20 50 61 72 61 6d 65 74  tic void Paramet
44b0: 65 72 69 7a 65 64 49 6e 73 65 72 74 28 44 62 43  erizedInsert(DbC
44c0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20  onnection cnn). 
44d0: 20 20 20 7b 0a 20 20 20 20 20 20 75 73 69 6e 67     {.      using
44e0: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20   (DbCommand cmd 
44f0: 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d  = cnn.CreateComm
4500: 61 6e 64 28 29 29 0a 20 20 20 20 20 20 7b 0a 20  and()).      {. 
4510: 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61         cmd.Comma
4520: 6e 64 54 65 78 74 20 3d 20 22 49 4e 53 45 52 54  ndText = "INSERT
4530: 20 49 4e 54 4f 20 54 65 73 74 43 61 73 65 28 46   INTO TestCase(F
4540: 69 65 6c 64 31 2c 20 46 69 65 6c 64 32 2c 20 46  ield1, Field2, F
4550: 69 65 6c 64 33 2c 20 46 69 65 6c 64 34 2c 20 46  ield3, Field4, F
4560: 69 65 6c 64 35 29 20 56 41 4c 55 45 53 28 3f 2c  ield5) VALUES(?,
4570: 3f 2c 3f 2c 3f 2c 3f 29 22 3b 0a 20 20 20 20 20  ?,?,?,?)";.     
4580: 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 46     DbParameter F
4590: 69 65 6c 64 31 20 3d 20 63 6d 64 2e 43 72 65 61  ield1 = cmd.Crea
45a0: 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0a 20  teParameter();. 
45b0: 20 20 20 20 20 20 20 44 62 50 61 72 61 6d 65 74         DbParamet
45c0: 65 72 20 46 69 65 6c 64 32 20 3d 20 63 6d 64 2e  er Field2 = cmd.
45d0: 43 72 65 61 74 65 50 61 72 61 6d 65 74 65 72 28  CreateParameter(
45e0: 29 3b 0a 20 20 20 20 20 20 20 20 44 62 50 61 72  );.        DbPar
45f0: 61 6d 65 74 65 72 20 46 69 65 6c 64 33 20 3d 20  ameter Field3 = 
4600: 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65  cmd.CreateParame
4610: 74 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20 44  ter();.        D
4620: 62 50 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64  bParameter Field
4630: 34 20 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61  4 = cmd.CreatePa
4640: 72 61 6d 65 74 65 72 28 29 3b 0a 20 20 20 20 20  rameter();.     
4650: 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 46     DbParameter F
4660: 69 65 6c 64 35 20 3d 20 63 6d 64 2e 43 72 65 61  ield5 = cmd.Crea
4670: 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0a 0a  teParameter();..
4680: 20 20 20 20 20 20 20 20 46 69 65 6c 64 31 2e 56          Field1.V
4690: 61 6c 75 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  alue = 2;.      
46a0: 20 20 46 69 65 6c 64 32 2e 56 61 6c 75 65 20 3d    Field2.Value =
46b0: 20 33 2e 31 34 31 35 39 3b 0a 20 20 20 20 20 20   3.14159;.      
46c0: 20 20 46 69 65 6c 64 33 2e 56 61 6c 75 65 20 3d    Field3.Value =
46d0: 20 22 50 61 72 61 6d 20 46 69 65 6c 64 33 22 3b   "Param Field3";
46e0: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 34 2e  .        Field4.
46f0: 56 61 6c 75 65 20 3d 20 22 46 69 65 6c 64 34 20  Value = "Field4 
4700: 50 61 72 22 3b 0a 20 20 20 20 20 20 20 20 46 69  Par";.        Fi
4710: 65 6c 64 35 2e 56 61 6c 75 65 20 3d 20 44 61 74  eld5.Value = Dat
4720: 65 54 69 6d 65 2e 4e 6f 77 3b 0a 0a 20 20 20 20  eTime.Now;..    
4730: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
4740: 72 73 2e 41 64 64 28 46 69 65 6c 64 31 29 3b 0a  rs.Add(Field1);.
4750: 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72 61          cmd.Para
4760: 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c 64  meters.Add(Field
4770: 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  2);.        cmd.
4780: 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46  Parameters.Add(F
4790: 69 65 6c 64 33 29 3b 0a 20 20 20 20 20 20 20 20  ield3);.        
47a0: 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e 41  cmd.Parameters.A
47b0: 64 64 28 46 69 65 6c 64 34 29 3b 0a 20 20 20 20  dd(Field4);.    
47c0: 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74 65      cmd.Paramete
47d0: 72 73 2e 41 64 64 28 46 69 65 6c 64 35 29 3b 0a  rs.Add(Field5);.
47e0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65  .        cmd.Exe
47f0: 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0a  cuteNonQuery();.
4800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
4810: 20 20 20 2f 2f 20 49 6e 73 65 72 74 73 20 62 69     // Inserts bi
4820: 6e 61 72 79 20 64 61 74 61 20 69 6e 74 6f 20 74  nary data into t
4830: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
4840: 67 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65  g a named parame
4850: 74 65 72 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ter.    internal
4860: 20 73 74 61 74 69 63 20 76 6f 69 64 20 42 69 6e   static void Bin
4870: 61 72 79 49 6e 73 65 72 74 28 44 62 43 6f 6e 6e  aryInsert(DbConn
4880: 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20 20 20 20  ection cnn).    
4890: 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  {.      using (D
48a0: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63  bCommand cmd = c
48b0: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
48c0: 28 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ()).      {.    
48d0: 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54      cmd.CommandT
48e0: 65 78 74 20 3d 20 22 49 4e 53 45 52 54 20 49 4e  ext = "INSERT IN
48f0: 54 4f 20 54 65 73 74 43 61 73 65 28 46 69 65 6c  TO TestCase(Fiel
4900: 64 36 29 20 56 41 4c 55 45 53 28 40 62 69 6e 29  d6) VALUES(@bin)
4910: 22 3b 0a 20 20 20 20 20 20 20 20 44 62 50 61 72  ";.        DbPar
4920: 61 6d 65 74 65 72 20 46 69 65 6c 64 36 20 3d 20  ameter Field6 = 
4930: 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65  cmd.CreateParame
4940: 74 65 72 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ter();..        
4950: 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20 62  byte[] b = new b
4960: 79 74 65 5b 34 30 30 30 5d 3b 0a 20 20 20 20 20  yte[4000];.     
4970: 20 20 20 62 5b 30 5d 20 3d 20 31 3b 0a 20 20 20     b[0] = 1;.   
4980: 20 20 20 20 20 62 5b 31 30 30 5d 20 3d 20 32 3b       b[100] = 2;
4990: 0a 20 20 20 20 20 20 20 20 62 5b 31 30 30 30 5d  .        b[1000]
49a0: 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 62 5b   = 3;.        b[
49b0: 32 30 30 30 5d 20 3d 20 34 3b 0a 20 20 20 20 20  2000] = 4;.     
49c0: 20 20 20 62 5b 33 30 30 30 5d 20 3d 20 35 3b 0a     b[3000] = 5;.
49d0: 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64 36 2e  .        Field6.
49e0: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  ParameterName = 
49f0: 22 40 62 69 6e 22 3b 0a 20 20 20 20 20 20 20 20  "@bin";.        
4a00: 46 69 65 6c 64 36 2e 56 61 6c 75 65 20 3d 20 62  Field6.Value = b
4a10: 3b 0a 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50  ;..        cmd.P
4a20: 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69  arameters.Add(Fi
4a30: 65 6c 64 36 29 3b 0a 0a 20 20 20 20 20 20 20 20  eld6);..        
4a40: 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75  cmd.ExecuteNonQu
4a50: 65 72 79 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ery();.      }. 
4a60: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
4a70: 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20 56  al static void V
4a80: 65 72 69 66 79 42 69 6e 61 72 79 44 61 74 61 28  erifyBinaryData(
4a90: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e  DbConnection cnn
4aa0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75 73  ).    {.      us
4ab0: 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63  ing (DbCommand c
4ac0: 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43  md = cnn.CreateC
4ad0: 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20 20  ommand()).      
4ae0: 7b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  {.        cmd.Co
4af0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
4b00: 45 43 54 20 46 69 65 6c 64 36 20 46 52 4f 4d 20  ECT Field6 FROM 
4b10: 54 65 73 74 43 61 73 65 20 57 48 45 52 45 20 46  TestCase WHERE F
4b20: 69 65 6c 64 36 20 49 53 20 4e 4f 54 20 4e 55 4c  ield6 IS NOT NUL
4b30: 4c 22 3b 0a 20 20 20 20 20 20 20 20 62 79 74 65  L";.        byte
4b40: 5b 5d 20 62 20 3d 20 6e 65 77 20 62 79 74 65 5b  [] b = new byte[
4b50: 34 30 30 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20  4000];..        
4b60: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
4b70: 64 65 72 20 72 64 20 3d 20 63 6d 64 2e 45 78 65  der rd = cmd.Exe
4b80: 63 75 74 65 52 65 61 64 65 72 28 29 29 0a 20 20  cuteReader()).  
4b90: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
4ba0: 20 20 69 66 20 28 72 64 2e 52 65 61 64 28 29 20    if (rd.Read() 
4bb0: 3d 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20  == false) throw 
4bc0: 6e 65 77 20 41 72 67 75 6d 65 6e 74 4f 75 74 4f  new ArgumentOutO
4bd0: 66 52 61 6e 67 65 45 78 63 65 70 74 69 6f 6e 28  fRangeException(
4be0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 72 64  );..          rd
4bf0: 2e 47 65 74 42 79 74 65 73 28 30 2c 20 30 2c 20  .GetBytes(0, 0, 
4c00: 62 2c 20 30 2c 20 34 30 30 30 29 3b 0a 0a 20 20  b, 0, 4000);..  
4c10: 20 20 20 20 20 20 20 20 69 66 20 28 62 5b 30 5d          if (b[0]
4c20: 20 21 3d 20 31 29 20 74 68 72 6f 77 20 6e 65 77   != 1) throw new
4c30: 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69   ArgumentExcepti
4c40: 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  on();.          
4c50: 69 66 20 28 62 5b 31 30 30 5d 20 21 3d 20 32 29  if (b[100] != 2)
4c60: 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d   throw new Argum
4c70: 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a  entException();.
4c80: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 5b            if (b[
4c90: 31 30 30 30 5d 20 21 3d 20 33 29 20 74 68 72 6f  1000] != 3) thro
4ca0: 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78  w new ArgumentEx
4cb0: 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20  ception();.     
4cc0: 20 20 20 20 20 69 66 20 28 62 5b 32 30 30 30 5d       if (b[2000]
4cd0: 20 21 3d 20 34 29 20 74 68 72 6f 77 20 6e 65 77   != 4) throw new
4ce0: 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69   ArgumentExcepti
4cf0: 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  on();.          
4d00: 69 66 20 28 62 5b 33 30 30 30 5d 20 21 3d 20 35  if (b[3000] != 5
4d10: 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75  ) throw new Argu
4d20: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  mentException();
4d30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4d40: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e   }.    }..    in
4d50: 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f  ternal static vo
4d60: 69 64 20 4c 6f 63 6b 54 65 73 74 28 44 62 43 6f  id LockTest(DbCo
4d70: 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20 20  nnection cnn).  
4d80: 20 20 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20    {.      using 
4d90: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d  (DbCommand cmd =
4da0: 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61   cnn.CreateComma
4db0: 6e 64 28 29 29 0a 20 20 20 20 20 20 7b 0a 20 20  nd()).      {.  
4dc0: 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e        cmd.Comman
4dd0: 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43 54 20  dText = "SELECT 
4de0: 46 69 65 6c 64 36 20 46 52 4f 4d 20 54 65 73 74  Field6 FROM Test
4df0: 43 61 73 65 20 57 48 45 52 45 20 46 69 65 6c 64  Case WHERE Field
4e00: 36 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 3b 0a  6 IS NOT NULL";.
4e10: 20 20 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62          byte[] b
4e20: 20 3d 20 6e 65 77 20 62 79 74 65 5b 34 30 30 30   = new byte[4000
4e30: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 75 73 69 6e  ];..        usin
4e40: 67 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20  g (DbDataReader 
4e50: 72 64 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65  rd = cmd.Execute
4e60: 52 65 61 64 65 72 28 29 29 0a 20 20 20 20 20 20  Reader()).      
4e70: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66    {.          if
4e80: 20 28 72 64 2e 52 65 61 64 28 29 20 3d 3d 20 66   (rd.Read() == f
4e90: 61 6c 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20  alse) throw new 
4ea0: 41 72 67 75 6d 65 6e 74 4f 75 74 4f 66 52 61 6e  ArgumentOutOfRan
4eb0: 67 65 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 0a  geException();..
4ec0: 20 20 20 20 20 20 20 20 20 20 72 64 2e 47 65 74            rd.Get
4ed0: 42 79 74 65 73 28 30 2c 20 30 2c 20 62 2c 20 30  Bytes(0, 0, b, 0
4ee0: 2c 20 34 30 30 30 29 3b 0a 0a 20 20 20 20 20 20  , 4000);..      
4ef0: 20 20 20 20 69 66 20 28 62 5b 30 5d 20 21 3d 20      if (b[0] != 
4f00: 31 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67  1) throw new Arg
4f10: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 29  umentException()
4f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ;.          if (
4f30: 62 5b 31 30 30 5d 20 21 3d 20 32 29 20 74 68 72  b[100] != 2) thr
4f40: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45  ow new ArgumentE
4f50: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20  xception();.    
4f60: 20 20 20 20 20 20 69 66 20 28 62 5b 31 30 30 30        if (b[1000
4f70: 5d 20 21 3d 20 33 29 20 74 68 72 6f 77 20 6e 65  ] != 3) throw ne
4f80: 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  w ArgumentExcept
4f90: 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ion();.         
4fa0: 20 69 66 20 28 62 5b 32 30 30 30 5d 20 21 3d 20   if (b[2000] != 
4fb0: 34 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67  4) throw new Arg
4fc0: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 29  umentException()
4fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ;.          if (
4fe0: 62 5b 33 30 30 30 5d 20 21 3d 20 35 29 20 74 68  b[3000] != 5) th
4ff0: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
5000: 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 0a 20 20  Exception();..  
5010: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
5020: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 6e  bConnection clon
5030: 65 20 3d 20 28 44 62 43 6f 6e 6e 65 63 74 69 6f  e = (DbConnectio
5040: 6e 29 28 28 49 43 6c 6f 6e 65 61 62 6c 65 29 63  n)((ICloneable)c
5050: 6e 6e 29 2e 43 6c 6f 6e 65 28 29 29 0a 20 20 20  nn).Clone()).   
5060: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
5070: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
5080: 6d 6d 61 6e 64 20 6e 65 77 63 6d 64 20 3d 20 63  mmand newcmd = c
5090: 6c 6f 6e 65 2e 43 72 65 61 74 65 43 6f 6d 6d 61  lone.CreateComma
50a0: 6e 64 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  nd()).          
50b0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
50c0: 20 20 6e 65 77 63 6d 64 2e 43 6f 6d 6d 61 6e 64    newcmd.Command
50d0: 54 65 78 74 20 3d 20 22 44 45 4c 45 54 45 20 46  Text = "DELETE F
50e0: 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57 48 45  ROM TestCase WHE
50f0: 52 45 20 46 69 65 6c 64 36 20 49 53 20 4e 55 4c  RE Field6 IS NUL
5100: 4c 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L";.            
5110: 20 20 6e 65 77 63 6d 64 2e 43 6f 6d 6d 61 6e 64    newcmd.Command
5120: 54 69 6d 65 6f 75 74 20 3d 20 32 3b 0a 20 20 20  Timeout = 2;.   
5130: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
5140: 6d 64 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f  mdStart = Enviro
5150: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b  nment.TickCount;
5160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
5170: 6e 74 20 63 6d 64 45 6e 64 3b 0a 0a 20 20 20 20  nt cmdEnd;..    
5180: 20 20 20 20 20 20 20 20 20 20 74 72 79 0a 20 20            try.  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
51b0: 77 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f 6e 51  wcmd.ExecuteNonQ
51c0: 75 65 72 79 28 29 3b 20 2f 2f 20 73 68 6f 75 6c  uery(); // shoul
51d0: 64 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 74  d fail because t
51e0: 68 65 72 65 27 73 20 61 20 72 65 61 64 65 72 20  here's a reader 
51f0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65  throw new Argume
5220: 6e 74 45 78 63 65 70 74 69 6f 6e 28 29 3b 20 2f  ntException(); /
5230: 2f 20 49 66 20 77 65 20 67 6f 74 20 68 65 72 65  / If we got here
5240: 2c 20 74 68 65 20 74 65 73 74 20 66 61 69 6c 65  , the test faile
5250: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
5260: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5270: 63 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  catch.          
5280: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
5290: 20 20 20 20 20 20 63 6d 64 45 6e 64 20 3d 20 45        cmdEnd = E
52a0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
52b0: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ount;.          
52c0: 20 20 20 20 20 20 69 66 20 28 63 6d 64 45 6e 64        if (cmdEnd
52d0: 20 2d 20 63 6d 64 53 74 61 72 74 20 3c 20 32 30   - cmdStart < 20
52e0: 30 30 20 7c 7c 20 63 6d 64 45 6e 64 20 2d 20 63  00 || cmdEnd - c
52f0: 6d 64 53 74 61 72 74 20 3e 20 33 30 30 30 29 0a  mdStart > 3000).
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75    throw new Argu
5320: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  mentException();
5330: 20 2f 2f 20 44 69 64 6e 27 74 20 77 61 69 74 20   // Didn't wait 
5340: 74 68 65 20 72 69 67 68 74 20 61 6d 6f 75 6e 74  the right amount
5350: 20 6f 66 20 74 69 6d 65 0a 0a 20 20 20 20 20 20   of time..      
5360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5380: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
53a0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63   internal static
53b0: 20 76 6f 69 64 20 50 61 72 61 6d 65 74 65 72 69   void Parameteri
53c0: 7a 65 64 49 6e 73 65 72 74 4d 69 73 73 69 6e 67  zedInsertMissing
53d0: 50 61 72 61 6d 73 28 44 62 43 6f 6e 6e 65 63 74  Params(DbConnect
53e0: 69 6f 6e 20 63 6e 6e 29 0a 20 20 20 20 7b 0a 20  ion cnn).    {. 
53f0: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 43 6f       using (DbCo
5400: 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63 6e 6e 2e  mmand cmd = cnn.
5410: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 29 29  CreateCommand())
5420: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
5430: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
5440: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
5450: 54 65 73 74 43 61 73 65 28 46 69 65 6c 64 31 2c  TestCase(Field1,
5460: 20 46 69 65 6c 64 32 2c 20 46 69 65 6c 64 33 2c   Field2, Field3,
5470: 20 46 69 65 6c 64 34 2c 20 46 69 65 6c 64 35 29   Field4, Field5)
5480: 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
5490: 3f 29 22 3b 0a 20 20 20 20 20 20 20 20 44 62 50  ?)";.        DbP
54a0: 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 31 20  arameter Field1 
54b0: 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61  = cmd.CreatePara
54c0: 6d 65 74 65 72 28 29 3b 0a 20 20 20 20 20 20 20  meter();.       
54d0: 20 44 62 50 61 72 61 6d 65 74 65 72 20 46 69 65   DbParameter Fie
54e0: 6c 64 32 20 3d 20 63 6d 64 2e 43 72 65 61 74 65  ld2 = cmd.Create
54f0: 50 61 72 61 6d 65 74 65 72 28 29 3b 0a 20 20 20  Parameter();.   
5500: 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65 72       DbParameter
5510: 20 46 69 65 6c 64 33 20 3d 20 63 6d 64 2e 43 72   Field3 = cmd.Cr
5520: 65 61 74 65 50 61 72 61 6d 65 74 65 72 28 29 3b  eateParameter();
5530: 0a 20 20 20 20 20 20 20 20 44 62 50 61 72 61 6d  .        DbParam
5540: 65 74 65 72 20 46 69 65 6c 64 34 20 3d 20 63 6d  eter Field4 = cm
5550: 64 2e 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  d.CreateParamete
5560: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 44 62 50  r();.        DbP
5570: 61 72 61 6d 65 74 65 72 20 46 69 65 6c 64 35 20  arameter Field5 
5580: 3d 20 63 6d 64 2e 43 72 65 61 74 65 50 61 72 61  = cmd.CreatePara
5590: 6d 65 74 65 72 28 29 3b 0a 0a 20 20 20 20 20 20  meter();..      
55a0: 20 20 46 69 65 6c 64 31 2e 44 62 54 79 70 65 20    Field1.DbType 
55b0: 3d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 44 62  = System.Data.Db
55c0: 54 79 70 65 2e 49 6e 74 33 32 3b 0a 0a 20 20 20  Type.Int32;..   
55d0: 20 20 20 20 20 46 69 65 6c 64 31 2e 56 61 6c 75       Field1.Valu
55e0: 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 46  e = 2;.        F
55f0: 69 65 6c 64 32 2e 56 61 6c 75 65 20 3d 20 33 2e  ield2.Value = 3.
5600: 31 34 31 35 39 3b 0a 20 20 20 20 20 20 20 20 46  14159;.        F
5610: 69 65 6c 64 33 2e 56 61 6c 75 65 20 3d 20 22 46  ield3.Value = "F
5620: 69 65 6c 64 33 20 50 61 72 61 6d 22 3b 0a 20 20  ield3 Param";.  
5630: 20 20 20 20 20 20 46 69 65 6c 64 34 2e 56 61 6c        Field4.Val
5640: 75 65 20 3d 20 22 46 69 65 6c 64 34 20 50 61 72  ue = "Field4 Par
5650: 22 3b 0a 20 20 20 20 20 20 20 20 46 69 65 6c 64  ";.        Field
5660: 35 2e 56 61 6c 75 65 20 3d 20 44 61 74 65 54 69  5.Value = DateTi
5670: 6d 65 2e 4e 6f 77 3b 0a 0a 20 20 20 20 20 20 20  me.Now;..       
5680: 20 63 6d 64 2e 50 61 72 61 6d 65 74 65 72 73 2e   cmd.Parameters.
5690: 41 64 64 28 46 69 65 6c 64 31 29 3b 0a 20 20 20  Add(Field1);.   
56a0: 20 20 20 20 20 63 6d 64 2e 50 61 72 61 6d 65 74       cmd.Paramet
56b0: 65 72 73 2e 41 64 64 28 46 69 65 6c 64 32 29 3b  ers.Add(Field2);
56c0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72  .        cmd.Par
56d0: 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c  ameters.Add(Fiel
56e0: 64 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6d 64  d3);.        cmd
56f0: 2e 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 28  .Parameters.Add(
5700: 46 69 65 6c 64 34 29 3b 0a 0a 20 20 20 20 20 20  Field4);..      
5710: 20 20 2f 2f 20 41 73 73 65 72 74 69 6f 6e 20 68    // Assertion h
5720: 65 72 65 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20  ere, not enough 
5730: 70 61 72 61 6d 65 74 65 72 73 0a 20 20 20 20 20  parameters.     
5740: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
5750: 6e 51 75 65 72 79 28 29 3b 0a 20 20 20 20 20 20  nQuery();.      
5760: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  }.    }..    // 
5770: 55 74 69 6c 69 7a 65 73 20 74 68 65 20 53 51 4c  Utilizes the SQL
5780: 69 74 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65  iteCommandBuilde
5790: 72 2c 20 0a 20 20 20 20 2f 2f 20 77 68 69 63 68  r, .    // which
57a0: 20 69 6e 20 74 75 72 6e 20 75 74 69 6c 69 7a 65   in turn utilize
57b0: 73 20 53 51 4c 69 74 65 44 61 74 61 52 65 61 64  s SQLiteDataRead
57c0: 65 72 27 73 20 47 65 74 53 63 68 65 6d 61 54 61  er's GetSchemaTa
57d0: 62 6c 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c  ble() functional
57e0: 69 74 79 0a 20 20 20 20 2f 2f 20 54 68 69 73 20  ity.    // This 
57f0: 69 6e 73 65 72 74 20 69 73 20 73 6c 6f 77 20 62  insert is slow b
5800: 65 63 61 75 73 65 20 69 74 20 6d 75 73 74 20 72  ecause it must r
5810: 61 69 73 65 20 63 61 6c 6c 62 61 63 6b 73 20 62  aise callbacks b
5820: 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65 72 20  efore and after 
5830: 65 76 65 72 79 20 75 70 64 61 74 65 2e 0a 20 20  every update..  
5840: 20 20 2f 2f 20 46 6f 72 20 61 20 66 61 73 74 20    // For a fast 
5850: 75 70 64 61 74 65 2c 20 73 65 65 20 74 68 65 20  update, see the 
5860: 46 61 73 74 49 6e 73 65 72 74 4d 61 6e 79 20 66  FastInsertMany f
5870: 75 6e 63 74 69 6f 6e 20 62 65 6e 65 61 74 68 20  unction beneath 
5880: 74 68 69 73 20 6f 6e 65 0a 20 20 20 20 69 6e 74  this one.    int
5890: 65 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f 69  ernal static voi
58a0: 64 20 44 61 74 61 41 64 61 70 74 65 72 28 44 62  d DataAdapter(Db
58b0: 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 20  ProviderFactory 
58c0: 66 61 63 74 2c 20 44 62 43 6f 6e 6e 65 63 74 69  fact, DbConnecti
58d0: 6f 6e 20 63 6e 6e 2c 20 62 6f 6f 6c 20 62 57 69  on cnn, bool bWi
58e0: 74 68 49 64 65 6e 74 69 74 79 29 0a 20 20 20 20  thIdentity).    
58f0: 7b 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44  {.      using (D
5900: 62 54 72 61 6e 73 61 63 74 69 6f 6e 20 64 62 54  bTransaction dbT
5910: 72 61 6e 73 20 3d 20 63 6e 6e 2e 42 65 67 69 6e  rans = cnn.Begin
5920: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 0a 20  Transaction()). 
5930: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
5940: 73 69 6e 67 20 28 44 62 44 61 74 61 41 64 61 70  sing (DbDataAdap
5950: 74 65 72 20 61 64 70 20 3d 20 66 61 63 74 2e 43  ter adp = fact.C
5960: 72 65 61 74 65 44 61 74 61 41 64 61 70 74 65 72  reateDataAdapter
5970: 28 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ()).        {.  
5980: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
5990: 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 20 3d 20 63  bCommand cmd = c
59a0: 6e 6e 2e 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  nn.CreateCommand
59b0: 28 29 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a  ()).          {.
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
59d0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 64 62  Transaction = db
59e0: 54 72 61 6e 73 3b 0a 20 20 20 20 20 20 20 20 20  Trans;.         
59f0: 20 20 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65     cmd.CommandTe
5a00: 78 74 20 3d 20 22 53 45 4c 45 43 54 20 2a 20 46  xt = "SELECT * F
5a10: 52 4f 4d 20 54 65 73 74 43 61 73 65 20 57 48 45  ROM TestCase WHE
5a20: 52 45 20 31 20 3d 20 32 22 3b 0a 20 20 20 20 20  RE 1 = 2";.     
5a30: 20 20 20 20 20 20 20 61 64 70 2e 53 65 6c 65 63         adp.Selec
5a40: 74 43 6f 6d 6d 61 6e 64 20 3d 20 63 6d 64 3b 0a  tCommand = cmd;.
5a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69  .            usi
5a60: 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 42 75 69  ng (DbCommandBui
5a70: 6c 64 65 72 20 62 6c 64 20 3d 20 66 61 63 74 2e  lder bld = fact.
5a80: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 42 75 69  CreateCommandBui
5a90: 6c 64 65 72 28 29 29 0a 20 20 20 20 20 20 20 20  lder()).        
5aa0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
5ab0: 20 20 20 20 62 6c 64 2e 44 61 74 61 41 64 61 70      bld.DataAdap
5ac0: 74 65 72 20 3d 20 61 64 70 3b 0a 20 20 20 20 20  ter = adp;.     
5ad0: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
5ae0: 61 64 70 2e 49 6e 73 65 72 74 43 6f 6d 6d 61 6e  adp.InsertComman
5af0: 64 20 3d 20 28 44 62 43 6f 6d 6d 61 6e 64 29 28  d = (DbCommand)(
5b00: 28 49 43 6c 6f 6e 65 61 62 6c 65 29 62 6c 64 2e  (ICloneable)bld.
5b10: 47 65 74 49 6e 73 65 72 74 43 6f 6d 6d 61 6e 64  GetInsertCommand
5b20: 28 29 29 2e 43 6c 6f 6e 65 28 29 29 0a 20 20 20  ()).Clone()).   
5b30: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5b50: 28 62 57 69 74 68 49 64 65 6e 74 69 74 79 29 0a  (bWithIdentity).
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5b80: 20 20 20 20 61 64 70 2e 49 6e 73 65 72 74 43 6f      adp.InsertCo
5b90: 6d 6d 61 6e 64 2e 43 6f 6d 6d 61 6e 64 54 65 78  mmand.CommandTex
5ba0: 74 20 2b 3d 20 22 3b 53 45 4c 45 43 54 20 6c 61  t += ";SELECT la
5bb0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
5bc0: 29 20 41 53 20 5b 49 44 5d 22 3b 0a 20 20 20 20  ) AS [ID]";.    
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
5be0: 70 2e 49 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 2e  p.InsertCommand.
5bf0: 55 70 64 61 74 65 64 52 6f 77 53 6f 75 72 63 65  UpdatedRowSource
5c00: 20 3d 20 55 70 64 61 74 65 52 6f 77 53 6f 75 72   = UpdateRowSour
5c10: 63 65 2e 46 69 72 73 74 52 65 74 75 72 6e 65 64  ce.FirstReturned
5c20: 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
5c30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5c40: 20 20 20 20 20 20 20 20 20 20 62 6c 64 2e 44 61            bld.Da
5c50: 74 61 41 64 61 70 74 65 72 20 3d 20 6e 75 6c 6c  taAdapter = null
5c60: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
5c70: 20 20 20 75 73 69 6e 67 20 28 44 61 74 61 54 61     using (DataTa
5c80: 62 6c 65 20 74 62 6c 20 3d 20 6e 65 77 20 44 61  ble tbl = new Da
5c90: 74 61 54 61 62 6c 65 28 29 29 0a 20 20 20 20 20  taTable()).     
5ca0: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5cc0: 64 70 2e 46 69 6c 6c 28 74 62 6c 29 3b 0a 20 20  dp.Fill(tbl);.  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20  for (int n = 0; 
5cf0: 6e 20 3c 20 31 30 30 30 30 3b 20 6e 2b 2b 29 0a  n < 10000; n++).
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
5d20: 20 20 20 20 20 20 20 20 44 61 74 61 52 6f 77 20          DataRow 
5d30: 72 6f 77 20 3d 20 74 62 6c 2e 4e 65 77 52 6f 77  row = tbl.NewRow
5d40: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
5d50: 20 20 20 20 20 20 20 20 72 6f 77 5b 31 5d 20 3d          row[1] =
5d60: 20 6e 20 2b 20 28 35 30 30 30 30 20 2a 20 28 28   n + (50000 * ((
5d70: 62 57 69 74 68 49 64 65 6e 74 69 74 79 20 3d 3d  bWithIdentity ==
5d80: 20 74 72 75 65 29 20 3f 20 32 20 3a 20 31 29 29   true) ? 2 : 1))
5d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5da0: 20 20 20 20 20 20 74 62 6c 2e 52 6f 77 73 2e 41        tbl.Rows.A
5db0: 64 64 28 72 6f 77 29 3b 0a 20 20 20 20 20 20 20  dd(row);.       
5dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
5df0: 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  e(String.Format(
5e00: 22 20 20 20 20 20 20 20 20 20 20 49 6e 73 65 72  "          Inser
5e10: 74 69 6e 67 20 75 73 69 6e 67 20 43 6f 6d 6d 61  ting using Comma
5e20: 6e 64 42 75 69 6c 64 65 72 20 61 6e 64 20 44 61  ndBuilder and Da
5e30: 74 61 41 64 61 70 74 65 72 5c 72 5c 6e 20 20 20  taAdapter\r\n   
5e40: 20 20 20 20 20 20 20 2d 3e 7b 30 7d 20 28 31 30         ->{0} (10
5e50: 2c 30 30 30 20 72 6f 77 73 29 20 2e 2e 2e 22 2c  ,000 rows) ...",
5e60: 20 28 62 57 69 74 68 49 64 65 6e 74 69 74 79 20   (bWithIdentity 
5e70: 3d 3d 20 74 72 75 65 29 20 3f 20 22 28 77 69 74  == true) ? "(wit
5e80: 68 20 69 64 65 6e 74 69 74 79 20 66 65 74 63 68  h identity fetch
5e90: 29 22 20 3a 20 22 22 29 29 3b 0a 20 20 20 20 20  )" : ""));.     
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
5eb0: 20 64 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72   dtStart = Envir
5ec0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
5ed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5ee0: 20 20 20 20 61 64 70 2e 55 70 64 61 74 65 28 74      adp.Update(t
5ef0: 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  bl);.           
5f00: 20 20 20 20 20 20 20 69 6e 74 20 64 74 45 6e 64         int dtEnd
5f10: 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54   = Environment.T
5f20: 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20  ickCount;.      
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 64 74 45 6e              dtEn
5f40: 64 20 2d 3d 20 64 74 53 74 61 72 74 3b 0a 20 20  d -= dtStart;.  
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 53 74  Console.Write(St
5f70: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 20 20 20  ring.Format("   
5f80: 20 20 20 20 20 20 20 2d 3e 20 49 6e 73 65 72 74         -> Insert
5f90: 20 45 6e 64 73 20 69 6e 20 7b 30 7d 20 6d 73 20   Ends in {0} ms 
5fa0: 2e 2e 2e 20 22 2c 20 28 64 74 45 6e 64 29 29 29  ... ", (dtEnd)))
5fb0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
5fc0: 20 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45       dtStart = E
5fd0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
5fe0: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ount;.          
5ff0: 20 20 20 20 20 20 20 20 64 62 54 72 61 6e 73 2e          dbTrans.
6000: 43 6f 6d 6d 69 74 28 29 3b 0a 20 20 20 20 20 20  Commit();.      
6010: 20 20 20 20 20 20 20 20 20 20 20 20 64 74 45 6e              dtEn
6020: 64 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e  d = Environment.
6030: 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20 20 20  TickCount;.     
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 45               dtE
6050: 6e 64 20 2d 3d 20 64 74 53 74 61 72 74 3b 0a 20  nd -= dtStart;. 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
6080: 6e 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ne(String.Format
6090: 28 22 43 6f 6d 6d 69 74 73 20 69 6e 20 7b 30 7d  ("Commits in {0}
60a0: 20 6d 73 22 2c 20 28 64 74 45 6e 64 29 29 29 3b   ms", (dtEnd)));
60b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
60c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
60d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
60e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
60f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6100: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
6110: 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20 46  al static void F
6120: 61 73 74 49 6e 73 65 72 74 4d 61 6e 79 28 44 62  astInsertMany(Db
6130: 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a  Connection cnn).
6140: 20 20 20 20 7b 0a 20 20 20 20 20 20 75 73 69 6e      {.      usin
6150: 67 20 28 44 62 54 72 61 6e 73 61 63 74 69 6f 6e  g (DbTransaction
6160: 20 64 62 54 72 61 6e 73 20 3d 20 63 6e 6e 2e 42   dbTrans = cnn.B
6170: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
6180: 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  )).      {.     
6190: 20 20 20 69 6e 74 20 64 74 53 74 61 72 74 3b 0a     int dtStart;.
61a0: 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 45 6e          int dtEn
61b0: 64 3b 0a 0a 20 20 20 20 20 20 20 20 75 73 69 6e  d;..        usin
61c0: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
61d0: 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d   = cnn.CreateCom
61e0: 6d 61 6e 64 28 29 29 0a 20 20 20 20 20 20 20 20  mand()).        
61f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
6200: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 49  CommandText = "I
6210: 4e 53 45 52 54 20 49 4e 54 4f 20 54 65 73 74 43  NSERT INTO TestC
6220: 61 73 65 28 46 69 65 6c 64 31 29 20 56 41 4c 55  ase(Field1) VALU
6230: 45 53 28 3f 29 22 3b 0a 20 20 20 20 20 20 20 20  ES(?)";.        
6240: 20 20 44 62 50 61 72 61 6d 65 74 65 72 20 46 69    DbParameter Fi
6250: 65 6c 64 31 20 3d 20 63 6d 64 2e 43 72 65 61 74  eld1 = cmd.Creat
6260: 65 50 61 72 61 6d 65 74 65 72 28 29 3b 0a 0a 20  eParameter();.. 
6270: 20 20 20 20 20 20 20 20 20 63 6d 64 2e 50 61 72           cmd.Par
6280: 61 6d 65 74 65 72 73 2e 41 64 64 28 46 69 65 6c  ameters.Add(Fiel
6290: 64 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d1);..          
62a0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
62b0: 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  e(String.Format(
62c0: 22 20 20 20 20 20 20 20 20 20 20 46 61 73 74 20  "          Fast 
62d0: 69 6e 73 65 72 74 20 75 73 69 6e 67 20 70 61 72  insert using par
62e0: 61 6d 65 74 65 72 73 20 61 6e 64 20 70 72 65 70  ameters and prep
62f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 5c 72  ared statement\r
6300: 5c 6e 20 20 20 20 20 20 20 20 20 20 2d 3e 20 28  \n          -> (
6310: 31 30 30 2c 30 30 30 20 72 6f 77 73 29 20 42 65  100,000 rows) Be
6320: 67 69 6e 73 20 2e 2e 2e 20 22 29 29 3b 0a 20 20  gins ... "));.  
6330: 20 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20          dtStart 
6340: 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
6350: 63 6b 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20  ckCount;.       
6360: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
6370: 30 3b 20 6e 20 3c 20 31 30 30 30 30 30 3b 20 6e  0; n < 100000; n
6380: 2b 2b 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a  ++).          {.
6390: 20 20 20 20 20 20 20 20 20 20 20 20 46 69 65 6c              Fiel
63a0: 64 31 2e 56 61 6c 75 65 20 3d 20 6e 20 2b 20 32  d1.Value = n + 2
63b0: 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20 20 20  00000;.         
63c0: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
63d0: 6e 51 75 65 72 79 28 29 3b 0a 20 20 20 20 20 20  nQuery();.      
63e0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
63f0: 20 64 74 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e   dtEnd = Environ
6400: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a  ment.TickCount;.
6410: 20 20 20 20 20 20 20 20 20 20 64 74 45 6e 64 20            dtEnd 
6420: 2d 3d 20 64 74 53 74 61 72 74 3b 0a 20 20 20 20  -= dtStart;.    
6430: 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72        Console.Wr
6440: 69 74 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ite(String.Forma
6450: 74 28 22 20 20 20 20 20 20 20 20 20 20 2d 3e 20  t("          -> 
6460: 45 6e 64 73 20 69 6e 20 7b 30 7d 20 6d 73 20 2e  Ends in {0} ms .
6470: 2e 2e 20 22 2c 20 28 64 74 45 6e 64 29 29 29 3b  .. ", (dtEnd)));
6480: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
6490: 20 20 20 20 64 74 53 74 61 72 74 20 3d 20 45 6e      dtStart = En
64a0: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
64b0: 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62 54  unt;.        dbT
64c0: 72 61 6e 73 2e 43 6f 6d 6d 69 74 28 29 3b 0a 20  rans.Commit();. 
64d0: 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45         dtEnd = E
64e0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
64f0: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 74  ount;.        dt
6500: 45 6e 64 20 2d 3d 20 64 74 53 74 61 72 74 3b 0a  End -= dtStart;.
6510: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
6520: 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67  WriteLine(String
6530: 2e 46 6f 72 6d 61 74 28 22 43 6f 6d 6d 69 74 73  .Format("Commits
6540: 20 69 6e 20 7b 30 7d 20 6d 73 22 2c 20 28 64 74   in {0} ms", (dt
6550: 45 6e 64 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  End)));.      }.
6560: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 43 61      }..    // Ca
6570: 75 73 65 73 20 74 68 65 20 75 73 65 72 2d 64 65  uses the user-de
6580: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 74  fined function t
6590: 6f 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 20 20  o be called.    
65a0: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20  internal static 
65b0: 76 6f 69 64 20 55 73 65 72 46 75 6e 63 74 69 6f  void UserFunctio
65c0: 6e 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  n(DbConnection c
65d0: 6e 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nn).    {.      
65e0: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
65f0: 20 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74   cmd = cnn.Creat
6600: 65 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20  eCommand()).    
6610: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
6620: 6e 54 69 6d 65 73 3b 0a 20 20 20 20 20 20 20 20  nTimes;.        
6630: 69 6e 74 20 64 74 53 74 61 72 74 3b 0a 0a 20 20  int dtStart;..  
6640: 20 20 20 20 20 20 6e 54 69 6d 65 73 20 3d 20 30        nTimes = 0
6650: 3b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ;.        cmd.Co
6660: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
6670: 45 43 54 20 46 6f 6f 28 27 65 65 27 2c 27 66 6f  ECT Foo('ee','fo
6680: 6f 27 29 22 3b 0a 20 20 20 20 20 20 20 20 64 74  o')";.        dt
6690: 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d  Start = Environm
66a0: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20  ent.TickCount;. 
66b0: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e         while (En
66c0: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
66d0: 75 6e 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20  unt - dtStart < 
66e0: 31 30 30 30 29 0a 20 20 20 20 20 20 20 20 7b 0a  1000).        {.
66f0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78            cmd.Ex
6700: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b  ecuteNonQuery();
6710: 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69 6d 65  .          nTime
6720: 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  s++;.        }. 
6730: 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57         Console.W
6740: 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67 2e  riteLine(String.
6750: 46 6f 72 6d 61 74 28 22 20 20 20 20 20 20 20 20  Format("        
6760: 20 20 55 73 65 72 20 28 74 65 78 74 29 20 20 63    User (text)  c
6770: 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20  ommand executed 
6780: 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73  {0} times in 1 s
6790: 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29  econd.", nTimes)
67a0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 6e 54 69 6d  );..        nTim
67b0: 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
67c0: 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  cmd.CommandText 
67d0: 3d 20 22 53 45 4c 45 43 54 20 46 6f 6f 28 31 30  = "SELECT Foo(10
67e0: 2c 31 31 29 22 3b 0a 20 20 20 20 20 20 20 20 64  ,11)";.        d
67f0: 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e  tStart = Environ
6800: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a  ment.TickCount;.
6810: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 45          while (E
6820: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
6830: 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74 20 3c  ount - dtStart <
6840: 20 31 30 30 30 29 0a 20 20 20 20 20 20 20 20 7b   1000).        {
6850: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45  .          cmd.E
6860: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
6870: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69 6d  ;.          nTim
6880: 65 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  es++;.        }.
6890: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
68a0: 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67  WriteLine(String
68b0: 2e 46 6f 72 6d 61 74 28 22 20 20 20 20 20 20 20  .Format("       
68c0: 20 20 20 55 73 65 72 46 75 6e 63 74 69 6f 6e 20     UserFunction 
68d0: 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64  command executed
68e0: 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
68f0: 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73  second.", nTimes
6900: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6e 54 69  ));..        nTi
6910: 6d 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mes = 0;.       
6920: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
6930: 20 3d 20 22 53 45 4c 45 43 54 20 41 42 53 28 31   = "SELECT ABS(1
6940: 29 22 3b 0a 20 20 20 20 20 20 20 20 64 74 53 74  )";.        dtSt
6950: 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e  art = Environmen
6960: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20  t.TickCount;.   
6970: 20 20 20 20 20 77 68 69 6c 65 20 28 45 6e 76 69       while (Envi
6980: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
6990: 74 20 2d 20 64 74 53 74 61 72 74 20 3c 20 31 30  t - dtStart < 10
69a0: 30 30 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  00).        {.  
69b0: 20 20 20 20 20 20 20 20 63 6d 64 2e 45 78 65 63          cmd.Exec
69c0: 75 74 65 4e 6f 6e 51 75 65 72 79 28 29 3b 0a 20  uteNonQuery();. 
69d0: 20 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73 2b           nTimes+
69e0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
69f0: 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69       Console.Wri
6a00: 74 65 4c 69 6e 65 28 53 74 72 69 6e 67 2e 46 6f  teLine(String.Fo
6a10: 72 6d 61 74 28 22 20 20 20 20 20 20 20 20 20 20  rmat("          
6a20: 49 6e 74 72 69 6e 73 69 63 20 20 20 20 63 6f 6d  Intrinsic    com
6a30: 6d 61 6e 64 20 65 78 65 63 75 74 65 64 20 7b 30  mand executed {0
6a40: 7d 20 74 69 6d 65 73 20 69 6e 20 31 20 73 65 63  } times in 1 sec
6a50: 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73 29 29 3b  ond.", nTimes));
6a60: 0a 0a 20 20 20 20 20 20 20 20 6e 54 69 6d 65 73  ..        nTimes
6a70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6d   = 0;.        cm
6a80: 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20  d.CommandText = 
6a90: 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 27 46  "SELECT lower('F
6aa0: 4f 4f 27 29 22 3b 0a 20 20 20 20 20 20 20 20 64  OO')";.        d
6ab0: 74 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e  tStart = Environ
6ac0: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a  ment.TickCount;.
6ad0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 45          while (E
6ae0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
6af0: 6f 75 6e 74 20 2d 20 64 74 53 74 61 72 74 20 3c  ount - dtStart <
6b00: 20 31 30 30 30 29 0a 20 20 20 20 20 20 20 20 7b   1000).        {
6b10: 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 45  .          cmd.E
6b20: 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 29  xecuteNonQuery()
6b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54 69 6d  ;.          nTim
6b40: 65 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  es++;.        }.
6b50: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
6b60: 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67  WriteLine(String
6b70: 2e 46 6f 72 6d 61 74 28 22 20 20 20 20 20 20 20  .Format("       
6b80: 20 20 20 49 6e 74 72 69 6e 20 28 74 78 74 29 20     Intrin (txt) 
6b90: 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74 65 64  command executed
6ba0: 20 7b 30 7d 20 74 69 6d 65 73 20 69 6e 20 31 20   {0} times in 1 
6bb0: 73 65 63 6f 6e 64 2e 22 2c 20 6e 54 69 6d 65 73  second.", nTimes
6bc0: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6e 54 69  ));..        nTi
6bd0: 6d 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mes = 0;.       
6be0: 20 63 6d 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74   cmd.CommandText
6bf0: 20 3d 20 22 53 45 4c 45 43 54 20 31 22 3b 0a 20   = "SELECT 1";. 
6c00: 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20 3d         dtStart =
6c10: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63   Environment.Tic
6c20: 6b 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20  kCount;.        
6c30: 77 68 69 6c 65 20 28 45 6e 76 69 72 6f 6e 6d 65  while (Environme
6c40: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 64  nt.TickCount - d
6c50: 74 53 74 61 72 74 20 3c 20 31 30 30 30 29 0a 20  tStart < 1000). 
6c60: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
6c70: 20 20 20 63 6d 64 2e 45 78 65 63 75 74 65 4e 6f     cmd.ExecuteNo
6c80: 6e 51 75 65 72 79 28 29 3b 0a 20 20 20 20 20 20  nQuery();.      
6c90: 20 20 20 20 6e 54 69 6d 65 73 2b 2b 3b 0a 20 20      nTimes++;.  
6ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6cb0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
6cc0: 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  e(String.Format(
6cd0: 22 20 20 20 20 20 20 20 20 20 20 52 61 77 20 56  "          Raw V
6ce0: 61 6c 75 65 20 20 20 20 63 6f 6d 6d 61 6e 64 20  alue    command 
6cf0: 65 78 65 63 75 74 65 64 20 7b 30 7d 20 74 69 6d  executed {0} tim
6d00: 65 73 20 69 6e 20 31 20 73 65 63 6f 6e 64 2e 22  es in 1 second."
6d10: 2c 20 6e 54 69 6d 65 73 29 29 3b 0a 20 20 20 20  , nTimes));.    
6d20: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
6d30: 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 76  nternal static v
6d40: 6f 69 64 20 49 74 65 72 61 74 69 6f 6e 54 65 73  oid IterationTes
6d50: 74 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  t(DbConnection c
6d60: 6e 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nn).    {.      
6d70: 75 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64  using (DbCommand
6d80: 20 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74   cmd = cnn.Creat
6d90: 65 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20  eCommand()).    
6da0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
6db0: 64 74 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  dtStart;.       
6dc0: 20 69 6e 74 20 64 74 45 6e 64 3b 0a 20 20 20 20   int dtEnd;.    
6dd0: 20 20 20 20 69 6e 74 20 6e 43 6f 75 6e 74 3b 0a      int nCount;.
6de0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6e 3b 0a          long n;.
6df0: 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d  .        cmd.Com
6e00: 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45  mandText = "SELE
6e10: 43 54 20 46 6f 6f 28 49 44 2c 20 49 44 29 20 46  CT Foo(ID, ID) F
6e20: 52 4f 4d 20 54 65 73 74 43 61 73 65 22 3b 0a 20  ROM TestCase";. 
6e30: 20 20 20 20 20 20 20 63 6d 64 2e 50 72 65 70 61         cmd.Prepa
6e40: 72 65 28 29 3b 0a 20 20 20 20 20 20 20 20 64 74  re();.        dt
6e50: 53 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d  Start = Environm
6e60: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20  ent.TickCount;. 
6e70: 20 20 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20         nCount = 
6e80: 30 3b 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  0;.        using
6e90: 20 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72   (DbDataReader r
6ea0: 64 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52  d = cmd.ExecuteR
6eb0: 65 61 64 65 72 28 29 29 0a 20 20 20 20 20 20 20  eader()).       
6ec0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69   {.          whi
6ed0: 6c 65 20 28 72 64 2e 52 65 61 64 28 29 29 0a 20  le (rd.Read()). 
6ee0: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
6ef0: 20 20 20 20 20 20 20 6e 20 3d 20 72 64 2e 47 65         n = rd.Ge
6f00: 74 49 6e 74 36 34 28 30 29 3b 0a 20 20 20 20 20  tInt64(0);.     
6f10: 20 20 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b         nCount++;
6f20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6f30: 20 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45         dtEnd = E
6f40: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
6f50: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ount;.        }.
6f60: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
6f70: 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67  WriteLine(String
6f80: 2e 46 6f 72 6d 61 74 28 22 20 20 20 20 20 20 20  .Format("       
6f90: 20 20 20 55 73 65 72 20 46 75 6e 63 74 69 6f 6e     User Function
6fa0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 7b 30   iteration of {0
6fb0: 7d 20 72 65 63 6f 72 64 73 20 69 6e 20 7b 31 7d  } records in {1}
6fc0: 20 6d 73 22 2c 20 6e 43 6f 75 6e 74 2c 20 28 64   ms", nCount, (d
6fd0: 74 45 6e 64 20 2d 20 64 74 53 74 61 72 74 29 29  tEnd - dtStart))
6fe0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  );..        cmd.
6ff0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
7000: 45 4c 45 43 54 20 49 44 20 46 52 4f 4d 20 54 65  ELECT ID FROM Te
7010: 73 74 43 61 73 65 22 3b 0a 20 20 20 20 20 20 20  stCase";.       
7020: 20 63 6d 64 2e 50 72 65 70 61 72 65 28 29 3b 0a   cmd.Prepare();.
7030: 20 20 20 20 20 20 20 20 64 74 53 74 61 72 74 20          dtStart 
7040: 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69  = Environment.Ti
7050: 63 6b 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20  ckCount;.       
7060: 20 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20   nCount = 0;.   
7070: 20 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61       using (DbDa
7080: 74 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d  taReader rd = cm
7090: 64 2e 45 78 65 63 75 74 65 52 65 61 64 65 72 28  d.ExecuteReader(
70a0: 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  )).        {.   
70b0: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 72 64         while (rd
70c0: 2e 52 65 61 64 28 29 29 0a 20 20 20 20 20 20 20  .Read()).       
70d0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
70e0: 20 6e 20 3d 20 72 64 2e 47 65 74 49 6e 74 36 34   n = rd.GetInt64
70f0: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (0);.           
7100: 20 6e 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20   nCount++;.     
7110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7120: 20 64 74 45 6e 64 20 3d 20 45 6e 76 69 72 6f 6e   dtEnd = Environ
7130: 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a  ment.TickCount;.
7140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7150: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c    Console.WriteL
7160: 69 6e 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ine(String.Forma
7170: 74 28 22 20 20 20 20 20 20 20 20 20 20 52 61 77  t("          Raw
7180: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 7b 30   iteration of {0
7190: 7d 20 72 65 63 6f 72 64 73 20 69 6e 20 7b 31 7d  } records in {1}
71a0: 20 6d 73 22 2c 20 6e 43 6f 75 6e 74 2c 20 28 64   ms", nCount, (d
71b0: 74 45 6e 64 20 2d 20 64 74 53 74 61 72 74 29 29  tEnd - dtStart))
71c0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 63 6d 64 2e  );..        cmd.
71d0: 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53  CommandText = "S
71e0: 45 4c 45 43 54 20 41 42 53 28 49 44 29 20 46 52  ELECT ABS(ID) FR
71f0: 4f 4d 20 54 65 73 74 43 61 73 65 22 3b 0a 20 20  OM TestCase";.  
7200: 20 20 20 20 20 20 63 6d 64 2e 50 72 65 70 61 72        cmd.Prepar
7210: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 64 74 53  e();.        dtS
7220: 74 61 72 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65  tart = Environme
7230: 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20  nt.TickCount;.  
7240: 20 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 30        nCount = 0
7250: 3b 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67 20  ;.        using 
7260: 28 44 62 44 61 74 61 52 65 61 64 65 72 20 72 64  (DbDataReader rd
7270: 20 3d 20 63 6d 64 2e 45 78 65 63 75 74 65 52 65   = cmd.ExecuteRe
7280: 61 64 65 72 28 29 29 0a 20 20 20 20 20 20 20 20  ader()).        
7290: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
72a0: 65 20 28 72 64 2e 52 65 61 64 28 29 29 0a 20 20  e (rd.Read()).  
72b0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
72c0: 20 20 20 20 20 20 6e 20 3d 20 72 64 2e 47 65 74        n = rd.Get
72d0: 49 6e 74 36 34 28 30 29 3b 0a 20 20 20 20 20 20  Int64(0);.      
72e0: 20 20 20 20 20 20 6e 43 6f 75 6e 74 2b 2b 3b 0a        nCount++;.
72f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7300: 20 20 20 20 20 20 64 74 45 6e 64 20 3d 20 45 6e        dtEnd = En
7310: 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f  vironment.TickCo
7320: 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  unt;.        }. 
7330: 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57         Console.W
7340: 72 69 74 65 4c 69 6e 65 28 53 74 72 69 6e 67 2e  riteLine(String.
7350: 46 6f 72 6d 61 74 28 22 20 20 20 20 20 20 20 20  Format("        
7360: 20 20 49 6e 74 72 69 6e 73 69 63 20 46 75 6e 63    Intrinsic Func
7370: 74 69 6f 6e 20 69 74 65 72 61 74 69 6f 6e 20 6f  tion iteration o
7380: 66 20 7b 30 7d 20 72 65 63 6f 72 64 73 20 69 6e  f {0} records in
7390: 20 7b 31 7d 20 6d 73 22 2c 20 6e 43 6f 75 6e 74   {1} ms", nCount
73a0: 2c 20 28 64 74 45 6e 64 20 2d 20 64 74 53 74 61  , (dtEnd - dtSta
73b0: 72 74 29 29 29 3b 0a 0a 20 20 20 20 20 20 7d 0a  rt)));..      }.
73c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 4f 70      }..    // Op
73d0: 65 6e 20 61 20 72 65 61 64 65 72 20 61 6e 64 20  en a reader and 
73e0: 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
73f0: 77 72 69 74 65 20 74 6f 20 74 65 73 74 20 74 68  write to test th
7400: 65 20 77 72 69 74 65 72 27 73 20 63 6f 6d 6d 61  e writer's comma
7410: 6e 64 20 74 69 6d 65 6f 75 74 20 70 72 6f 70 65  nd timeout prope
7420: 72 74 79 0a 20 20 20 20 2f 2f 20 53 51 4c 69 74  rty.    // SQLit
7430: 65 20 64 6f 65 73 6e 27 74 20 61 6c 6c 6f 77 20  e doesn't allow 
7440: 61 20 77 72 69 74 65 20 77 68 65 6e 20 61 20 72  a write when a r
7450: 65 61 64 65 72 20 69 73 20 61 63 74 69 76 65 2e  eader is active.
7460: 0a 20 20 20 20 2f 2f 20 2a 2a 2a 20 4e 4f 54 45  .    // *** NOTE
7470: 20 41 53 20 4f 46 20 33 2e 33 2e 38 20 74 68 69   AS OF 3.3.8 thi
7480: 73 20 74 65 73 74 20 6e 6f 20 6c 6f 6e 67 65 72  s test no longer
7490: 20 62 6c 6f 63 6b 73 20 62 65 63 61 75 73 65 20   blocks because 
74a0: 53 51 4c 69 74 65 20 6e 6f 77 20 61 6c 6c 6f 77  SQLite now allow
74b0: 73 20 79 6f 75 20 74 6f 20 75 70 64 61 74 65 20  s you to update 
74c0: 74 61 62 6c 65 28 73 29 0a 20 20 20 20 2f 2f 20  table(s).    // 
74d0: 77 68 69 6c 65 20 61 20 72 65 61 64 65 72 20 69  while a reader i
74e0: 73 20 61 63 74 69 76 65 20 6f 6e 20 74 68 65 20  s active on the 
74f0: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
7500: 20 20 54 68 65 72 65 66 6f 72 65 20 74 68 65 20    Therefore the 
7510: 74 69 6d 65 6f 75 74 20 74 65 73 74 20 69 73 20  timeout test is 
7520: 69 6e 76 61 6c 69 64 0a 20 20 20 20 69 6e 74 65  invalid.    inte
7530: 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64  rnal static void
7540: 20 54 69 6d 65 6f 75 74 54 65 73 74 28 44 62 43   TimeoutTest(DbC
7550: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a 20  onnection cnn). 
7560: 20 20 20 7b 0a 20 20 20 20 20 20 75 73 69 6e 67     {.      using
7570: 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 52   (DbCommand cmdR
7580: 65 61 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65  ead = cnn.Create
7590: 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20  Command()).     
75a0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6d 64 52 65   {.        cmdRe
75b0: 61 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20 3d  ad.CommandText =
75c0: 20 22 53 45 4c 45 43 54 20 49 44 20 46 52 4f 4d   "SELECT ID FROM
75d0: 20 54 65 73 74 43 61 73 65 22 3b 0a 20 20 20 20   TestCase";.    
75e0: 20 20 20 20 75 73 69 6e 67 20 28 44 62 44 61 74      using (DbDat
75f0: 61 52 65 61 64 65 72 20 72 64 20 3d 20 63 6d 64  aReader rd = cmd
7600: 52 65 61 64 2e 45 78 65 63 75 74 65 52 65 61 64  Read.ExecuteRead
7610: 65 72 28 29 29 0a 20 20 20 20 20 20 20 20 7b 0a  er()).        {.
7620: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
7630: 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64 77 72  (DbCommand cmdwr
7640: 69 74 65 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65  ite = cnn.Create
7650: 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20  Command()).     
7660: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
7670: 20 20 20 63 6d 64 77 72 69 74 65 2e 43 6f 6d 6d     cmdwrite.Comm
7680: 61 6e 64 54 65 78 74 20 3d 20 22 55 50 44 41 54  andText = "UPDAT
7690: 45 20 5b 4b 65 79 49 6e 66 6f 54 65 73 74 5d 20  E [KeyInfoTest] 
76a0: 53 45 54 20 5b 49 44 5d 20 3d 20 5b 49 44 5d 22  SET [ID] = [ID]"
76b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6d  ;.            cm
76c0: 64 77 72 69 74 65 2e 43 6f 6d 6d 61 6e 64 54 69  dwrite.CommandTi
76d0: 6d 65 6f 75 74 20 3d 20 35 3b 0a 0a 20 20 20 20  meout = 5;..    
76e0: 20 20 20 20 20 20 20 20 69 6e 74 20 64 77 74 69          int dwti
76f0: 63 6b 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  ck = Environment
7700: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20 20  .TickCount;.    
7710: 20 20 20 20 20 20 20 20 74 72 79 0a 20 20 20 20          try.    
7720: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
7730: 20 20 20 20 20 20 20 20 63 6d 64 77 72 69 74 65          cmdwrite
7740: 2e 45 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79  .ExecuteNonQuery
7750: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
7760: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  }.            ca
7770: 74 63 68 20 28 53 51 4c 69 74 65 45 78 63 65 70  tch (SQLiteExcep
7780: 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 20 20  tion).          
7790: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
77a0: 20 20 64 77 74 69 63 6b 20 3d 20 28 45 6e 76 69    dwtick = (Envi
77b0: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
77c0: 74 20 2d 20 64 77 74 69 63 6b 29 20 2f 20 31 30  t - dwtick) / 10
77d0: 30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  00;.            
77e0: 20 20 69 66 20 28 64 77 74 69 63 6b 20 3c 20 35    if (dwtick < 5
77f0: 20 7c 7c 20 64 77 74 69 63 6b 20 3e 20 36 29 0a   || dwtick > 6).
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7810: 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65  throw new Argume
7820: 6e 74 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65  ntOutOfRangeExce
7830: 70 74 69 6f 6e 28 29 3b 0a 0a 20 20 20 20 20 20  ption();..      
7840: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
7850: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7860: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
7870: 6e 65 77 20 41 72 67 75 6d 65 6e 74 4f 75 74 4f  new ArgumentOutO
7880: 66 52 61 6e 67 65 45 78 63 65 70 74 69 6f 6e 28  fRangeException(
7890: 22 4f 70 65 72 61 74 69 6f 6e 20 43 6f 6d 70 6c  "Operation Compl
78a0: 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  eted successfull
78b0: 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  y");.          }
78c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
78d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
78e0: 20 43 61 75 73 65 73 20 74 68 65 20 75 73 65 72   Causes the user
78f0: 2d 64 65 66 69 6e 65 64 20 61 67 67 72 65 67 61  -defined aggrega
7900: 74 65 20 74 6f 20 62 65 20 69 74 65 72 61 74 65  te to be iterate
7910: 64 20 74 68 72 6f 75 67 68 0a 20 20 20 20 69 6e  d through.    in
7920: 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f  ternal static vo
7930: 69 64 20 55 73 65 72 41 67 67 72 65 67 61 74 65  id UserAggregate
7940: 28 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e  (DbConnection cn
7950: 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  n).    {.      u
7960: 73 69 6e 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20  sing (DbCommand 
7970: 63 6d 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65  cmd = cnn.Create
7980: 43 6f 6d 6d 61 6e 64 28 29 29 0a 20 20 20 20 20  Command()).     
7990: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64   {.        int d
79a0: 74 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  tStart;.        
79b0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
79c0: 20 20 20 69 6e 74 20 6e 43 6f 75 6e 74 3b 0a 0a     int nCount;..
79d0: 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f 6d 6d          cmd.Comm
79e0: 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c 45 43  andText = "SELEC
79f0: 54 20 4d 79 43 6f 75 6e 74 28 2a 29 20 46 52 4f  T MyCount(*) FRO
7a00: 4d 20 54 65 73 74 43 61 73 65 22 3b 0a 0a 20 20  M TestCase";..  
7a10: 20 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 30        nCount = 0
7a20: 3b 0a 20 20 20 20 20 20 20 20 64 74 53 74 61 72  ;.        dtStar
7a30: 74 20 3d 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e  t = Environment.
7a40: 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20 20 20  TickCount;.     
7a50: 20 20 20 77 68 69 6c 65 20 28 45 6e 76 69 72 6f     while (Enviro
7a60: 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20  nment.TickCount 
7a70: 2d 20 64 74 53 74 61 72 74 20 3c 20 31 30 30 30  - dtStart < 1000
7a80: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
7a90: 20 20 20 20 20 20 6e 20 3d 20 43 6f 6e 76 65 72        n = Conver
7aa0: 74 2e 54 6f 49 6e 74 33 32 28 63 6d 64 2e 45 78  t.ToInt32(cmd.Ex
7ab0: 65 63 75 74 65 53 63 61 6c 61 72 28 29 29 3b 0a  ecuteScalar());.
7ac0: 20 20 20 20 20 20 20 20 20 20 6e 43 6f 75 6e 74            nCount
7ad0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
7ae0: 20 20 20 20 20 20 69 66 20 28 6e 20 21 3d 20 31        if (n != 1
7af0: 32 30 30 30 33 29 20 74 68 72 6f 77 20 6e 65 77  20003) throw new
7b00: 20 41 72 67 75 6d 65 6e 74 4f 75 74 4f 66 52 61   ArgumentOutOfRa
7b10: 6e 67 65 45 78 63 65 70 74 69 6f 6e 28 22 55 6e  ngeException("Un
7b20: 65 78 70 65 63 74 65 64 20 63 6f 75 6e 74 22 29  expected count")
7b30: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c  ;.        Consol
7b40: 65 2e 57 72 69 74 65 4c 69 6e 65 28 53 74 72 69  e.WriteLine(Stri
7b50: 6e 67 2e 46 6f 72 6d 61 74 28 22 20 20 20 20 20  ng.Format("     
7b60: 20 20 20 20 20 55 73 65 72 41 67 67 72 65 67 61       UserAggrega
7b70: 74 65 20 65 78 65 63 75 74 65 64 20 7b 30 7d 20  te executed {0} 
7b80: 74 69 6d 65 73 20 69 6e 20 31 20 73 65 63 6f 6e  times in 1 secon
7b90: 64 2e 22 2c 20 6e 43 6f 75 6e 74 29 29 3b 0a 20  d.", nCount));. 
7ba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
7bb0: 20 20 2f 2f 20 43 61 75 73 65 73 20 74 68 65 20    // Causes the 
7bc0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c  user-defined col
7bd0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7be0: 74 6f 20 62 65 20 69 74 65 72 61 74 65 64 20 74  to be iterated t
7bf0: 68 72 6f 75 67 68 0a 20 20 20 20 69 6e 74 65 72  hrough.    inter
7c00: 6e 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20  nal static void 
7c10: 55 73 65 72 43 6f 6c 6c 61 74 69 6f 6e 28 44 62  UserCollation(Db
7c20: 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 29 0a  Connection cnn).
7c30: 20 20 20 20 7b 0a 20 20 20 20 20 20 75 73 69 6e      {.      usin
7c40: 67 20 28 44 62 43 6f 6d 6d 61 6e 64 20 63 6d 64  g (DbCommand cmd
7c50: 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d   = cnn.CreateCom
7c60: 6d 61 6e 64 28 29 29 0a 20 20 20 20 20 20 7b 0a  mand()).      {.
7c70: 20 20 20 20 20 20 20 20 2f 2f 20 55 73 69 6e 67          // Using
7c80: 20 61 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61   a default colla
7c90: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
7ca0: 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65   descending orde
7cb0: 72 2c 20 22 50 61 72 61 6d 20 46 69 65 6c 64 33  r, "Param Field3
7cc0: 22 20 77 69 6c 6c 20 61 70 70 65 61 72 20 61 74  " will appear at
7cd0: 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20 20   the top.       
7ce0: 20 2f 2f 20 61 6e 64 20 22 46 69 65 6c 64 33 22   // and "Field3"
7cf0: 20 77 69 6c 6c 20 62 65 20 6e 65 78 74 2c 20 66   will be next, f
7d00: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 4e 55 4c  ollowed by a NUL
7d10: 4c 2e 20 20 4f 75 72 20 75 73 65 72 2d 64 65 66  L.  Our user-def
7d20: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
7d30: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 0a 20 20  equence will .  
7d40: 20 20 20 20 20 20 2f 2f 20 64 65 6c 69 62 65 72        // deliber
7d50: 61 74 65 6c 79 20 70 6c 61 63 65 20 74 68 65 6d  ately place them
7d60: 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 73 6f   out of order so
7d70: 20 46 69 65 6c 64 33 20 69 73 20 66 69 72 73 74   Field3 is first
7d80: 2e 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 43 6f  ..        cmd.Co
7d90: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 22 53 45 4c  mmandText = "SEL
7da0: 45 43 54 20 46 69 65 6c 64 33 20 46 52 4f 4d 20  ECT Field3 FROM 
7db0: 54 65 73 74 43 61 73 65 20 4f 52 44 45 52 20 42  TestCase ORDER B
7dc0: 59 20 46 69 65 6c 64 33 20 43 4f 4c 4c 41 54 45  Y Field3 COLLATE
7dd0: 20 4d 59 53 45 51 55 45 4e 43 45 20 44 45 53 43   MYSEQUENCE DESC
7de0: 22 3b 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ";.        strin
7df0: 67 20 73 20 3d 20 28 73 74 72 69 6e 67 29 63 6d  g s = (string)cm
7e00: 64 2e 45 78 65 63 75 74 65 53 63 61 6c 61 72 28  d.ExecuteScalar(
7e10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  );.        if (s
7e20: 20 21 3d 20 22 46 69 65 6c 64 33 22 29 20 74 68   != "Field3") th
7e30: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
7e40: 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65 70 74  OutOfRangeExcept
7e50: 69 6f 6e 28 22 4d 79 53 65 71 75 65 6e 63 65 20  ion("MySequence 
7e60: 64 69 64 6e 27 74 20 73 6f 72 74 20 70 72 6f 70  didn't sort prop
7e70: 65 72 6c 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a  erly");.      }.
7e80: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a                  }.  }.}.