ADO.NET Data Model

ADO.NET Data Model: इस Chapter में हमने ADO.NET Data Model के Objects के Role को Detail से समझने की कोशिश की। फिर भी ADO.NET के विभिन्न Components को एक Summary के रूप में अग्रानुसार Specify कर सकते हैं, जिससे इस Model को याद रखना आसान हो सके।

ADO.NET Data Model पूरी तरह से System.Data Namespace पर आधारित है। हम बिना इस Namespace को अपने Application में Use किए हुए कोई भी Database Application Create नहीं कर सकते। यही Namespace विभिन्न प्रकार के Database Objects जैसे कि Tables, Rows, Columns Constraints आदि को Represent करने के लिए विभिन्न प्रकार के Types यानी Classes, Structures, Enumerations आदि को Define करता है। इस Namespace में मूल रूप से निम्न Core Members को Define किया गया होता है:

ADO.NET Data Model

जब हम ADO.NET के Disconnected Layer को Use करते हुए Database Programming करते हैं, तब हम System.Data Namespace में Define किए गए Types को ही सबसे ज्यादा उपयोग में लेते हैं, जिसके बारे में हमने आगे के Chapters में काफी विस्तार से Discuss किया है। फिर भी इस Namespace में Define की गई विभिन्न Common Functionalities को मोटे तौर पर समझना हमारे लिए आगे आने वाले Chapters के Concepts को समझने में काफी मदद करेगा।

IDbConnection Interface

इस Interface को हमेंशा Data Provider के Connection Object में Implement किया जाता है। ये Interface ऐसे Members का एक समूह Provide करता है, जिनका प्रयोग किसी Specific Data Store के साथ Connection को Configure करने के लिए किया जाता है। ये Interface ही हमें किसी Specific Data Provider के Transaction Object को Obtain करने की सुविधा भी प्रदान करता है। इस Interface का Formal Definition कुछ निम्नानुसार होता है:

public interface IDbConnection : IDisposable
{
  string ConnectionString { get; set; }
  int ConnectionTimeout { get; }
  string Database { get; }
  ConnectionState State { get; }

  IDbTransaction BeginTransaction();
  IDbTransaction BeginTransaction(IsolationLevel il);
  void ChangeDatabase(string databaseName);
  void Close();
  IDbCommand CreateCommand();
  void Open();
}

IDbTransaction Interface

इस Interface में Defined Overloaded BeginTransaction() Method Data Provider के Transaction Object को Access करने की सुविधा Provide करता है। इस Interface द्वारा Defined Members का प्रयोग करके हम Transactional Session व Underlying Data Source से Programmatically Interact कर सकते हैं। इस Interface में निम्न Members को Declare किया गया होता है:

public interface IDbTransaction : IDisposable
{
  IDbConnection Connection { get; }
  IsolationLevel IsolationLevel { get; }

  void Commit();
  void Rollback();
}

IDbCommand Interface

इस Interface को Data Provider के Command Object में Implement किया जाता है। अन्य Data Access Object Models की तरह ही, Command Object हमें Programmatically SQL Statements, Stored ProceduresParameterized Queries को Manipulate करने की सुविधा Provide करता है। Command Object हमें Data Provider के Data Reader Type को भी Overloaded ExecuteReader() Method के माध्‍यम से Access करने की सुविधा Provide करता है, ताकि हम Underlying Database को Modified Data Update करने के लिए Use कर सकें।

public interface IDbCommand : IDisposable
{
  string CommandText { get; set; }
  int CommandTimeout { get; set; }
  CommandType CommandType { get; set; }
  IDbConnection Connection { get; set; }
  IDataParameterCollection Parameters { get; }
  IDbTransaction Transaction { get; set; }
  UpdateRowSource UpdatedRowSource { get; set; }

  void Cancel();
  IDbDataParameter CreateParameter();
  int ExecuteNonQuery();
  IDataReader ExecuteReader();
  IDataReader ExecuteReader(CommandBehavior behavior);
  object ExecuteScalar();
  void Prepare();
}

IDbDataParameter and IDataParameter Interfaces

IDbCommand Object का Parameters Property एक Strongly Typed Collection Return करता है, जिसमें IDataParameterCollection को Implement किया गया होता है। ये Interface IDbDataParameter Compliant Class Types जैसे कि Parameter Objects, etc… को Access करने की सुविधा Provide करता है।

