Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Is this really the code needed to get a value from SQL?
Message
From
22/10/2007 16:48:19
 
General information
Forum:
ASP.NET
Category:
Other
Miscellaneous
Thread ID:
01262166
Message ID:
01262649
Views:
15
>That's wicked - I am trying to create my own classes to do exactly what you are saying. I will take this code and run with it.

Yep, that's what I figured and that's why I posted it. =0) Like I mentioned, it *is* somewhat simplified and everything is not included in my sample code, but it should definitely be enough to get you off and running.

Let me know if you have any questions. Have fun! =0)

~~Bonnie




>
>>Mark,
>>
>>It may look a bit complicated at first (and your example code *does* have a few extra things you don't need), but if you make some base classes in your DataAccess class, you can avoid a lot of complexities in the code you actually use. Here's a blurb I wrote a while ago for answering these types of questions (some of it may not apply to your question, but it is all good info anyway):
>>
>>Our DataAccess layer has two base classes: MyConnection and MyDataAccess. All the methods are coded to the various DataAccess Interfaces (the IDb interface objects). DataSets are used simply for transporting data back and forth. I know that there are plenty of camps who advocate Biz objects for this, but I'm a believer of Typed DataSets for transporting my data between front-end and back-end.
>>
>>The MyConnection class basically has a GetConnection() method that finds the Connection String from the app's config info
>>and returns an instantiated Connection. It returns it as an interface, the IDbConnection.
>>
>>The MyDataAccess class, simplified, is something like this:
>>
>>
>>public class MyDataAccess
>>{
>>	#region Declarations
>>
>>	private IDbConnection oConnection;
>>	private IDbCommand oCommand;
>>	private IDbDataAdapter oAdapter;
>>	private IDataParameterCollection oParms;
>>	public string ConnectionString = "";
>>	protected string ErrorMessage = "";
>>
>>	#endregion
>>
>>	#region Constructor/Destructor
>>
>>	public MyDataAccess()
>>	{
>>		MyConnection o = new MyConnection();
>>		this.oConnection = o.GetConnection();
>>		this.ConnectionString = o.ConnectionString;
>>
>>		this.oCommand = this.GetIDbCommand();
>>		this.oAdapter = this.GetIDbDataAdapter(this.oCommand);
>>		this.oCommand.Connection = this.oConnection;
>>		this.oCommand.CommandType = CommandType.StoredProcedure;
>>	}
>>
>>	#endregion
>>
>>	#region Get/Use IDb Interface Objects
>>
>>	protected IDbCommand GetIDbCommand()
>>	{
>>		return new SqlCommand();
>>	}
>>	protected IDbDataAdapter GetIDbDataAdapter(IDbCommand command)
>>	{
>>		return new SqlDataAdapter((SqlCommand)command);
>>	}
>>	protected IDbDataParameter GetIDbDataParameter(string ParmName, object ParmValue)
>>	{
>>		return new SqlParameter(ParmName, ParmValue);
>>	}
>>	protected void DeriveParameters(IDbCommand command)
>>	{
>>		SqlCommandBuilder.DeriveParameters((SqlCommand)command);
>>	}
>>	#endregion
>>
>>	// Then there are the various protected methods for adding and setting Parameters, filling a DataSet, etc.
>>	// It's these various methods that get used in the classes that are sub-classed from this "base" class.
>>	// Here's just a few of them:
>>
>>	protected void ClearParameters()
>>	{
>>		this.oCommand.Parameters.Clear();
>>		this.ErrorMessage = "";
>>	}
>>
>>	protected void AddParms(string ParmName, object ParmValue)
>>	{
>>		try
>>		{
>>			if (ParmName.StartsWith(this.AtSign) == false)
>>				ParmName = this.AtSign + ParmName;
>>
>>			if (ParmValue != DBNull.Value)
>>				this.oCommand.Parameters.Add(this.GetIDbDataParameter(ParmName, ParmValue));
>>		}
>>		catch (Exception ex)
>>		{
>>			this.ErrorMessage += ex.Message;
>>		}
>>	}
>>	protected void AddParms(string ParmName, object ParmValue, ParameterDirection direction)
>>	{
>>		this.AddParms(ParmName, ParmValue);
>>		this.SetParmDirection(ParmName, direction);
>>	}
>>	protected bool FillData(DataSet ds, string StoredProcName)
>>	{
>>		try
>>		{
>>			this.oCommand.CommandText = StoredProcName;
>>			this.oAdapter.Fill(ds);
>>		}
>>		catch (Exception ex)
>>		{
>>			this.ErrorMessage += ex.Message;
>>			this.CloseConnection();
>>			return false;
>>		}
>>		return true;
>>	}
>>
>>}
>>
>>
>>In this way, your DataAccess sub-classes are totally "disassociated" from knowing what your back-end data is (could be SqlServer, as the above class is, but if you also have an Oracle customer, you have another base class exactly the same as the above class, but it uses Oracle-specific stuff instead and you use the appropriate DLL depending on your which database your customer has ... however, you're still programming to the interface (the IDB Interface objects), so your sub-classes, which are in different projects (and thus different DLLs) don't care and don't need to be changed.
>>
>>So, an example of a sub-class might be this:
>>
>>
>>public class PersonsAccess : MyDataAccess
>>{
>>	#region Public Get Methods
>>
>>	public DataSet GetPersonsOnReport(ref string Message, string ReportNumber, string Supplement)
>>	{
>>		PersonDataSet ds = new PersonDataSet();
>>
>>		this.ClearParameters();
>>		this.AddParms("ReportNumber", ReportNumber);
>>		this.AddParms("Supplement",   Supplement);
>>		this.FillData(ds, "csp_Persons_Get");
>>
>>		return ds;
>>	}
>>
>>	// more methods
>>
>>	#endregion
>>}
>>
>>
>>As you can see, it's not that bad once you get down to actually using it. I hope this gives you some ideas.
>>
>>~~Bonnie
>>
>>
>>
>>
>>>I have been playing around with getting data from SQL, and thinking about how I would go about designing a Data Layer Object. I have always worked with stored procedures, so I am very comfortable with setting up parameters. I do need to ask though .. the following code seems to be a lot of work to pull a single value from SQL? Is this code correct or have I over complicated things?
>>>
>>>
>>>DataSet ds;
>>>DataTable dt;
>>>DataRow dr;
>>>SqlDataAdapter oDataAdapter;
>>>int lnRecords;
>>>			
>>>ds = new DataSet();
>>>this.map_ConnectToData();
>>>
>>>oDataAdapter = new SqlDataAdapter();
>>>oDataAdapter.SelectCommand = new SqlCommand("map_rlb_Logins_validate", this.oConnection);
>>>oDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure ;
>>>
>>>oDataAdapter.SelectCommand.Parameters.Add("@tcUserID",SqlDbType.Char, 20).Value = tcLoginID;
>>>oDataAdapter.SelectCommand.Parameters.Add("@tcPassword",SqlDbType.Char, 20).Value = tcPassword;
>>>lnRecords = oDataAdapter.Fill(ds, "cData");
>>>
>>>MessageBox.Show(lnRecords.ToString());
>>>
>>>dt = ds.Tables["cData"];
>>>dr = ds.Tables[0].Rows[0];
>>>			
>>>MessageBox.Show(dr["cuserid"].ToString());
>>>
>>>
>>>
>>>TIA, -Mark
Bonnie Berent DeWitt
NET/C# MVP since 2003

http://geek-goddess-bonnie.blogspot.com
Previous
Reply
Map
View

Click here to load this message in the networking platform