Click here to Skip to main content
Click here to Skip to main content

Database Helper Class Library to Ease Database Operation

By , 14 Apr 2007
 

Introduction

Database Helper Class Library is a set of class library that helps to make operation of accessing database easier. By using the class library, life will be easier as you can almost select data, insert data, update data, or delete data from database even without writing a single line of SQL statement. As a database application developer, there are 2 tedious tasks, which are the main source of headaches. One is the business logic and another one is the effort of repeating the same code snippets while accessing database to perform SQL statements. The database helper class library will solve the second headache and make developers have more time to focus on business logic.

This class library is not the object mapping stuff that generates various classes for corresponding tables nor stuff that generate data access layer classes automatically. It is a set of classes that can be set to perform database operation on a table very easily. It is very suitable to be used in small and medium scale database application development.

Background

With 4 years of experience as a database application developer, I found that the repetitious block of codes when executing every SQL statement is very time consuming. As a result, I tried to minimize this tedious process and started surfing the net. I found many answers, some of them are:

  • Object Mapping - Tools that will generate classes for every corresponding table. I think this is suitable for large scale project only.
  • Data Access Layer - Tools that will generate data access layer automatically. Again, I think it is useful in large scale projects only. Example is LLBLGen.
  • Data Component - Component that tightly integrates with frond end component and can be used to update a table easily. Example is TTable component in Delphi.