public interface IDbDataParameter : IDataParameter
{
  byte Precision { get; set; }
  byte Scale { get; set; }
  int Size { get; set; }
}

IDbDataParameter Interface, IDataParameter Interface को Extend करता है, ताकि उसे निम्नानुसार और Additional Behaviors प्राप्त हो सकें:

public interface IDataParameter
{
  DbType DbType { get; set; }
  ParameterDirection Direction { get; set; }
  bool IsNullable { get; }

  string ParameterName { get; set; }
  string SourceColumn { get; set; }

  DataRowVersion SourceVersion { get; set; }
  object Value { get; set; }
}

IDbDataParameter व IDataParameter Interface की Functionality हमें SQL Command या Stored Procedure में एक Specific ADO.NET Parameter Object के माध्‍यम से Hard-Coded String Literals के स्थान पर Parameters को Represent करने की सुविधा Provide करता है।

IdbDataAdapter and IDataAdapter Interfaces

हम DataSet Object के Data को Underlying Database से Retrieve करने अथवा Underlying Database में Save करने के लिए Data Adapters का प्रयोग करते हैं। इस जरूरत को पूरा करने के लिए IdbDataAdapter Interface में मूल रूप से चार Properties को Define किया गया है, जो कि Value के रूप में एक SQL Statement Accept करते हैं जो कि INSERT, UPDATE, DELETE या SELECT Operation से सम्बंधित होते हैं।

public interface IDbDataAdapter : IDataAdapter
{
  IDbCommand DeleteCommand { get; set; }
  IDbCommand InsertCommand { get; set; }
  IDbCommand SelectCommand { get; set; }
  IDbCommand UpdateCommand { get; set; }
}

इन चार Properties के अलावा ADO.NET Data Adapter Object IDataAdapter Interface में Defined Behaviors को भी Contained रखता है। ये Interface Data Adapter के मुख्‍य Functions को Define करता है, जिसके अन्तर्गत DataSet Object को Caller व Underlying Data Source के बीच Fill() Update() Methods के माध्‍यम से Data Retrieve/Transfer करने की सुविधा प्राप्त होती है। साथ ही IDataAdapter Interface, Database Column Names को User Friendly Names के रूप में Map करने के लिए TableMapping Property भी Provide करता है।

public interface IDataAdapter
{
  MissingMappingAction MissingMappingAction { get; set; }
  MissingSchemaAction MissingSchemaAction { get; set; }
  ITableMappingCollection TableMappings { get; }

  int Fill(DataSet dataSet);
  DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType);
  IDataParameter[] GetFillParameters();
  int Update(DataSet dataSet);
}

IDataReader and IDataRecord Interfaces

IDataReader Interfaces विभिन्न प्रकार के Data Providers द्वारा Supported Common Behaviors को Data Reader Object के माध्‍यम से Define करने का काम करते हैं। जब हम किसी ADO.NET Data Provider द्वारा कोई IDataReader Compatible Type Obtain करते हैं, तो इस Retrieved Object के Resultset को हम केवल Forward-Only व Read-Only Manner में ही Iterate कर सकते हैं।

public interface IDataReader : IDisposable, IDataRecord
{
  int Depth { get; }
  bool IsClosed { get; }
  int RecordsAffected { get; }
  void Close();
  DataTable GetSchemaTable();
  bool NextResult();
  bool Read();
}

अन्त में IDataReader, IDataRecord को Extend करता है, जो कई ऐसे Members Define करता है, जो हमें किसी Stream से Strongly Typed Objects Retrieve करने की सुविधा Provide करता है। परिणामस्वरूप हमें DataReader द्वारा Return होने वाले Indexer Method को System.Object Type के Generic Object के रूप में Cast करने की जरूरत नहीं रहती।

public interface IDataRecord
{
  int FieldCount { get; }
  object this[ string name ] { get; }
  object this[ int i ] { get; }
  bool GetBoolean(int i);
  byte GetByte(int i);
  char GetChar(int i);
  DateTime GetDateTime(int i);
  decimal GetDecimal(int i);
  float GetFloat(int i);
  short GetInt16(int i);
  int GetInt32(int i);
  long GetInt64(int i);
  ...
  bool IsDBNull(int i);
}

चूंकि, इस Interface की Listing बहुत बडी है, इसलिए यहां हमने केवल Partial Listing ही Display की है।

हम IDataReader.IsDbNull() Method का प्रयोग करके Data Reader से Value Retrieve करने से पहले Programmatically इस बात का पता लगा सकते हैं कि Specify किया गया Field null Value से Set है या नहीं।

Data Provider Abstraction Using Interface

जैसाकि इस Chapter के Discussion से हम समझ सकते हैं कि सभी .NET Data Providers में कुछ Common Functionalities Exist होती हैं। जहां हालांकि Underlying Data Source अलग तरीके से काम करता है, लेकिन उन Functionalities को Use करने के लिए हमें Common Names को Use करना होता है और ऐसा इसीलिए सम्भव हो सकता है क्योंकि .NET Framework, Interface Based Polymorphism को Implement करता है।

उदाहरण के लिए जब हम कोई ऐसा Method Define करते हैं, जो कि IDbConnection Type का एक Parameter Accept करता है, तो उसमें Parameter के रूप में हम ADO.NET के किसी भी Connection Object को Pass कर सकते हैं, फिर भले ही वह Connection Object, SQL Server से सम्बंधित हो या Oracle से। जैसे:

public static void OpenConnection(IDbConnection cn)
{
  // Open the incoming connection for the caller.
  cn.Open();
}

जरूरी नहीं है कि हम Interface को ही इस तरह से Use कर सकते हैं। बल्कि हम किसी Abstract Base Class जैसे कि DbConnection को भी Parameter या Return Value के रूप में उपरोक्तानुसार Use कर सकते हैं।

Using Application Configuration File

ADO.NET Application की Flexibility Increase करने के लिए हम Client-Side में *.config File Create कर सकते हैं, जिसका प्रयोग Custom Key/Value Pair के रूप में <appSettings> Element में Configuration Information को Setup करने के लिए किया जा सकता है। जैसे:

<configuration>
  <appSettings>
    <!-- This key value maps to one of our enum values. -->
    <add key="provider" value="System.Data.SqlClient"/>
  </appSettings>
</configuration>

इस Configuration File के माध्‍यम से हम हमारे Application को बेहतर तरीके से Control कर सकते हैं, जिसमें हमने Data Provider की Information को निम्नानुसार Statement द्वारा Specify किया है:

    <add key=”provider” value=”SqlServer“/>

परिणामस्वरूप यदि हमें हमारे Database Application के Underlying Data Source को Change करना हो, तो हमें केवल इस Configuration File को ही निम्नानुसार Modify करने की जरूरत पडती है:

    <add key=”provider” value=”System.Data.OracleClient“/>

और हमारा Database Application Oracle Data Source के लिए उपयोगी हो जाता है। <appSettings> Element के स्थान पर यदि हम चाहें तो <connectionStrings> Element को भी Use कर सकते हैं। इस Element में हम जितने चाहें उतने Name/Value Pairs को Define कर सकते हैं, जिन्हें Programmatically ConfigurationManager.ConnectionStrings Indexer के माध्‍यम से Read किया जा सकता है। इस Element को Use करने का एक फा;दा ये है कि हम एक Single Application के लिए Consistent Manner में एक से ज्यादा Connection Strings को Define कर सकते हैं। जैसे:

<configuration>
  <appSettings>
    <!-- Which provider? -->
    <add key="provider" value="System.Data.SqlClient" />
  </appSettings>

  <!-- Here are the connection strings. -->
  <connectionStrings>
    <add name ="NorthwindSQLProvider" connectionString = "Data Source=(local)\SQLEXPRESS; Integrated Security=SSPI;Initial Catalog=Customers"/>

    <add name =" NorthwindOLEProvider" connectionString = "Provider=SQLOLEDB; Data Source=(local)\SQLEXPRESS; Integrated Security=SSPI; Initial Catalog=Customers"/>
  </connectionStrings>
</configuration>

इस तरह से हम हमारी जरूरत व सुविधा के अनुसार अपने हर Application के लिए एक Configuration File Create कर सकते हैं, जिसके माध्‍यम से हम हमारे Database Application को ज्यादा बेहतर तरीके से Control, Handle व Deploy कर सकते हैं।

ADO.NET with C# in Hindi - BccFalna.com: TechTalks in Hindi ये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook ADO.NET with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

ADO.NET with C# in Hindi | Page:501 | Format: PDF

BUY NOW GET DEMO REVIEWS