以上主题提供指向一些附加主题的链接,这些主题包含可用来创建示例 .NET 数据提供程序的示例代码。您可以将此代码复制到空白的文本文件中,将文件放入一个目录,然后按照本主题后面部分的“编译示例 .NET 数据提供程序”一节中提供的指南将这些文件编译成库。

下表显示可用来创建示例 .NET 数据提供程序的示例代码文件的列表。

文件名 说明

TemplateConnection.cs

包含用于创建 Connection 对象的示例代码。

TemplateTransaction.cs

包含用于创建 Transaction 对象的示例代码。

TemplateCommand.cs

包含用于创建 Command 对象的示例代码。

TemplateParameter.cs

包含用于创建 Parameter 对象的示例代码,该对象是 Command.Parameters 集合的成员。

TemplateParameterCollection.cs

包含用于创建 ParameterCollection 对象的示例代码,该对象将用作 Command.Parameters 属性。

TemplateDataReader.cs

包含用于创建 DataReader 对象的示例代码

TemplateDataAdapter.cs

包含用于创建 DataAdapter 对象的示例代码。

SampleDb.cs

包含模拟数据源查询及更新的示例代码。

编译示例 .NET 数据提供程序

从所提供的示例代码创建文件并将这些文件放入一个文件夹后,请发出以下命令,将示例 .NET 数据提供程序创建为 DotNetDataProviderTemplate.dll。然后,可以将 DotNetDataProviderTemplate.dll 当作对利用 DotNetDataProviderTemplate 命名空间的程序的引用进行传递。

若要编译示例 .NET 数据提供程序的 Visual Basic 版本,可以使用以下命令。

vbc /t:library /out:DotNetDataProviderTemplate.dll *.vb /r:system.dll /r:system.data.dll

若要编译示例 .NET 数据提供程序的 C# 版本,可以使用以下命令。

csc /t:library /out:DotNetDataProviderTemplate.dll *.cs /r:system.dll /r:system.data.dll

使用示例 .NET 数据提供程序

当您将示例 .NET 数据提供程序编译成 DotNetDataProviderTemplate.dll 后,可以编写一个程序来使用 DotNetDataProviderTemplate 命名空间。

以下代码示例包含一个程序,它创建示例 DataReaderDataAdapter 的实例。

Imports System
Imports System.Data
Imports DotNetDataProviderTemplate
Imports Microsoft.VisualBasic

Class Sample
  Public Shared Sub Main()
    testReader()
    testAdapter()
  End Sub

  Public Shared Sub testReader()
    Dim conn As TemplateConnection = New TemplateConnection()
    conn.Open()
      
    Dim cmd As TemplateCommand = New TemplateCommand("select * from customers", conn)

    Dim reader As TemplateDataReader = cmd.ExecuteReader()

    Do while (reader.Read())
      Console.Write(reader.GetInt32(0) & vbTab)
      Console.Write(reader.GetString(1) & vbTab)
      Console.Write(reader.GetInt32(2))
      Console.WriteLine()
    Loop
    reader.Close()
      
    conn.Close()
  End Sub

  Public Shared Sub testAdapter()
    Dim conn As TemplateConnection = New TemplateConnection()
    Dim adapter As TemplateDataAdapter = New TemplateDataAdapter()

    adapter.SelectCommand = New TemplateCommand("select * from customers", conn)

    adapter.UpdateCommand = New TemplateCommand("update name, orderid values(@name, @orderid) where id = @id", conn)

    Dim parm As TemplateParameter = New TemplateParameter("@name", DbType.String, "name")
    adapter.UpdateCommand.Parameters.Add(parm)

    parm = New TemplateParameter("@orderid", DbType.Int32, "orderid")
    adapter.UpdateCommand.Parameters.Add(parm)

    parm = New TemplateParameter("@id", DbType.Int32, "id")
    adapter.UpdateCommand.Parameters.Add(parm)

    Dim ds As DataSet = New DataSet
    adapter.Fill(ds, "Customers")

    Console.WriteLine("------------------------")
    Console.WriteLine("DataSet contents after Fill:")
    printDataSet(ds)

    Console.WriteLine("------------------------")
    ds.Tables("Customers").Rows(2)("orderid") = 4199
    adapter.Update(ds, "Customers")

    Console.WriteLine("------------------------")
    Console.WriteLine("DataSet contents after Update:")
    printDataSet(ds)
    Console.WriteLine("------------------------")
  End Sub

  Public Shared Sub printDataSet(ds As DataSet)
    Dim table As DataTable
    Dim col As DataColumn
    Dim row As DataRow
    Dim i As Integer

    For Each table in ds.Tables
      For Each col in table.Columns
        Console.Write(col.ColumnName & vbTab & vbTab)
      Next
      Console.WriteLine()

      For Each row in table.Rows  
        For i = 0 To table.Columns.Count - 1  
          Console.Write(row(i).ToString() & vbTab & vbTab)
        Next
        Console.WriteLine()
      Next
    Next
  End Sub
