以上主题提供指向一些附加主题的链接,这些主题包含可用来创建示例 .NET 数据提供程序的示例代码。您可以将此代码复制到空白的文本文件中,将文件放入一个目录,然后按照本主题后面部分的“编译示例 .NET 数据提供程序”一节中提供的指南将这些文件编译成库。
下表显示可用来创建示例 .NET 数据提供程序的示例代码文件的列表。
| 文件名 | 说明 |
|---|---|
| 包含用于创建 Connection 对象的示例代码。 | |
| 包含用于创建 Transaction 对象的示例代码。 | |
| 包含用于创建 Command 对象的示例代码。 | |
| 包含用于创建 Parameter 对象的示例代码,该对象是 Command.Parameters 集合的成员。 | |
| 包含用于创建 ParameterCollection 对象的示例代码,该对象将用作 Command.Parameters 属性。 | |
| 包含用于创建 DataReader 对象的示例代码 | |
| 包含用于创建 DataAdapter 对象的示例代码。 | |
| 包含模拟数据源查询及更新的示例代码。 |
编译示例 .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 命名空间。
以下代码示例包含一个程序,它创建示例 DataReader 和 DataAdapter 的实例。
|
[Visual Basic] [C#] |
若要编译以上代码示例中的程序,请确保对 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
除示例 .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; } } } |