Sideway
output.to from Sideway
Draft for Information Only

Content

System.Data.OleDB
OleDbDataAdapter Class
 Definition
  In this article
 Examples
 Remarks
 Constructors
 Properties
 Methods
 Events
 Explicit Interface Implementations
 Fields
 Applies to
   .NET Core
   .NET Framework
   .NET Platform Extensions
   Xamarin.Mac
 See also
 Examples
 Source/Reference

System.Data.OleDB

The System.Data.OleDb namespace is the.NET Framework Data Provider for OLE DB.

OleDbDataAdapter Class

Definition

Namespace:
System.Data.OleDb
Assemblies:
System.Data.dll, System.Data.OleDb.dll

Represents a set of data commands and a database connection that are used to fill the DataSet and update the data source.

In this article

  1. Definition
  2. Examples
  3. Remarks
  4. Constructors
  5. Properties
  6. Methods
  7. Events
  8. Explicit Interface Implementations
  9. Fields
  10. Applies to
  11. See also
C#
public sealed class OleDbDataAdapter : System.Data.Common.DbDataAdapter, ICloneable
Inheritance
Object MarshalByRefObject Component DataAdapter DbDataAdapter OleDbDataAdapter
Implements
IDataAdapter IDbDataAdapter ICloneable

Examples

The following example uses the OleDbCommand, OleDbDataAdapter and OleDbConnection, to select records from an Access data source, and populate a DataSet with the selected rows. The filled DataSet is then returned. To accomplish this, the method is passed an initialized DataSet, a connection string, and a query string that is an SQL SELECT statement.

C#
public static OleDbDataAdapter CreateDataAdapter(string selectCommand,
    OleDbConnection connection)
{
    OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connection);

    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

    // Create the Insert, Update and Delete commands.
    adapter.InsertCommand = new OleDbCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (?, ?)");

    adapter.UpdateCommand = new OleDbCommand(
        "UPDATE Customers SET CustomerID = ?, CompanyName = ? " +
        "WHERE CustomerID = ?");

    adapter.DeleteCommand = new OleDbCommand(
        "DELETE FROM Customers WHERE CustomerID = ?");

    // Create the parameters.
    adapter.InsertCommand.Parameters.Add("@CustomerID", 
        OleDbType.Char, 5, "CustomerID");
    adapter.InsertCommand.Parameters.Add("@CompanyName", 
        OleDbType.VarChar, 40, "CompanyName");

    adapter.UpdateCommand.Parameters.Add("@CustomerID", 
        OleDbType.Char, 5, "CustomerID");
    adapter.UpdateCommand.Parameters.Add("@CompanyName", 
        OleDbType.VarChar, 40, "CompanyName");
    adapter.UpdateCommand.Parameters.Add("@oldCustomerID", 
        OleDbType.Char, 5, "CustomerID").SourceVersion = 
        DataRowVersion.Original;

    adapter.DeleteCommand.Parameters.Add("@CustomerID", 
        OleDbType.Char, 5, "CustomerID").SourceVersion = 
        DataRowVersion.Original;

    return adapter;
}

Remarks

The OleDbDataAdapter serves as a bridge between a DataSet and data source for retrieving and saving data. The OleDbDataAdapter provides this bridge by using Fill to load data from the data source into the DataSet, and using Update to send changes made in the DataSet back to the data source.

When the OleDbDataAdapter fills a DataSet, it will create the appropriate tables and columns for the returned data if they do not already exist. However, primary key information is not included in the implicitly created schema unless the MissingSchemaAction property is set to AddWithKey. You may also have the OleDbDataAdapter create the schema of the DataSet, including primary key information, before filling it with data using FillSchema. For more information, see Adding Existing Constraints to a DataSet.

Note that some OLE DB providers, including the MSDataShape provider, do not return base table or primary key information. Therefore, the OleDbDataAdapter cannot correctly set the PrimaryKey property on any created DataTable. In these cases you should explicitly specify primary keys for tables in the DataSet.

The OleDbDataAdapter also includes the SelectCommand, InsertCommand, DeleteCommand, UpdateCommand, and TableMappings properties to facilitate the loading and updating of data.

When you create an instance of OleDbDataAdapter, properties are set to their initial values. For a list of these values, see the OleDbDataAdapter constructor.

Constructors

OleDbDataAdapter()

Initializes a new instance of the OleDbDataAdapter class.

OleDbDataAdapter(OleDbCommand)

Initializes a new instance of the OleDbDataAdapter class with the specified OleDbCommand as the SelectCommand property.

OleDbDataAdapter(String, OleDbConnection)

Initializes a new instance of the OleDbDataAdapter class with a SelectCommand.

OleDbDataAdapter(String, String)

Initializes a new instance of the OleDbDataAdapter class with a SelectCommand.

Properties

AcceptChangesDuringFill

Gets or sets a value indicating whether AcceptChanges() is called on a DataRow after it is added to the DataTable during any of the Fill operations.

(Inherited from DataAdapter)
AcceptChangesDuringUpdate

Gets or sets whether AcceptChanges() is called during a Update(DataSet).

(Inherited from DataAdapter)
CanRaiseEvents

Gets a value indicating whether the component can raise an event.

(Inherited from Component)
Container

Gets the IContainer that contains the Component.

(Inherited from Component)
ContinueUpdateOnError

Gets or sets a value that specifies whether to generate an exception when an error is encountered during a row update.

(Inherited from DataAdapter)
DeleteCommand

Gets or sets an SQL statement or stored procedure for deleting records from the data set.

DesignMode

Gets a value that indicates whether the Component is currently in design mode.

(Inherited from Component)
Events

Gets the list of event handlers that are attached to this Component.

(Inherited from Component)
FillCommandBehavior

Gets or sets the behavior of the command used to fill the data adapter.

(Inherited from DbDataAdapter)
FillLoadOption

Gets or sets the LoadOption that determines how the adapter fills the DataTable from the DbDataReader.

(Inherited from DataAdapter)
IDataAdapter.TableMappings

Indicates how a source table is mapped to a dataset table.

(Inherited from DataAdapter)
InsertCommand

Gets or sets an SQL statement or stored procedure used to insert new records into the data source.

MissingMappingAction

Determines the action to take when incoming data does not have a matching table or column.

(Inherited from DataAdapter)
MissingSchemaAction

Determines the action to take when existing DataSet schema does not match incoming data.

(Inherited from DataAdapter)
ReturnProviderSpecificTypes

Gets or sets whether the Fill method should return provider-specific values or common CLS-compliant values.

(Inherited from DataAdapter)
SelectCommand

Gets or sets an SQL statement or stored procedure used to select records in the data source.

Site

Gets or sets the ISite of the Component.

(Inherited from Component)
TableMappings

Gets a collection that provides the master mapping between a source table and a DataTable.

(Inherited from DataAdapter)
UpdateBatchSize

Gets or sets a value that enables or disables batch processing support, and specifies the number of commands that can be executed in a batch.

(Inherited from DbDataAdapter)
UpdateCommand

Gets or sets an SQL statement or stored procedure used to update records in the data source.

Methods

AddToBatch(IDbCommand)

Adds a IDbCommand to the current batch.

(Inherited from DbDataAdapter)
ClearBatch()

Removes all IDbCommand objects from the batch.

(Inherited from DbDataAdapter)
CloneInternals()

Creates a copy of this instance of DataAdapter.

(Inherited from DataAdapter)
CreateObjRef(Type)

Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Inherited from MarshalByRefObject)
CreateRowUpdatedEvent(DataRow, IDbCommand, StatementType, DataTableMapping)

Initializes a new instance of the RowUpdatedEventArgs class.

(Inherited from DbDataAdapter)
CreateRowUpdatingEvent(DataRow, IDbCommand, StatementType, DataTableMapping)

Initializes a new instance of the RowUpdatingEventArgs class.

(Inherited from DbDataAdapter)
CreateTableMappings()

Creates a new DataTableMappingCollection.

(Inherited from DataAdapter)
Dispose()

Releases all resources used by the Component.

(Inherited from Component)
Dispose(Boolean)

