Saturday, August 27, 2011

Difference between abstract classes and interfaces

What is the difference between an interface and an abstract class ?

Interface

Abstract Class

Interfaces are implemented  i.e.
instances of interfaces cannot be created by derived classes.

Classes are inherited   i.e.
derived classes do create instances of abstract classes

You cannot use access specifiers with members of an interface. All interface
members are implicitly public and cannot have any other access specifier.

Members of abstract class can have all access specifiers except private i.e.
they can be internal, public, protected and protected internal but not private.

All the members of an interface are implicitly abstract (although you cannot
explicitly use abstract keyword because it not allowed to use access specifiers
in interface).

An abstract class can have non-abstract members.

Interface cannot have static members.

Abstract classes can have non-abstract static members.

A class can inherit one or more interfaces.

A class can inherit from only one abstract (or non-abstract ) class.

Modifying an interface results in breaking the existing clients. This is because
clients must implement all interface members, and interface members are only
declarations , no code or values are allowed.

Not all modifications in an abstract class break existing clients. E.g. adding a
new non-abstract method to the base abstract class will not break existing
clients.

Interfaces CANNOT have constructors and destructors.

Constructors and destructors ARE ALLOWED in abstract classes.
The abstract class constructors cannot be abstract or private.

When will an abstract class become equivalent to an interface ?
To equivalent to an interface , the abstract class must meet following conditions :
•    All of its members must be abstract.
•    It should not have members other than methods,properties,events and indexers.
•    Access modifiers to all of its members must be public.


Tuesday, August 23, 2011

On DbCommand, ExecuteReader, ExecuteScalar, etc and creating database through ADO.NET

Ideally we run a DML query in ExecuteNonQuery.
What will happen when a DML query is run in ExecuteReader,ExecuteScalar,or ExecuteXmlReader  ?


ExecuteReader
No Exception is thrown, RecordsAffected contains the number of records affected.
HasRows returns false, .Read returns false, RecordsAffected contains number of records afftected.
When read is attempted, error "Invalid attempt to read when no data is present" is thrown

ExecuteScalar
No Exception is thrown, query is executed, however NULL object is returned,
Returns the first column of first row, is not found returns null ( null object).
When the return value is actually null, DBNull.Value is returned.

ExecuteXmlReader
InvalidOperationException is thrown , however, query is executed before throwing an exception.
        "Invalid command sent to ExecuteXmlReader.  The command must return an Xml result."   

Another interesting question :
Can you create database and other objects using the DbCommand objects?
YES.
But you cannot immediaately switch to the database because you cannot use GO statements in
DbCommand command texts, so you need to change the connection string to change 'Initial Catalog' name
and then issue rest of commands.

What are the attributes of connection string ?

Data Source : Name/IP of the server
Initial Catalog : Name of the database
User ID  : User id
Password : user password
Persist Secutiry Info : True by default.