End Class

using System;
using System.Data;
using DotNetDataProviderTemplate;

class Sample
{
  static void Main()
  {
    testReader();
    testAdapter();
  }

  static void testReader()
  {
    TemplateConnection conn = new TemplateConnection();
    conn.Open();
      
    TemplateCommand cmd = new TemplateCommand("select * from customers", conn);

    IDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
      Console.Write(reader.GetInt32(0) + "\t");
      Console.Write(reader.GetString(1) + "\t");
      Console.Write(reader.GetInt32(2));
      Console.WriteLine();
    }
    reader.Close();
    
    conn.Close();
  }

  static void testAdapter()
  {
    TemplateConnection  conn = new TemplateConnection();
    TemplateDataAdapter  adapter = new TemplateDataAdapter();

    adapter.SelectCommand = new TemplateCommand("select * from customers", conn);

    adapter.UpdateCommand = new TemplateCommand("update name, orderid values(@name, @orderid) where id = @id", conn);
    adapter.UpdateCommand.Parameters.Add("@name", DbType.String);
    adapter.UpdateCommand.Parameters.Add("@orderid", DbType.Int32);
    adapter.UpdateCommand.Parameters.Add("@id", DbType.Int32);

    DataSet ds = new DataSet();
    adapter.Fill(ds, "Customers");

    Console.WriteLine("------------------------");
    Console.WriteLine("Results of adapter.Fill");
    printDataSet(ds);
    Console.WriteLine("------------------------");

    ds.Tables["Customers"].Rows[2]["orderid"] = 4199;
    adapter.Update(ds, "Customers");

    Console.WriteLine("------------------------");
    Console.WriteLine("Results of adapter.Update");
    printDataSet(ds);
    Console.WriteLine("------------------------");
  }

  static void printDataSet(DataSet ds)
  {
    foreach (DataTable table in ds.Tables)
    {
      foreach (DataColumn col in table.Columns)
        Console.Write(col.ColumnName + "\t\t");
      Console.WriteLine();
      foreach (DataRow row in table.Rows)
      {
        for (int i = 0; i < table.Columns.Count; i++)
          Console.Write(row[i] + "\t\t");
        Console.WriteLine("");
      }
    }
  }
}

若要编译以上代码示例中的程序,请确保对 DotNetDataProvider.dll 的引用已包含在内。

如果该程序存储在名为“SampleTest.vb”的文件中,请使用以下示例命令编译该程序:

vbc SampleTest.vb /r:system.dll /r:system.data.dll /r:system.xml.dll /r:DotNetDataProviderTemplate.dll

如果该程序存储在名为 SampleTest.cs 的文件中,请使用以下示例命令编译该程序。

csc SampleTest.cs /r:system.dll /r:system.data.dll /r:system.xml.dll /r:DotNetDataProviderTemplate.dll

SampleDb

除示例 .NET 数据提供程序实现之外,本节还提供了一个示例数据库来模拟对数据源的 SELECT 和 UPDATE 操作。此示例数据库名为 SampleDb,它是随 .NET 数据提供程序文件提供的。当编译 .NET 数据提供程序时,将需要随您的模板文件提供 SampleDb.vb(用于 Visual Basic)或 SampleDb.cs(用于 C#)文件。

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;
    }
  }
}