Releases the unmanaged resources used by the DbDataAdapter and optionally releases the managed resources.

(Inherited from DbDataAdapter)
Equals(Object)

Determines whether the specified object is equal to the current object.

(Inherited from Object)
ExecuteBatch()

Executes the current batch.

(Inherited from DbDataAdapter)
Fill(DataSet)

Adds or refreshes rows in the DataSet.

(Inherited from DbDataAdapter)
Fill(DataSet, Int32, Int32, String)

Adds or refreshes rows in a specified range in the DataSet to match those in the data source using the DataSet and DataTable names.

(Inherited from DbDataAdapter)
Fill(DataSet, Int32, Int32, String, IDbCommand, CommandBehavior)

Adds or refreshes rows in a specified range in the DataSet to match those in the data source using the DataSet and source table names, command string, and command behavior.

(Inherited from DbDataAdapter)
Fill(DataSet, Object, String)

Adds or refreshes rows in the DataSet to match those in an ADO Recordset or Record object using the specified DataSet, ADO object, and source table name.

Fill(DataSet, String)

Adds or refreshes rows in the DataSet to match those in the data source using the DataSet and DataTable names.

(Inherited from DbDataAdapter)
Fill(DataTable)

Adds or refreshes rows in a specified range in the DataSet to match those in the data source using the DataTable name.

(Inherited from DbDataAdapter)
Fill(DataTable, IDbCommand, CommandBehavior)

Adds or refreshes rows in a DataTable to match those in the data source using the specified DataTable, IDbCommand and CommandBehavior.

(Inherited from DbDataAdapter)
Fill(DataTable, Object)

Adds or refreshes rows in a DataTable to match those in an ADO Recordset or Record object using the specified DataTable and ADO objects.

Fill(DataTable[], IDataReader, Int32, Int32)

Adds or refreshes rows in a specified range in the collection of DataTable objects to match those in the data source.

(Inherited from DataAdapter)
Fill(DataTable[], Int32, Int32, IDbCommand, CommandBehavior)

Adds or refreshes rows in a specified range in the DataSet to match those in the data source using the DataSet and DataTable names.

(Inherited from DbDataAdapter)
Fill(Int32, Int32, DataTable[])

Adds or refreshes rows in a DataTable to match those in the data source starting at the specified record and retrieving up to the specified maximum number of records.

(Inherited from DbDataAdapter)
FillSchema(DataSet, SchemaType)

Adds a DataTable named "Table" to the specified DataSet and configures the schema to match that in the data source based on the specified SchemaType.

(Inherited from DbDataAdapter)
FillSchema(DataSet, SchemaType, IDbCommand, String, CommandBehavior)

Adds a DataTable to the specified DataSet and configures the schema to match that in the data source based on the specified SchemaType.

(Inherited from DbDataAdapter)
FillSchema(DataSet, SchemaType, String)

Adds a DataTable to the specified DataSet and configures the schema to match that in the data source based upon the specified SchemaType and DataTable.

(Inherited from DbDataAdapter)
FillSchema(DataSet, SchemaType, String, IDataReader)

Adds a DataTable to the specified DataSet.

(Inherited from DataAdapter)
FillSchema(DataTable, SchemaType)

Configures the schema of the specified DataTable based on the specified SchemaType.

(Inherited from DbDataAdapter)
FillSchema(DataTable, SchemaType, IDataReader)

Adds a DataTable to the specified DataSet.

(Inherited from DataAdapter)
FillSchema(DataTable, SchemaType, IDbCommand, CommandBehavior)

Configures the schema of the specified DataTable based on the specified SchemaType, command string, and CommandBehavior values.

(Inherited from DbDataAdapter)
GetBatchedParameter(Int32, Int32)

Returns a IDataParameter from one of the commands in the current batch.

(Inherited from DbDataAdapter)
GetBatchedRecordsAffected(Int32, Int32, Exception)

Returns information about an individual update attempt within a larger batched update.

(Inherited from DbDataAdapter)
GetFillParameters()

Gets the parameters set by the user when executing an SQL SELECT statement.

