当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] AccessDBProviderSample02

作者:精品下载站 日期:2024-12-14 02:46:47 浏览:14 分类:玩电脑

AccessDBProviderSample02


此示例演示如何覆盖 System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* 和 System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* 方法以支持对 New-PSDriveRemove-PSDrive cmdlet。此示例中的提供程序类派生自 System.Management.Automation.Provider.Drivecmdletprovider 类。

示范

这很重要

您的提供程序类很可能派生自以下类之一,并可能实现其他提供程序接口:

  • System.Management.Automation.Provider.Itemcmdletprovider 类。请参阅 AccessDBProviderSample03。
  • System.Management.Automation.Provider.Containercmdletprovider 类。请参阅 AccessDBProviderSample04。
  • System.Management.Automation.Provider.Navigationcmdletprovider 类。请参阅 AccessDBProviderSample05。

有关根据提供程序功能选择派生的提供程序类的详细信息,请参阅设计您的 Windows PowerShell 提供程序。

该示例演示了以下内容:

  • 声明 CmdletProvider 属性。

  • 定义从 System.Management.Automation.Provider.Drivecmdletprovider 类驱动的提供程序类。

  • 重写 System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* 方法以支持创建新驱动器。 (此示例不展示如何将动态参数添加到 New-PSDrive cmdlet。)

  • 重写 System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* 方法以支持删除现有驱动器。

例子

此示例演示如何覆盖 System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* 和 System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* 方法。对于此示例提供程序,创建驱动器时,其连接信息存储在 AccessDBPsDriveInfo 对象中。

using System;
using System.IO;
using System.Data;
using System.Data.Odbc;
using System.Management.Automation;
using System.Management.Automation.Provider;
using System.ComponentModel;

namespace Microsoft.Samples.PowerShell.Providers
{
   #region AccessDBProvider

    /// <summary>
   /// A PowerShell Provider which acts upon a access data store.
   /// </summary>
   /// <remarks>
   /// This example only demonstrates the drive overrides
   /// </remarks>
   [CmdletProvider("AccessDB", ProviderCapabilities.None)]
   public class AccessDBProvider : DriveCmdletProvider
   {
       #region Drive Manipulation

       /// <summary>
       /// Create a new drive.  Create a connection to the database file and set
       /// the Connection property in the PSDriveInfo.
       /// </summary>
       /// <param name="drive">
       /// Information describing the drive to add.
       /// </param>
       /// <returns>The added drive.</returns>
       protected override PSDriveInfo NewDrive(PSDriveInfo drive)
       {
           // check if drive object is null
           if (drive == null)
           {
               WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"), 
                   "NullDrive",
                   ErrorCategory.InvalidArgument, 
                   null)
               );
            
               return null;
           }
        
           // check if drive root is not null or empty
           // and if its an existing file
           if (String.IsNullOrEmpty(drive.Root) || (File.Exists(drive.Root) == false))
           {
               WriteError(new ErrorRecord(
                   new ArgumentException("drive.Root"), 
                   "NoRoot",
                   ErrorCategory.InvalidArgument, 
                   drive)
               );
 
               return null;
           }

           // create a new drive and create an ODBC connection to the new drive
           AccessDBPSDriveInfo accessDBPSDriveInfo = new AccessDBPSDriveInfo(drive);

           OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

           builder.Driver = "Microsoft Access Driver (*.mdb)";
           builder.Add("DBQ", drive.Root);
          
           OdbcConnection conn = new OdbcConnection(builder.ConnectionString);
           conn.Open();
           accessDBPSDriveInfo.Connection = conn;

           return accessDBPSDriveInfo;
       } // NewDrive

       /// <summary>
       /// Removes a drive from the provider.
       /// </summary>
       /// <param name="drive">The drive to remove.</param>
       /// <returns>The drive removed.</returns>
       protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
       {
           // check if drive object is null
           if (drive == null)
           {
               WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"), 
                   "NullDrive",
                   ErrorCategory.InvalidArgument, 
                   drive)
               );

              return null;
           }

           // close ODBC connection to the drive
           AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;

           if (accessDBPSDriveInfo == null)
           {
               return null;
           }
           accessDBPSDriveInfo.Connection.Close();
         
           return accessDBPSDriveInfo;
       } // RemoveDrive

       #endregion Drive Manipulation

   } // AccessDBProvider

   #endregion AccessDBProvider

   #region AccessDBPSDriveInfo

   /// <summary>
   /// Any state associated with the drive should be held here.
   /// In this case, it's the connection to the database.
   /// </summary>
   internal class AccessDBPSDriveInfo : PSDriveInfo
   {
       private OdbcConnection connection;

       /// <summary>
       /// ODBC connection information.
       /// </summary>
       public OdbcConnection Connection
       {
           get { return connection; }
           set { connection = value; }
       }

       /// <summary>
       /// Constructor that takes one argument
       /// </summary>
       /// <param name="driveInfo">Drive provided by this provider</param>
       public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
           : base(driveInfo)
       { }

   } // class AccessDBPSDriveInfo

   #endregion AccessDBPSDriveInfo
}

参见

System.Management.Automation.Provider.Itemcmdletprovider

System.Management.Automation.Provider.Containercmdletprovider

System.Management.Automation.Provider.Navigationcmdletprovider

设计您的 Windows PowerShell 提供程序

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