} // 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
} // TableNameIsValid /// <summary> /// Checks to see if the specified table is present in the /// database /// </summary> /// <param name="tableName">Name of the table to check</param> /// <returns>true, if table is present, false otherwise</returns> private bool TableIsPresent(string tableName) { // using ODBC connection to the database and get the schema of tables AccessDBPSDriveInfo di = this.PSDriveInfo as AccessDBPSDriveInfo; if (di == null) { return(false); } OdbcConnection connection = di.Connection; DataTable dt = connection.GetSchema("Tables"); // check if the specified tableName is available // in the list of tables present in the database foreach (DataRow dr in dt.Rows) { string name = dr["TABLE_NAME"] as string; if (name.Equals(tableName, StringComparison.OrdinalIgnoreCase)) { return(true); } } WriteError(new ErrorRecord( new ArgumentException("Specified Table is not present in database"), "TableNotAvailable", ErrorCategory.InvalidArgument, tableName)); return(false); }// TableIsPresent
/// <summary> /// Retrieve the list of tables from the database. /// </summary> /// <returns> /// Collection of DatabaseTableInfo objects, each object representing /// information about one database table /// </returns> private Collection <DatabaseTableInfo> GetTables() { Collection <DatabaseTableInfo> results = new Collection <DatabaseTableInfo>(); // using ODBC connection to the database and get the schema of tables AccessDBPSDriveInfo di = this.PSDriveInfo as AccessDBPSDriveInfo; if (di == null) { return(null); } OdbcConnection connection = di.Connection; DataTable dt = connection.GetSchema("Tables"); int count; // iterate through all rows in the schema and create DatabaseTableInfo // objects which represents a table foreach (DataRow dr in dt.Rows) { String tableName = dr["TABLE_NAME"] as String; DataColumnCollection columns = null; // find the number of rows in the table try { String cmd = "Select count(*) from \"" + tableName + "\""; OdbcCommand command = new OdbcCommand(cmd, connection); count = (Int32)command.ExecuteScalar(); } catch { count = 0; } // create DatabaseTableInfo object representing the table DatabaseTableInfo table = new DatabaseTableInfo(dr, tableName, count, columns); results.Add(table); } // foreach (DataRow... return(results); } // GetTables
/// <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> /// 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
} // GetTable /// <summary> /// Obtain a data adapter for the specified Table /// </summary> /// <param name="tableName">Name of the table to obtain the /// adapter for</param> /// <returns>Adapter object for the specified table</returns> /// <remarks>An adapter serves as a bridge between a DataSet (in memory /// representation of table) and the data source</remarks> private OdbcDataAdapter GetAdapterForTable(string tableName) { OdbcDataAdapter da = null; AccessDBPSDriveInfo di = this.PSDriveInfo as AccessDBPSDriveInfo; if (di == null || !TableNameIsValid(tableName) || !TableIsPresent(tableName)) { return(null); } OdbcConnection connection = di.Connection; try { // Create a odbc data adpater. This can be sued to update the // data source with the records that will be created here // using data sets string sql = "Select * from " + tableName; da = new OdbcDataAdapter(new OdbcCommand(sql, connection)); // Create a odbc command builder object. This will create sql // commands automatically for a single table, thus // eliminating the need to create new sql statements for // every operation to be done. OdbcCommandBuilder cmd = new OdbcCommandBuilder(da); // Open the connection if its not already open if (connection.State != ConnectionState.Open) { connection.Open(); } } catch (Exception e) { WriteError(new ErrorRecord(e, "CannotAccessSpecifiedTable", ErrorCategory.InvalidOperation, tableName)); } return(da); } // GetAdapterForTable