(Inherited from DbDataAdapter)
GetHashCode()

Serves as the default hash function.

(Inherited from Object)
GetLifetimeService()

Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
GetService(Type)

Returns an object that represents a service provided by the Component or by its Container.

(Inherited from Component)
GetType()

Gets the Type of the current instance.

(Inherited from Object)
HasTableMappings()

Indicates whether a DataTableMappingCollection has been created.

(Inherited from DataAdapter)
InitializeBatching()

Initializes batching for the DbDataAdapter.

(Inherited from DbDataAdapter)
InitializeLifetimeService()

Obtains a lifetime service object to control the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
MemberwiseClone()

Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean)

Creates a shallow copy of the current MarshalByRefObject object.

(Inherited from MarshalByRefObject)
OnRowUpdated(RowUpdatedEventArgs)

Raises the RowUpdated event of a .NET Framework data provider.

(Inherited from DbDataAdapter)
OnRowUpdating(RowUpdatingEventArgs)

Raises the RowUpdating event of a .NET Framework data provider.

(Inherited from DbDataAdapter)
ResetFillLoadOption()

Resets FillLoadOption to its default state and causes Fill(DataSet) to honor AcceptChangesDuringFill.

(Inherited from DataAdapter)
ShouldSerializeAcceptChangesDuringFill()

Determines whether the AcceptChangesDuringFill property should be persisted.

(Inherited from DataAdapter)
ShouldSerializeFillLoadOption()

Determines whether the FillLoadOption property should be persisted.

(Inherited from DataAdapter)
ShouldSerializeTableMappings()

Determines whether one or more DataTableMapping objects exist and they should be persisted.

(Inherited from DataAdapter)
TerminateBatching()

Ends batching for the DbDataAdapter.

(Inherited from DbDataAdapter)
ToString()

Returns a String containing the name of the Component, if any. This method should not be overridden.

(Inherited from Component)
Update(DataRow[])

Updates the values in the database by executing the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified array in the DataSet.

(Inherited from DbDataAdapter)
Update(DataRow[], DataTableMapping)

Updates the values in the database by executing the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified array of DataSet objects.

(Inherited from DbDataAdapter)
Update(DataSet)

Updates the values in the database by executing the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified DataSet.

(Inherited from DbDataAdapter)
Update(DataSet, String)

Updates the values in the database by executing the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the DataSet with the specified DataTable name.

(Inherited from DbDataAdapter)
Update(DataTable)

Updates the values in the database by executing the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified DataTable.

(Inherited from DbDataAdapter)

Events

Disposed

Occurs when the component is disposed by a call to the Dispose() method.

(Inherited from Component)
RowUpdated

Occurs during Update(DataSet) after a command is executed against the data source. The attempt to update is made. Therefore, the event occurs.

RowUpdating

Occurs during Update(DataSet) before a command is executed against the data source. The attempt to update is made. Therefore, the event occurs.

Explicit Interface Implementations

ICloneable.Clone()

For a description of this member, see Clone().

IDbDataAdapter.DeleteCommand

For a description of this member, see DeleteCommand.

IDbDataAdapter.InsertCommand

For a description of this member, see InsertCommand.

IDbDataAdapter.SelectCommand

For a description of this member, see SelectCommand.

IDbDataAdapter.UpdateCommand

For a description of this member, see UpdateCommand.

Fields

DefaultSourceTableName

The default name used by the DataAdapter object for table mappings.

(Inherited from DbDataAdapter)

Applies to

.NET Core

3.0 Preview 7

.NET Framework

4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6 4.5.2 4.5.1 4.5 4.0 3.5 3.0 2.0 1.1

.NET Platform Extensions

3.0 Preview 7

Xamarin.Mac

3.0

See also

Examples

