SampleDb.cs

using System;
using System.Data;

namespace DotNetDataProviderTemplate
{
  /*
   * This class provides database-like operations to simulate a real
   * data source. The class generates sample data and uses a
   * fixed set of commands.
   */
  public class SampleDb
  {
    private const string m_sSelectCmd = "select ";
    private const string m_sUpdateCmd = "update ";

    public class SampleDbResultSet
    {
      public struct MetaData
      {
        public string  name;
        public Type    type;
        public int    maxSize;
      }

      public int  recordsAffected;
      public MetaData[]  metaData;
      public object[,]  data;
    }

    private SampleDbResultSet m_resultset = null;

    public void Execute(string sCmd, out SampleDbResultSet resultset)
    {
      /*
       * The sample code simulates SELECT and UPDATE operations.
       */
      if (0 == String.Compare(sCmd, 0, m_sSelectCmd, 0, m_sSelectCmd.Length, true))
      {
        _executeSelect(out resultset);
      }
      else if (0 == String.Compare(sCmd, 0, m_sUpdateCmd, 0, m_sUpdateCmd.Length, true))
      {
        _executeUpdate(out resultset);
      }
      else
        throw new NotSupportedException("Command string was not recognized");
    }

    private void _executeSelect(out SampleDbResultSet resultset)
    {
      // If no sample data exists, create it.
      if (m_resultset == null)
        _resultsetCreate();

      // Return the sample results.
      resultset = m_resultset;
    }

    private void _executeUpdate(out SampleDbResultSet resultset)
    {
      // If no sample data exists, create it.
      if (m_resultset == null)
        _resultsetCreate();

      // Change a row to simulate an update command.
      m_resultset.data[2,2] = 4199;

      // Create a result set object that is empty except for the RecordsAffected field.
      resultset = new SampleDbResultSet();
      resultset.recordsAffected = 1;
    }

    private void _resultsetCreate()
    {
      m_resultset = new SampleDbResultSet();

      // RecordsAffected is always a zero value for a SELECT.
      m_resultset.recordsAffected = 0;

      const int numCols = 3;
      m_resultset.metaData = new SampleDbResultSet.MetaData[numCols];
      _resultsetFillColumn(0, "id", typeof(Int32), 0);
      _resultsetFillColumn(1, "name", typeof(String), 64);
      _resultsetFillColumn(2, "orderid", typeof(Int32), 0);
      
      m_resultset.data = new object[5, numCols];
      _resultsetFillRow(0, 1, "Biggs", 2001);
      _resultsetFillRow(1, 2, "Brown", 2121);
      _resultsetFillRow(2, 3, "Jones", 2543);
      _resultsetFillRow(3, 4, "Smith", 2772);
      _resultsetFillRow(4, 5, "Tyler", 3521);
    }

    private void _resultsetFillColumn(int nIdx, string name, Type type, int maxSize)
    {
      m_resultset.metaData[nIdx].name    = name;
      m_resultset.metaData[nIdx].type    = type;
      m_resultset.metaData[nIdx].maxSize  = maxSize;
    }

    private void _resultsetFillRow(int nIdx, int id, string name, int orderid)
    {
      m_resultset.data[nIdx, 0] = id;
      m_resultset.data[nIdx, 1] = name;
      m_resultset.data[nIdx, 2] = orderid;
    }
  }
}