|
There is a design principle that says that exceptions should be handled in the UI layer. (Strictly, they should be handled at the level where they can be appropriately resolved; when that resolution means simply telling the user that something is broken - reporting a message - that is the UI layer).
Your example method appears to belong in a data layer (given that it reads from a database; even if the method is actually in a Form, functionally the work of the method is data layer behavior).
According to the design principle, your method should not be handling the exception but allowing a method 'closer to the user' to handle it ... by making its report to the user. If you change your code to do this, then you don't have to be concerned with whether a null is returned for the OleDbDataReader - under non-exception conditions (which is the only time you care) it is guaranteed to be non-null.
So, your method could be simplified to:
public static OleDbDataReader GetData(string SQLstring)
{
using (OleDbConnection conn = new OleDbConnection(connstr))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand(SQLstring, conn);
OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
}
... and you would put your try/catch around (the call to...) the call to GetData().
A guideline to help with deciding whether to put try/catch inside a method is to ask yourself whether, by using try/catch, you can ensure that the behavior described by the method name is performed. In the case of GetData() the try/catch did not ensure that data would be available under all circumstances: it fails the test in the guideline and indicates that the try/catch belongs elsewhere.
Further up the call stack there is probably an event handler ("DataLoadButton_ClickEvent()", or some such). Reporting 'couldn't get data' is a valid and complete handling of a button click event, so it passes the test in the guideline and is a valid place for a try/catch.
It is important to be clear about the purpose of methods. A button click event handler (such as DataLoadButton_ClickEvent()) can seem to be about loading data. That is misleading. The event handler is about handling the event; one way to handle the event is to load data, but another, equally valid, way to handle the event is to say "I couldn't." And it just so happens that the design of languages with structured exception handling (in this case, C#) allows for the 'loading data' behavior to be coded as the 'normal' or non-exceptional path and the 'I couldn't' behavior to be treated as exceptional - allowing the flow of the normal path to be easier to read for us humans by relegating the exceptional behavior to the catch{} block.
|
|
|
|
|
Your suggestions are so useful to me. I've really learn a lot, thank you!
|
|
|
|
|
Hey Keith, OleDbConnection does not have a destructor (Reflectoring shows no Finalize method), only a Dispose
|
|
|
|
|
OleDbConnection.Dispose (used by using ) does this.Close() (among other things)
So you shouldn't need to call Close manually.
|
|
|
|
|
|
The Dispose will call the Close, but I suggest calling Close from a finally anyway.
But Personally, I wouldn't use a using statement in this case. I'd instantiate the Connection in the Form's Load handler (or similar) and Close/Dispose it in the Form's Closing handler (or similar) so the Connection gets reused.
|
|
|
|
|
|
thanx to this discussion i gained a lot but at the same time i tried to simulate this , and found that you can return the datareader but cannot use it , means after the using {} is finished the connection is no longer open and you cannot read data through the datareader returned by this connection.
datreader doesn't buffer data too, so you cannot get data by this...to get data the connection should be opened..
|
|
|
|
|
That's right. So I do not use "using" if I want to return the datareader.
But "CommandBehavior.CloseConnection" is a remedy for this.
OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Once you close datareader, the connection will be closed too. You can see this result in step debugging.
|
|
|
|
|
I use Speech component and when speaker is reading, the other commands not work, how can i enable pause and stop during speaking?
thanks everybody for the answers
|
|
|
|
|
Use the Speak command in a background worker so that nothing else is defunct till the speech is over.
|
|
|
|
|
so what shall i do?
use threads?
at micro programing it was so easy, just check a
flag or bit for an event each certain time.
but i can not found any thing in c#!
|
|
|
|
|
BackgroundWorker Component
Do you know about them?
What u hav 2 do is
Write the code to be executed in their DoWork event.
Then the play button should have code like BackgroundWorker1.RunWorkerAsync()
Read about BackgroundWorker. That is a simple and effective solution
|
|
|
|
|
hi
I want to insert the HTML tag in a page for c# ASP.net
thanks
|
|
|
|
|
|
What is your question?
It's time for a new signature.
|
|
|
|
|
I want to insert the HTML tag in a page for c# ASP.net
|
|
|
|
|
that still isn't a question. What is your question?
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
genieabdo wrote: I want to insert the HTML tag in a page for c# ASP.net
OK, go ahead and do it, you don't need permission from us.
It's time for a new signature.
|
|
|
|
|
That's a statement. At best, it's your requirement. As you are looking at an ASP.NET page, you can add pretty much any HTML tag you like.
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
No question!
Dalek Dave: There are many words that some find offensive, Homosexuality, Alcoholism, Religion, Visual Basic, Manchester United, Butter.
Pete o'Hanlon: If it wasn't insulting tools, I'd say you were dumber than a bag of spanners.
|
|
|
|
|
Be specific with your question. What tag do you want to add? Where do you want to add it? More importantly, what's your problem in doing that.
|
|
|
|
|
I need some help on a windows forms project.
Basically I would like to render images to a certain portion of the windows forms, but when i press the arrow keys I would like it to scroll the images in the rendering area as if it were a 2D camera of some sort.
The problem is I dont know what control to use that can assist me in doing this?.
Does anyone have any ideas?
|
|
|
|
|
I figured out that I can draw using GDI + to the "Panel" control
|
|
|
|
|
Hi, All!
How can I verify if selected file is DOS, 16/32/64-bit executable?
Thank a lot!
|
|
|
|