Examples of OleDbDataAdapter Class
ASP.NET Code Input:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
       <title>Sample Page</title>
       <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
       <script runat="server" >
           Sub Page_Load()
               Dim xstr As String
               Dim xconn As New System.Data.OleDb.OleDbConnection
               xconn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=T:\test.mdb;User Id=admin;Password=;"
               xconn.Open()
               xstr = xstr + "Connection xconn to database test.mdb  is opened successfully.<br />"
               Dim xdata, ydata, zdata As New System.Data.DataSet
               Dim xadapt, yadapt As System.Data.OleDb.OleDbDataAdapter
               Dim sql As String
               sql = "SELECT * FROM T1"
               xadapt = New System.Data.OleDb.OleDbDataAdapter()
               Dim xcomm As System.Data.OleDb.OleDbCommand = new System.Data.OleDb.OleDbCommand()
               xcomm.Connection = xconn
               xcomm.CommandText = "Select * from T1"
               xadapt.SelectCommand = xcomm
               xstr = xstr + "Dataadapter xadapt is assigned to SELECT * FROM T1 through xconn successfully.<br />"
               xadapt.Fill(xdata,"T1")
               xstr = xstr + "Dataset xdata is filled with dataadapter xadapt.fill successfully.<br />"
               xstr = xstr + "Dataset xdata.tables(T1).rows(0).item(1):" + xdata.Tables("T1").Rows(0).Item("f1") + "<br />"
               
               
               Dim x1 As String ="5"
               Dim x2 As String ="6"
               xcomm.CommandText = "INSERT INTO T1 (f1, f2) VALUES ('"+x1+"', '"+x2+"')"
               xadapt.InsertCommand = xcomm
               Dim row As System.Data.DataRow = xdata.Tables(0).NewRow()
               row("f1") = x1
               row("f2") = x2
               xdata.Tables(0).Rows.Add(row)
               xstr = xstr + "One row is inserted to Dataset xdata successfully.<br />"
               Dim addedRows As System.Data.DataRow() = xdata.Tables("T1").Select(Nothing, Nothing, System.Data.DataViewRowState.Added)
               xadapt.Update(addedRows)
               xstr = xstr + "Database T1 is updated with dataadapter xadapt.update(addedrows) successfully.<br />"
               
               
               x1 ="1"
               x2 ="7"
               xcomm.CommandText = "UPDATE T1 SET f2 = '"+x2+"' WHERE f1= '"+x1+"'"
               xadapt.UpdateCommand = xcomm
               row = xdata.Tables(0).Rows(0)
               row("f2") = x2
               xstr = xstr + "One row of Dataset xdata is updated successfully.<br />"
               Dim modifiedRows As System.Data.DataRow() = xdata.Tables("T1").Select(Nothing, Nothing, System.Data.DataViewRowState.ModifiedCurrent)
               xadapt.Update(modifiedRows)
               xstr = xstr + "Database T1 is updated with dataadapter xadapt.update(modifiedrows) successfully.<br />"
               
               
               x1 ="5"
               xcomm.CommandText = "DELETE FROM T1 WHERE f1= '"+x1+"'"
               xadapt.DeleteCommand = xcomm
               row = xdata.Tables(0).Rows(2)
               row.Delete()
               xstr = xstr + "One row is deleted from Dataset xdata successfully.<br />"
               Dim deletedRows As System.Data.DataRow() = xdata.Tables("T1").Select(Nothing, Nothing, System.Data.DataViewRowState.Deleted)
               xadapt.Update(deletedRows)
               xstr = xstr + "Database T1 is updated with dataadapter xadapt.update(deletedrows) successfully.<br />"
               
               
               xadapt.Dispose()
               xdata.Dispose()
               xconn.Close()
               xstr = xstr + "Connection xconn is closed successfully.<br />"
               lbl01.Text = xstr
           End Sub
       </script>
    </head>
    <body>
<%Response.Write("<p>Results on "& Request.ServerVariables("SERVER_SOFTWARE") & " .net: " & System.Environment.Version.ToString & " " & ScriptEngine & " Version " & ScriptEngineMajorVersion & "." & ScriptEngineMinorVersion & "</p>")%>
       <% Response.Write ("<h1>This is a Sample Page of OleDbDataAdapter Class</h1>") %>
       <p>
           <%-- Set on Page_Load --%>
           <asp:Label id="lbl01" runat="server" />
       </p>
    </body>
</html>
HTML Web Page Embedded Output:

Source/Reference


©sideway

ID: 201000030 Last Updated: 30/10/2020 Revision: 0 Ref:

close

References

  1. Active Server Pages,  , http://msdn.microsoft.com/en-us/library/aa286483.aspx
  2. ASP Overview,  , http://msdn.microsoft.com/en-us/library/ms524929%28v=vs.90%29.aspx
  3. ASP Best Practices,  , http://technet.microsoft.com/en-us/library/cc939157.aspx
  4. ASP Built-in Objects,  , http://msdn.microsoft.com/en-us/library/ie/ms524716(v=vs.90).aspx
  5. Response Object,  , http://msdn.microsoft.com/en-us/library/ms525405(v=vs.90).aspx
  6. Request Object,  , http://msdn.microsoft.com/en-us/library/ms524948(v=vs.90).aspx
  7. Server Object (IIS),  , http://msdn.microsoft.com/en-us/library/ms525541(v=vs.90).aspx
  8. Application Object (IIS),  , http://msdn.microsoft.com/en-us/library/ms525360(v=vs.90).aspx
  9. Session Object (IIS),  , http://msdn.microsoft.com/en-us/library/ms524319(8v=vs.90).aspx
  10. ASPError Object,  , http://msdn.microsoft.com/en-us/library/ms524942(v=vs.90).aspx
  11. ObjectContext Object (IIS),  , http://msdn.microsoft.com/en-us/library/ms525667(v=vs.90).aspx
  12. Debugging Global.asa Files,  , http://msdn.microsoft.com/en-us/library/aa291249(v=vs.71).aspx
  13. How to: Debug Global.asa files,  , http://msdn.microsoft.com/en-us/library/ms241868(v=vs.80).aspx
  14. Calling COM Components from ASP Pages,  , http://msdn.microsoft.com/en-us/library/ms524620(v=VS.90).aspx
  15. IIS ASP Scripting Reference,  , http://msdn.microsoft.com/en-us/library/ms524664(v=vs.90).aspx
  16. ASP Keywords,  , http://msdn.microsoft.com/en-us/library/ms524672(v=vs.90).aspx
  17. Creating Simple ASP Pages,  , http://msdn.microsoft.com/en-us/library/ms524741(v=vs.90).aspx
  18. Including Files in ASP Applications,  , http://msdn.microsoft.com/en-us/library/ms524876(v=vs.90).aspx
  19. ASP Overview,  , http://msdn.microsoft.com/en-us/library/ms524929(v=vs.90).aspx
  20. FileSystemObject Object,  , http://msdn.microsoft.com/en-us/library/z9ty6h50(v=vs.84).aspx
  21. http://msdn.microsoft.com/en-us/library/windows/desktop/ms675944(v=vs.85).aspx,  , ADO Object Model
  22. ADO Fundamentals,  , http://msdn.microsoft.com/en-us/library/windows/desktop/ms680928(v=vs.85).aspx
close

Latest Updated LinksValid XHTML 1.0 Transitional Valid CSS!Nu Html Checker Firefox53 Chromena IExplorerna
IMAGE

Home 5

Business

Management

HBR 3

Information

Recreation

Hobbies 8

Culture

Chinese 1097

English 337

Reference 67

Computer

Hardware 151

Software

Application 198

Digitization 25

Latex 9

Manim 122

Numeric 19

Programming

Web 285

Unicode 494

HTML 65

CSS 59

ASP.NET 194

OS 391

DeskTop 7

Python 23

Knowledge

Mathematics

Formulas 8

Algebra 29

Number Theory 206

Trigonometry 18

Geometry 21

Calculus 67

Complex Analysis 21

Engineering

Tables 8

Mechanical

Mechanics 1

Rigid Bodies

Statics 92

Dynamics 37

Fluid 5

Fluid Kinematics 5

Control

Process Control 1

Acoustics 19

FiniteElement 2

Physics

Electric 27

Biology 1

Geography 1


Copyright © 2000-2020 Sideway . All rights reserved Disclaimers last modified on 06 September 2019