Based on the answers I got, I think there is a need to create a class library that is similar to data component as mentioned above but will not integrate tightly with interface. Based on Data Access Application Block as released by Microsoft Patterns and Practices (I don't want to use data access component in Enterprise Library as it is too heavy weight), LLBLGen version 1 (free for version 1) and some of my brain juice, I had churned out this Database Helper Class Library which has a feature of TTable component and other more useful features. This class library is very useful for backend processing and front end table maintenance task in small and medium scale project.

Using the Code

For Database Helper Class Library, the most useful classes are SqlTableHelper, SqlHelper, SqlDataSetHelper and SqlConnectionProvider. SqlTableHelper is a class to help to perform database operation on a table without writing a single line of SQL statement. SqlHelper is to help to execute other customized SQL statements easily. SqlDataSetHelper is a class related to database relationship and makes retrieving related data row easier. At last, SqlConnectionProvider is a class that provides database connection and can span among 1 or more SqlTableHelpers and SqlHelpers. This make control of database transaction among several tables easier.

SqlTableHelper Samples

Select Samples

To select some rows from a table based on SelectCriteria property.

DataTable tblData;

//It is good to clear table helper instance's data table first b4
//start select any data
mobjTableHelper.Data.Clear();

//Get Sort criteria to apply to select action
if (mtxtSort.Text.Length > 0)
{
    mobjTableHelper.Sort = mtxtSort.Text.Trim();
}

//select some rows based on select criteria and return a data table instance
//e.g. ItemName = 'Pen'
mobjTableHelper.SelectCriteria = mtxtSelectCriteria.Text;
tblData = mobjTableHelper.SelectSome();
mdgrData.DataSource = tblData;

Insert Samples

To insert a row into a table.

//retrieve data table instance from table helper to prepare for insertion
DataTable tblData = mobjTableHelper.Data;
tblData.Rows.Clear();

//prepare new row to insert
DataRow row = tblData.NewRow();
row["ItemName"] = mtxtItemNameInsert.Text.Trim();
row["ItemPrice"] = Convert.ToDecimal(mtxtItemPriceInsert.Text);
row["ItemOnHand"] = Convert.ToInt32(mtxtItemOnHandInsert.Text);
tblData.Rows.Add(row);

mobjCnnProvider.OpenConnection();
mobjTableHelper.Insert();
mobjCnnProvider.CloseConnection();

Update Samples

To update some rows in a table based on UpdateCriteria property.

DataTable tblData;
DataRow row;

//update some recs for item price field ONLY
mobjTableHelper.FieldsToUpdate = "ItemPrice";
mobjTableHelper.Compile();

//must clear the records first to avoid confusion with any previous selection
tblData = mobjTableHelper.Data;
tblData.Rows.Clear();

//prepare row for update using filter expression
row = tblData.NewRow();
row["ItemPrice"] = Convert.ToDecimal(mtxtItemPriceUpdate.Text);
tblData.Rows.Add(row);

//update using primary key
mobjTableHelper.CriteriaType = DBCriteria.UseFilterExpression;
mobjTableHelper.UpdateCriteria = mtxtFilterExpUpd.Text.Trim();

mobjCnnProvider.OpenConnection();
mobjTableHelper.Update();
mobjCnnProvider.CloseConnection();

MessageBox.Show(String.Format("{0} rec is updated.", mobjTableHelper.RowsAffected));

Delete Samples

To delete some rows in a table based on DeleteCriteria property.

DataTable tblData;
DataRow row;

//clear records in data table instance first to avoid 
//confusion with previous selection
tblData = mobjTableHelper.Data;
tblData.Rows.Clear();

//delete using filter expression
mobjTableHelper.CriteriaType = DBCriteria.UseFilterExpression;
mobjTableHelper.DeleteCriteria = mtxtFilterExpDel.Text.Trim();

mobjCnnProvider.OpenConnection();
mobjTableHelper.Delete();
mobjCnnProvider.CloseConnection();

MessageBox.Show(String.Format("{0} rec is deleted.", mobjTableHelper.RowsAffected)); 

Important Things to Note

For SqlTableHelper instance, Compile method must be called at least 1 time before any database operation can be performed. If FieldToSelect and/or FieldToUpdate property value is reset, Compile method must be recalled so that new fields to select and/or update can work.

SqlHelper Samples

SqlHelper is a class that is used to perform customized SQL statements, e.g. stored procedure that cannot be done through SqlTableHelper class.

ExecuteNonQuery Samples

The example shown is to execute stored procedure sp_UpdItem.

int iItemID;
double dblItemPrice;
int iItemOnHand;
int iItemOnHand3x;

int iRetVal;
Hashtable hstOutput;
int iRowsAffected;
StringBuilder strbTemp;

strbTemp = new StringBuilder(100);

iItemID = Convert.ToInt32(mtxtItemID.Text.Trim());
dblItemPrice = Convert.ToDouble(mtxtItemPrice.Text.Trim());
iItemOnHand = Convert.ToInt32(mtxtItemOnHand.Text.Trim());
iItemOnHand3x = 0;

//update using stored procedure and 1 type of ExecuteNonQuery overloads
//you can try other overloads that achieve same result
mobjSqlHelper.ExecuteNonQuery
	("sp_UpdItem", iItemID, dblItemPrice, iItemOnHand, iItemOnHand3x);

//display executing result
iRetVal = mobjSqlHelper.ReturnValue;
hstOutput = mobjSqlHelper.OutputValue;
iRowsAffected = mobjSqlHelper.RowsAffected;

strbTemp.Append("Return Value: " + mobjSqlHelper.ReturnValue + "\n");
if (hstOutput != null && hstOutput.Count > 0) 
{
    strbTemp.Append("Output Value: \n");
    foreach (DictionaryEntry entry in hstOutput)
    {
        strbTemp.Append(entry.Key + ": " + entry.Value + "\n");
    }
}
strbTemp.Append("Rows Affected: " + iRowsAffected + "\n");

MessageBox.Show(strbTemp.ToString());

ExecuteDataset Samples

The example shown is to execute stored procedure sp_SelItem.

string strItemName;
int iRetVal;
Hashtable hstOutput;
int iRowsAffected;
StringBuilder strbTemp;

DataSet dsData;
DataTable tblData;
DataRow row;

strbTemp = new StringBuilder(100);

strItemName = mtxtItemName.Text.Trim();

//prepare row for selecting purpose
tblData = new DataTable();
tblData.Columns.Add("strItemName", typeof (string));
row = tblData.NewRow();
row["strItemName"] = strItemName;

//select using stored procedure and 1 type of ExecuteDataset overloads
//you can try other overloads that achieve same result
dsData = mobjSqlHelper.ExecuteDatasetTypedParams("sp_SelItem", row);

//display executing result
iRetVal = mobjSqlHelper.ReturnValue;
hstOutput = mobjSqlHelper.OutputValue;
iRowsAffected = mobjSqlHelper.RowsAffected;

strbTemp.Append("Return Value: " + mobjSqlHelper.ReturnValue + "\n");
if (hstOutput != null && hstOutput.Count > 0) 
{
    strbTemp.Append("Output Value: \n");
    foreach (DictionaryEntry entry in hstOutput)
    {
        strbTemp.Append(entry.Key + ": " + entry.Value + "\n");
    }
}
strbTemp.Append("Rows Affected: " + iRowsAffected + "\n");

MessageBox.Show(strbTemp.ToString());

//display return dataset value
strbTemp.Remove(0, strbTemp.Length);
tblData = dsData.Tables[0];
foreach (DataRow rowData in tblData.Rows)
{
    foreach (DataColumn col in tblData.Columns)
    {
        strbTemp.Append(col.ColumnName + ": " + rowData[col.ColumnName] + "\n");
    }
}

MessageBox.Show(this, strbTemp.ToString(), "DataSet result");

ExecuteXmlReader Samples

The example is to execute customized Select SQL statement.

string strItemName;
int iRetVal;
Hashtable hstOutput;
int iRowsAffected;

string strSQL;
StringBuilder strbTemp;

XmlReader xmlr;
SqlParameter[] apar = new SqlParameter[1];

strbTemp = new StringBuilder(100);

strItemName = mtxtItemName.Text.Trim();

//prepare sql parameters for updating purpose
apar[0] = new SqlParameter
	("@strItemName", SqlDbType.NVarChar, 50, ParameterDirection.Input,
    false, 0, 0, "", DataRowVersion.Default, strItemName);
strSQL = "SELECT * FROM x_Item WHERE ItemName = @strItemName FOR XML AUTO";

//select using inline SQL and 1 type of ExecuteDataset overloads
//you can try other overloads that achieve same result
xmlr = mobjSqlHelper.ExecuteXmlReader(CommandType.Text, strSQL, apar);

//display executing result
iRetVal = mobjSqlHelper.ReturnValue;
hstOutput = mobjSqlHelper.OutputValue;
iRowsAffected = mobjSqlHelper.RowsAffected;

strbTemp.Append("Return Value: " + mobjSqlHelper.ReturnValue + "\n");
if (hstOutput != null && hstOutput.Count > 0) 
{
    strbTemp.Append("Output Value: \n");
    foreach (DictionaryEntry entry in hstOutput)
    {
        strbTemp.Append(entry.Key + ": " + entry.Value + "\n");
    }
}
strbTemp.Append("Rows Affected: " + iRowsAffected + "\n");

MessageBox.Show(strbTemp.ToString());

//display return dataset value
strbTemp.Remove(0, strbTemp.Length);
while (xmlr.Read())
{
    strbTemp.Append(xmlr.ReadOuterXml() + "\n");
}

MessageBox.Show(this, strbTemp.ToString(), "XML Reader result");

SqlDataSetHelper Samples

You can use SqlDataSetHelper.FillParents method or SqlDataSetHelper.FillChilds method which is static to retrieve all related tables' rows once all the parent or child relationships are defined. Example is as follows:

int iSelected;
string strSelected;

//add foreign keys, apply same concept for parent relationship situation
mobjOrderHeaderTblHelper.ChildRelations.Clear();
mobjOrderDetailsTblHelper.ChildRelations.Clear();
mobjOrderHeaderTblHelper.AddForeignKeys
	(mobjOrderDetailsTblHelper, new string[] {"OrderDetailsOrderHeaderID"});
//add foreign relationship explicitly as foreign key in x_Item not reference primary key
//in x_OrderDetails
mobjOrderDetailsTblHelper.ChildRelations.Add("x_OrderDetailsFKx_Item|ItemID", 
    mobjOrderDetailsTblHelper, mobjItemTblHelper,
    new DataColumn[] {mobjOrderDetailsTblHelper.Data.Columns["OrderDetailsItemID"]},
    new DataColumn[] {mobjItemTblHelper.Data.Columns["ItemID"]});
    
//construct beginning row to retrieve child rows
iSelected = Convert.ToInt32(mdgrOrderHeader[mdgrOrderHeader.CurrentRowIndex, 0]);
Console.WriteLine("Order Header ID: " + iSelected);
strSelected = String.Format("OrderHeaderID = {0}", iSelected);

//clear data before retrieve foreign/child records
mobjOrderHeaderTblHelper.Data.Clear();
mobjOrderDetailsTblHelper.Data.Clear();
mobjItemTblHelper.Data.Clear();

mobjCnnProvider.OpenConnection();
mobjCnnProvider.BeginTransaction();

//retrieve all related child/foreign rows based on select criteria for top table helper.
//use FillParents for retrieving all related parent rows case
SqlDataSetHelper.FillChilds(mobjOrderHeaderTblHelper, strSelected);

mobjCnnProvider.CommitTransaction();
mobjCnnProvider.CloseConnection();

mdgrOrderHeader.DataSource = mobjOrderHeaderTblHelper.Data;
mdgrOrderDetails.DataSource = mobjOrderDetailsTblHelper.Data;
mdgrItem.DataSource = mobjItemTblHelper.Data;

Points of Interest

When I developed this class library, I learnt that object mapping and auto-generated data access layer method are useful only for large scale projects where there are many programmers for the project. For small and medium scale projects where there are 1 or 2 developers normally, why not we consider every table as an object. With the concept - a table is an object; I developed the SqlTableHelper class.

History

  • 03/25/2007: Original article
  • 04/14/2007: Updated demo zip file

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

falconsoon
Malaysia Malaysia
Member
Had worked as analyst programmer for 4 years. Now helping in family business but still involved actively in .Net development whenever there is a free time.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralDAABmvpMark Nischalke24 Mar '07 - 15:23 
Please, explain why you feel the DAAB is too heavy and what makes this is library different, or better, then the plethora of other Data Access Librarys found in existing articles and numerous samples from other sources.
 

only two letters away from being an asset

AnswerRe: DAABmemberfalconsoon30 Mar '07 - 5:18 
I am not saying DAAB - data access application block version 2 (verson which is stand alone and not integrate in Enterprise Library) is too heavy. Actually, my library is built based on some classes from DAAB.
 
I said that DAAB version in Enterprise Library is too heavy as it needs other application blocks to work such as Configuration Application Block.
 
Most Data Access Library found in existing articles is a tool to generate data access layer dynamically. But, my solution is not generate any codes, it just need to instance a class to perform all database operation on a table. It is very suitable for small and medium project where there are 1 or 2 programmer only. Just imagine, if only 1 programmer works on a project, do you want to use a tool to generate data access layer and then work on the data access layer. It is tedious. So, my solution make a programmer perform database operation on a table without generating any codes. It save your time and effort.
 
Circle is eternity.

GeneralRe: DAABmvpMark Nischalke30 Mar '07 - 6:10 
Unless I'm missing something, DAAB is part of the Enterprise Library and fully integrated with it. Where is the stand alone version? Do you have a link?
 
Working in teams of all sizes, from one to 50+ developers, I can say that I would rather use the EntLib. Your code may be fine for your very limited experience and for dabbeling with the family business but not something I would use in a mission critical enterprise application.
 

only two letters away from being an asset

GeneralRe: DAABmemberfalconsoon30 Mar '07 - 19:53 
Before Microsoft developed Enterprise Library, there are stand alone version for application blocks in Enterprise Library. For Data Access Application Block, Microsoft had restructured it in Enterprise Library totally which use factory concept and can access MS SQL server or Oracle database easily. The previous stand alone version 2 was released in 2004 and can access MS SQL server only.
 
The Data Access Application Block version 2 link is
http://www.microsoft.com/downloads/details.aspx?FamilyID=f63d1f0a-9877-4a7b-88ec-0426b48df275&DisplayLang=en
 
I do not agree with you that it should not be used in a mission critical enterprise application. If the misson critical enterprise application is small and not performance-driven, why you should use a heavy weight enterprise library. The exception is if you want to integrate it with other part of system which also use enterprise library to make consistency.
 
As my previous reply, the library is very suitable for small and medium project which is developed by 1 or 2 programmer only and normally used in retail shop. Some of its example is POS, Inventory Control Sytem, Accounting System, or any customized system as requested by customer.
 
Circle is eternity.

GeneralRe: DAABmvpMark Nischalke31 Mar '07 - 17:26 
A newer version of this application block has been released as a part of the patterns & practices Enterprise Library. The new version includes updated functionality based on customer feedback, as well as improved extensibility, ease of use, and consistency and integration with other blocks in Enterprise Library. The application block you have requested is still available for download but is now considered as an archive release.
 
The above is from the link you provided. DAAB 2.0 is outdated and has been replaced.
 
If you actually had some experience on applications beyond the family business/hobbyist level you would understand the model behind the EntLib and recognize it's benefits; yes it has some limitations, but your's far exceeds those. Again, your library, although an interesting side project, is not worth using or replacing other, more robust libraries. Do some reseach and education before your reply or submit another article.
 

only two letters away from being an asset

GeneralRe: DAABmemberfalconsoon1 Apr '07 - 2:01 
Note that I had 4 years of experience working as analyst programmer in IT and not my family business. I had worked on POS, Procurement, and many customized business projects. While I develop my library, I was working as analyst programmer and not helping my family business.
 
I know the benifits of EntLib. I also believe that "The best method is the most suitable method for a situation". So, does the newer Windows Presentation Foundation in .Net 3.0 will replace WinForm? Sometimes, an older version is better than newer one.
 
Take a consideration, if your boss told you to develop a customized project and the project is small and you are the only programmer to work on it, do you will still use EntLib to develop it. Please justify it as it need more time and more effort.
 
Furthermore, my library is not intended to compete with EntLib-likes framework which is very suitable to be used in big-scale project nor it is to replace any other frameworks. I just suggest an option and thinks it is very suitable to used in small and medium project.
 
Circle is eternity.

GeneralRe: DAABmvpMark Nischalke1 Apr '07 - 5:55 
With the EntLib I can use configuration files to control a great deal of the application. Your library doesn't allow for this. If the database changed from SQL Server to Oracle, or another provider, or visa versa, how would an applicaiton using your libary deal with this? How does your library address different data providers. You are limited to SQL Server. In a good many organizations there are both SQL Serve and Oracle databases that must be accessed, even within the same application.
 
Your exception handling is cumbersome and flawed
 
catch (Exception ex)
{
if (ex is SqlException)
{
SqlException exSql = (SqlException)ex;
miErrorCode = exSql.Number;
}
throw ex;
}

 
should be replaced with
 

catch (SqlException ex)
{
miErrorCode = exSql.Number;
throw;
}

 
What if you wanted to add logging to the exception handling?
 
I don't have the time, nor desire, to point out all of the flaws in your code. In short your library is written for your needs, for a very small area, not for use in other projects by other developers. It is not scalable nor easily configurable to meet the needs of a real application.
 
Find another hobby.
 

only two letters away from being an asset

GeneralRe: DAABmemberfalconsoon1 Apr '07 - 6:33 
For EntLib, all application blocks are integrated. This is the benifits and also the drawback of EntLib. I know that you can use configuration application blocks to control your application. But, what happen if I am not prefer using configuration file but to control my application by other way, e.g put all settings in database.
 
My point at exception handling is to catch all unexpected exception (may be out of memory) besides sql exception. Note that in code, I save the Sql Error no. if the exception is SQL exception. Then, I rethrow the exception.
 
If you want to log exception, you can free to use other exception handling library or your own ones. My point at here, you can integrate vary applicaton blocks easily to achieve your goal. My library responsibility at here is to act as helper class to database access operation. It even can work side by side with other DAAB. If you look into my code in details, you will note that I also make use of Microsoft Exception Handling Application Block (earlier version but stand alone) to create my custom exception. To logging, you can easily use this application block to log exception.
 
There are always flaws in a library. Codes will be better only after you test it and debug it. I truly welcome any good feedback or suggestion on my library.
 
Do you know sometimes a hobbyist can do even better that a professionist?
 
Circle is eternity.

GeneralRe: DAABmvpMark Nischalke1 Apr '07 - 13:51 
falconsoon wrote:
My point at exception handling is to catch all unexpected exception

 
The the proper way to to do this would be
 
catch(SqlException ex)
{
 
}
catch(Some other exception)
{
 
}
catch(Exception ex)
{
 
}

 
The difference between professionally written code and a hobbyist.
 
falconsoon wrote:
For EntLib, all application blocks are integrated.

Doesn't mean you have to use them all.
 
falconsoon wrote:
To logging, you can easily use this application block to log exception.

By adding it to your library and recompiling the code base. Not very configuable and maintainable.
 
falconsoon wrote:
Do you know sometimes a hobbyist can do even better that a professionist?

Perhaps, but not you.
 
You have failed several times to address the original statement: Please, explain why you feel the DAAB is too heavy and what makes this is library different, or better, then the plethora of other Data Access Librarys found in existing articles and numerous samples from other sources.
 
Please, take the time answer this, or don't answer at all.
 

 

only two letters away from being an asset

GeneralRe: DAABmemberfalconsoon1 Apr '07 - 16:46 
Mark Nischalke wrote:
The the proper way to to do this would be
 
catch(SqlException ex)
{
 
}
catch(Some other exception)
{
 
}
catch(Exception ex)
{
 
}
 
If code like this, you need to re-throw every exception in every catch block. If you differentiate hobbyist and professionist by this snippets of code only, I wonder your profession.
 
Mark Nischalke wrote:
By adding it to your library and recompiling the code base. Not very configuable and maintainable.
 
Please point out why it is not very configurable and maintainable. I know that many programmer like to use framework without knowing how the framework works. This cause problem when they meet something that cannot be done using the framework. My point here is to make all individual framework stand alone, e.g. Exception Handling Block, DAAB, and Configuration Block, then you can easily integrate them to achieve maximum flexibility.
 
Mark Nischalke wrote:
Perhaps, but not you.
 
When I worked full time as analyst programmer for 4 years, I met many programmers who code bugging system. So, I am sure I am better than someone even I am hobbyist by now.
 
Mark Nischalke wrote:
You have failed several times to address the original statement: Please, explain why you feel the DAAB is too heavy and what makes this is library different, or better, then the plethora of other Data Access Librarys found in existing articles and numerous samples from other sources.
 
Unless, I make a mistake to say that DAAB in EntLib is heavy. My real meaning is the whole EntLib is heavy weight. If you want to use DAAB only, you need to add the whole EntLib to your project and configure the DAAB using Configuration Application Block.
 
My library can let user perform database operation on a table without writing a single line of SQL using SqlTableHelper class. Please read through my article carefully. My library also make connection and database transaction very easy to control while maintain its flexibility. For example:

 
mobjCnnProvider = new SqlConnectionProvider();
mobjCnnProvider.ConnectionString = "Initial Catalog=SwComponent;Data Source=amenthyst;UID=sa;Password=vios";
			
//Initialize table helper
mobjOrderHeader = new SqlTableHelper("OrderHeader");
mobjOrderDetails = new SqlTableHelper("OrderDetails");
mobjOrderHeader.MainConnectionProvider = mobjCnnProvider;
mobjOrderDetails.MainConnectionProvider = mobjCnnProvider;
mobjOrderHeader.Compile();
mobjOrderDetails.Compile();
 
//prepare datatable to insert
.
.
.
 
mobjCnnProvider.OpenConnection();
mobjCnnProvider.BeginTransaction();
 
mobjOrderHeader.Insert();
mobjOrderDetails.Insert();
 
mobjCnnProvider.CommitTransaction();
mobjCnnProvider.CloseConnection();
//no SQL statement at all
 
There are plethora of other Data Access Library, some even don't have difference but only the implementaion method is different. As a result, it is just a whether favour meet your taste question. If my library don't meet your taste, don't use it and don't say it is useless.
 
Circle is eternity.

GeneralRe: DAABmvpMark Nischalke1 Apr '07 - 17:29 
falconsoon wrote:
catch(SqlException ex){}catch(Some other exception){}catch(Exception ex){}
 
If code like this, you need to re-throw every exception in every catch block. If you differentiate hobbyist and professionist by this snippets of code only, I wonder your profession.

 
If you do some reading and research on Exception Handling this is the way it is done. Perhaps not every exception need be rethown to the user of the library. Perhaps an internal exception may be handled. Perhaps different exceptions should be handled and logged in a different manner. Your method does not allow for this.
 
falconsoon wrote:
If you want to use DAAB only, you need to add the whole EntLib to your project

Your ignorance shows again. You do not need to add the entire Enterprise Library to use just the data access block.
 

falconsoon wrote:
Please point out why it is not very configurable and maintainable.

Laugh | :laugh: Laugh | :laugh: Laugh | :laugh: Please stop, it hurts when I laugh so much.
 

I grow weary of this. Again you have failed to answer and justify your library. You have only reiterated your ignorance of professional development. Save yourself further embassment and don't reply. If you want further tutoring contact me offline and we can arrange a fee. Afterall, I'm a professional, not a hobbyist, my time is valuable.
 

 

only two letters away from being an asset

GeneralRe: DAABmemberfalconsoon1 Apr '07 - 21:47 

Mark Nischalke wrote:
If you do some reading and research on Exception Handling this is the way it is done. Perhaps not every exception need be rethown to the user of the library. Perhaps an internal exception may be handled. Perhaps different exceptions should be handled and logged in a different manner. Your method does not allow for this.

My point here is to let all exceptions handled by users. You show yours ignorance here as you only look at things from 1 point only. What's a shame!Laugh | :laugh: Laugh | :laugh: Poke tongue | ;-P
 

Mark Nischalke wrote:
Your ignorance shows again. You do not need to add the entire Enterprise Library to use just the data access block.

But, you sill need to add Configuration Application Block and Common Block to use data access block. This leave no choice for user to choose their favoured configuration method.
 

Mark Nischalke wrote:
Please stop, it hurts when I laugh so much.

You point out nothing. What's a ignorant!Laugh | :laugh: Laugh | :laugh: Laugh | :laugh:
 

Mark Nischalke wrote:
I grow weary of this. Again you have failed to answer and justify your library. You have only reiterated your ignorance of professional development. Save yourself further embassment and don't reply. If you want further tutoring contact me offline and we can arrange a fee. Afterall, I'm a professional, not a hobbyist, my time is valuable.

I had justify my library in previous reply. You ignored the reply and I accepted it. I am a professional too before become hobyyist. More important, I don't need professional whose only look things at 1 point like you to lead me. I have many time. So, do reply in future to show your ignorance.
 

 
People always do not have self-awareness.

GeneralRe: DAABmvpMark Nischalke2 Apr '07 - 1:18 
Laugh | :laugh: Laugh | :laugh: Laugh | :laugh: Laugh | :laugh: Laugh | :laugh: Laugh | :laugh:
 
Me thinks thou protest too much.
 

only two letters away from being an asset

GeneralRe: DAABmemberfalconsoon2 Apr '07 - 6:56 
I just answer what you requested for.
Smile | :) Big Grin | :-D Laugh | :laugh:
 
Circle is eternity.

GeneralRe: DAABmemberwout de zeeuw14 Apr '07 - 18:48 
Guys, this thread was most entertaining! Laugh | :laugh:
 
Wout

GeneralRe: DAABmembersherifffruitfly15 Apr '07 - 14:38 
Agreed.
 
An EXCELLENT example of the difference between criticism and being an @ssh0le. With criticism, there's at least a *chance* the one being criticized will respond helpfully. Not so with being an @ssh0le.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 14 Apr 2007
Article Copyright 2007 by falconsoon
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid