MS Access Forum / Multiuser / Networking / July 2006
Split Databases - Best Practices?
|
|
Thread rating:  |
Tony - 16 May 2006 20:43 GMT I'm starting this thread to pull together related questions and to check my understanding. Please debate apparent misconceptions.
Do you agree that these are best practices?
1. Use JET OLE DB when connecting to BackEnd (BE) MDB file. Reason - thread safety.
a. ODBC Table Links should be updated using DNS-less code like:
adoTbl.Properties("Jet OLEDB:Link Datasource") = strPath & "myBackEnd.mdb"
Reason - Ensures OLE DB and saves work when deploying frontends (FE).
b. ADO should be used for all DIRECT BE connections.
Reason - DAO does not support OLE DB.
2. DAO should be used when working within the FE (i.e. querying table links).
Reason - It's powerful. The default recordsets for bound forms are DAO objects.
3. Maintain a Persistent Connection to BE.
Reason - Avoids locking problems/delays.
4. Use 8.3 file name conventions in the path to the BE and use mapped drives vice UNC. Long names should be converted when referencing. See: http://support.microsoft.com/default.aspx?scid=kb;en-us;889588
5. Keep the BE as close as possible to the root of the shared drive.
Reason - Speed.
6. The Seek method should only be called against a direct BE connection. If querying a table link, FindFirst (DAO) or Find (ADO) must be used instead.
Reason - You can't open table-type recordsets from a table link.
7. Set "Default record locking" to "Edited record."
Reason - Helps prevent corruption.
8. The FE should be copied to each workstation (not shared).
Reason - Sharing defeats the purpose of splitting.
9. Reference the latest DAO and ADO libraries (must be present on ALL workstations).
10. Use Access 2000 at a minimum, but 2003 is preferred.
Reason - 2000 is known to be buggy on a network.
Tony Toews - 17 May 2006 05:13 GMT >3. Maintain a Persistent Connection to BE. > Reason - Avoids locking problems/delays. Biggest reason is much better performance when multiple users are on back end.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 17 May 2006 05:15 GMT Seems to me point 4 should really 4a, 4b and 4c
>4. use mapped drives vice UNC. What do you mean by this?
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony - 17 May 2006 17:09 GMT Oh, now I can't find my reference. It said that using "Z:\MyShare\db1.mdb" was better than "\\MyServer\MyShare\db1.mdb" (UNC). Better for performance maybe, but it relies on all FE users having Z:\ mapped. Scripts can do that, but I would say the applicability of this practice depends on your environment. I have no idea as to the performance impact. The info on long names is probably as important, and they (Microsoft) used a UNC in their example. - Tony M.
Tony Toews - 17 May 2006 17:32 GMT >Oh, now I can't find my reference. It said that using >"Z:\MyShare\db1.mdb" was better than "\\MyServer\MyShare\db1.mdb" [quoted text clipped - 3 lines] >idea as to the performance impact. The info on long names is probably >as important, and they (Microsoft) used a UNC in their example. - Agreed that shorter paths are better than long paths for performance reasons. I"ve seen postings and/or received emails from folks who've said this made a huge difference when the paths were particularly deep.
But UNC vs drive letters is a matter of preference in your environment. Both have the advantages vs disadvantages.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
david@epsomdotcomdotau - 23 Jul 2006 07:29 GMT Windows more-or-less creates mapped drives for shares: that's what you see in 'my network connections'. So the performance differences are probably non-existent.
I use the windows api to convert file paths to short in my re-link code. I don't make suggestions to the users about the use of UNC or mapped drive letters. I've really only had a problem with file location on Novell networks, and that apparently is still a problem - but only when we switched the client from A97 to A2000 (jet 3.5 to jet 4.0)
(david)
> Oh, now I can't find my reference. It said that using > "Z:\MyShare\db1.mdb" was better than "\\MyServer\MyShare\db1.mdb" [quoted text clipped - 4 lines] > as important, and they (Microsoft) used a UNC in their example. - Tony > M. Tony Toews - 17 May 2006 05:17 GMT >6. The Seek method should only be called against a direct BE >connection. > If querying a table link, FindFirst (DAO) or Find (ADO) must be >used instead. > > Reason - You can't open table-type recordsets from a table link. Agreed that you can't use Seek on linked table but I've never used Findfirst or Find. I just use recordsets frequently with the query and Where clause created in VBA code.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Michel Walsh - 17 May 2006 19:05 GMT (About point 6)
and furthermore, with DAO, you are NOT limited to CurrentDb. You CAN use OTHER databases objects, and use one which, eventually, correspond to the table-direct where you would be able to use SEEK, in the few occasions where a limiting SQL statement with a WHERE clause would have been inappropriate. http://www.mvps.org/access/tables/tbl0006.htm
Vanderghast, Access MVP
>>6. The Seek method should only be called against a direct BE >>connection. [quoted text clipped - 8 lines] > > Tony Tony Toews - 17 May 2006 05:17 GMT >7. Set "Default record locking" to "Edited record." > Reason - Helps prevent corruption. News to me.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 17 May 2006 05:17 GMT >8. The FE should be copied to each workstation (not shared). > Reason - Sharing defeats the purpose of splitting. And can greatly increase the chances of corrupting the FE.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 17 May 2006 05:18 GMT >10. Use Access 2000 at a minimum, but 2003 is preferred. > Reason - 2000 is known to be buggy on a network. Not any more it's not. A client was happily using a mix of A97 and Jet 3.5 SP3 and A2000 and latest version of Jet. 25 workstations against a 300 Mb backend with 160 tables.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 17 May 2006 05:19 GMT >1. Use JET OLE DB when connecting to BackEnd (BE) MDB file. Reason - >thread safety. Eh? Not even sure what Jet Ole DB is.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony - 17 May 2006 16:57 GMT The OLD DB recommendation came from a note on page 89 of O'Reilly's "Fixing Access Annoyances" by Phil Mitchell and Evan Callahan.
"If you're using ADO libraries, connect via the OLEDB driver rather than using Open Database Connectivity (ODBC). ODBC is not thread safe -- it isn't stable in a multi-user environment and can cause data corruption."
- Tony M.
Tony Toews - 17 May 2006 17:34 GMT >The OLD DB recommendation came from a note on page 89 of O'Reilly's >"Fixing Access Annoyances" by Phil Mitchell and Evan Callahan. Now that's a book I've never heard of. Never heard of the authors either.
>"If you're using ADO libraries, connect via the OLEDB driver rather >than using Open Database Connectivity (ODBC). ODBC is not thread safe >-- it isn't stable in a multi-user environment and can cause data >corruption." Ah, so why not just used ADO against linked tables and avoid OLDEDB and ODBC all together.
DAO doesn't allow you to even use an ODBC driver from within Access against an Access MDB. Which is, in my opinion, a good thing as that's just extra overhead.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony - 17 May 2006 21:02 GMT NOW THIS IS GETTING INTERESTING!!!
They mention you on the facing page. There's a link to your Auto FE Updater utility. They say, "it runs on your server and automatically updates client frontends. It works, it's free, and Tony would love to get feedback and new feature requests."
Runs on your server? Are they saying that it runs as part of the BE on a file server, or that you need a remote service?
Do they presume too much? This is a good book, even great. I like how it is written, an excellent problem solving reference.
Your last comment had me confused. So, I just discovered how split databases connect. I think. Thanks. I thought that when you defined a table link to an MDB, it by default used an ODBC connection. Wrong. I just found this comment on MSDN in "What Data Sources Can I Access with DAO and ODBC?":
"DAO is best used with databases that the Microsoft Jet database engine can read, which includes all the above except ODBC data sources. Best performance is with Microsoft Jet (.mdb) databases. Attaching external tables, especially in ODBC data sources, to an .mdb database is more efficient than opening the external database directly through the MFC DAO classes without attaching."
It is pretty clear now that DAO is the default connector. And, it's even recommended over ODBC for connecting to other Jet databases. So, is DAO thread safe? Is it better than OLE DB as well? If it were, would "they" tell us? I heard it from a good source that ADO is dead, replaced by ADO.NET, and that DAO is being revived in the next version of Access. Perhaps we'll have the answer then.
-Tony M.
So with respect to practice # 1 DAO vs. OLE DB - Questionable, TBD.
>From the perspective of maintaining links though, it is handy to do it in code. This way, you can move copies of your database around and easily link to dev data vice production, and back.
Tony Toews - 17 May 2006 21:44 GMT >NOW THIS IS GETTING INTERESTING!!! > >They mention you on the facing page. There's a link to your Auto FE >Updater utility. They say, "it runs on your server and automatically >updates client frontends. It works, it's free, and Tony would love to >get feedback and new feature requests." Very nice. The book must be at least decent then. <chuckle>
>Runs on your server? Are they saying that it runs as part of the BE on >a file server, or that you need a remote service? It entirely runs on the client workstation but is loaded from your server. By your they mean the reader and not me, Tony.
>It is pretty clear now that DAO is the default connector. And, it's >even recommended over ODBC for connecting to other Jet databases. So, >is DAO thread safe? Is it better than OLE DB as well? If it were, would >"they" tell us? I heard it from a good source that ADO is dead, >replaced by ADO.NET, and that DAO is being revived in the next version >of Access. Perhaps we'll have the answer then. Well, DAO was never dead in the first place. It had been deprecated mind you but there is now a new data engine.
Access 12's new data engine http://blogs.msdn.com/access/archive/2005/10/13/480870.aspx
>So with respect to practice # 1 DAO vs. OLE DB - Questionable, TBD. >>From the perspective of maintaining links though, it is handy to do it >in code. This way, you can move copies of your database around and >easily link to dev data vice production, and back. That's one of the benefits of using linked tables on a drive letter. When I want to access the live backend I map the drive letter to the network share. When I want to access the test backend I SUBST the drive letter to a folder on my system.
Furthermore, if I'm on the live backend, the main menu background is in blood red. This can be determined by using an API call to see if the drive on which the backend resides is a network or local drive.
Alternatively you just use some code to relink the tables back and forth. Relink Access tables from code http://www.mvps.org/access/tables/tbl0009.htm
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Larry Linson - 18 May 2006 00:54 GMT > I just found this comment on MSDN in "What > Data Sources Can I Access with DAO and ODBC?": [quoted text clipped - 5 lines] > efficient than opening the external database directly through the MFC > DAO classes without attaching." MFC is the Microsoft Foundation Classes, so this paragraph applies to C++ programs that use MFC. "Thread-safe" is not an issue unless you are using C++ or another language that allows you to initiate "multi-threading". That is not an issue with Access - DAO - Jet DB Engine - .MDB data file.
I've not seen any convincing arguments for using ADO with an .MDB database, whether the data tables were split into a separate .MDB backend, or contained within a monolithic database. In Access terminology "multiuser" can apply to either a split or monolithic database, though you'll find a overwhelming consensus here that a split database has significant advantages.
Generally, in the Access world, we don't use the term "multiuser" for "client-server" databases, for example, Access MDB - DAO - Jet DB Engine - ODBC - MS SQL Server (though you can substitute any ODBC-compliant DB for MS SQL Server). Most of the client-server work I've done over the years was with other servers, not because they were "better" in my view, but because the corporate IT department at my client companies had selected another DB as a/the corporate standard. Client - server arrangements have their own set of requirements, idiosyncracies, and performance issues (in a multiuser environment all the data extraction and manipulation is done on the user's machine; in C-S, the data extraction and most of the manipulation is done on the server). It is in Access ADP client-server database applications connected to MS SQL Server that ADO has seen its greatest use.)
Larry Linson Microsoft Access MVP
Michel Walsh - 17 May 2006 19:02 GMT (About point 1-)
Your list of possibilities is not exhaustive. Access uses (used), as example, NetDDE. So, unless you have hidden assumptions (like the back end being MS SQL Server), and so on, there are other techniques to consider before jumping to a conclusion, as you did.
Vanderghast, Access MVP
> The OLD DB recommendation came from a note on page 89 of O'Reilly's > "Fixing Access Annoyances" by Phil Mitchell and Evan Callahan. [quoted text clipped - 5 lines] > > - Tony M. Tony Toews - 17 May 2006 22:31 GMT >"If you're using ADO libraries, connect via the OLEDB driver rather >than using Open Database Connectivity (ODBC). ODBC is not thread safe >-- it isn't stable in a multi-user environment and can cause data >corruption." I think this comment is meant for non Access data storage systems such as SQL Server.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Douglas J. Steele - 18 May 2006 01:12 GMT I suspect they're talking about using ADO against other DBMS (like SQL Server or Oracle).
Typically in Jet, you're going to be using linked tables, and as far as I'm aware, you cannot link tables using Ole DB.
In code, you can use Ole DB when creating the ADO Connection property, but I'm not sure I'd want to be going that route for a strictly Jet application.
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no private e-mails, please)
> The OLD DB recommendation came from a note on page 89 of O'Reilly's > "Fixing Access Annoyances" by Phil Mitchell and Evan Callahan. [quoted text clipped - 5 lines] > > - Tony M. Tony M. - 19 May 2006 14:58 GMT Hi Doug,
I was wondering if you would chime in. Here's part of my ADO code that resets table links to Ole DB:
adoTbl.Properties("Jet OLEDB:Link Datasource") = strPath & "myBackEnd.mdb"
Thanks to everyone for answering this thread. I've learned a lot. Hopefully I'm not the only one confused enough to need this kind of help.
I wonder if we should start this thread over again with better gouge, leaving out the misconceptions. Perhaps you all would like to add to the list anything I left out? Each contributing comments on what they've seen works to make the best of a bad situation, that is having to split cause you have no better option like SQL Server.
Thoughts? Thanks. - Tony M.
Tony Toews - 19 May 2006 17:33 GMT >I wonder if we should start this thread over again with better gouge, >leaving out the misconceptions. Perhaps you all would like to add to >the list anything I left out? Each contributing comments on what >they've seen works to make the best of a bad situation, Sure, just visit my website. http://www.granite.ab.ca/accsmstr.htm
>that is having >to split cause you have no better option like SQL Server. What do you mean by that? You should be splitting your MDB even if you just Access to store your data.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 19 May 2006 17:34 GMT >I wonder if we should start this thread over again with better gouge, >leaving out the misconceptions. Perhaps you all would like to add to >the list anything I left out? The trouble is we have no idea what misconceptions you have without you stating them.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony M. - 19 May 2006 21:52 GMT I think it would be better if an MVP started the thread, and then others added to it. I'll keep my 2 cents in the form of questions vice assertions. Deal? - Tony M.
Tony Toews - 19 May 2006 23:20 GMT >I think it would be better if an MVP started the thread, and then >others added to it. I'll keep my 2 cents in the form of questions vice >assertions. Deal? Sorry but no. I mean we can't answer a question that hasn't been asked. And we don't know
If you want to know how to make an multi-user app run smoother visit my website. http://www.granite.ab.ca/accsmstr.htm
One specific page is the "Splitting your app into a front end and back end Tips" page at http://www.granite.ab.ca/access/splitapp/ for more info. Also see the Corruptions and Performance pages.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony M. - 20 May 2006 14:12 GMT Okay. Thanks. If anyone else wants to start a new thread, please just post a few ideas that you think are best practices for split environments. Maybe others will add to it.
One question I have before we end this is with respect to the RecordCount issue. I've read that RecordCounts don't work well with linked tables. Splitting an existing database that uses this method could cause it to break in ways that may be hard to detect, a logic thing.
Should I be worried about this as I approach the idea of splitting a dozen or more interlinked shared mdb files?
Thanks,
-Tony M.
Douglas J. Steele - 20 May 2006 15:34 GMT RecordCount works fine: as long as you go to the end of the recordset first.
You could check for each occurrence of .RecordCount, and insert another line in front so that you end up with
rs.MoveLast lngRecords = rs.RecordCount
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no private e-mails, please)
> Okay. Thanks. If anyone else wants to start a new thread, please just > post a few ideas that you think are best practices for split [quoted text clipped - 12 lines] > > -Tony M. Tony M. - 25 May 2006 14:41 GMT I have found a reference that covers this topic in depth, Ch 3 "Designing a Client/Server Application" in "Building Microsoft Access Applications" by John L. Viescas. A very solid attempt to share all the tricks of the trade, the chapter mostly focuses on file-server/split architectures. Well done, thorough, and easy to understand. My only complaint and the reason I didn't buy it the first time I saw it, the table of contents reads like a how-to on building his specific application. Looking things up in terms of access technologies/tasks is tough, but I've found that I can hardly turn a page without finding something I've just got to read. The book comes with his whole solution on CD. Pretty extensive.
-Tony M.
Douglas J. Steele - 25 May 2006 21:32 GMT I doubt you'll hear any dissension from us! <g>
 Signature Doug Steele, Microsoft Access MVP http://I.Am/DougSteele (no private e-mails, please)
>I have found a reference that covers this topic in depth, Ch 3 > "Designing a Client/Server Application" in "Building Microsoft Access [quoted text clipped - 9 lines] > > -Tony M. david@epsomdotcomdotau - 23 Jul 2006 07:53 GMT The original MFC C++ database classes were not thread safe. Anything built with them was not thread safe.
There was a long running story that the 'Access' ODBC driver was not thread safe. A logical conclusion would be that the Access ODBC driver was built with a version of the C++ MFC database class which was not thread safe.
This conclusion was re-enforced by the oft-repeated assertion that the Access ODBC drivers had been built with a version of VB that was not thread safe. That certainly appeared to be garbage: who outside of the biased ignorant would believe that the Access ODBC driver had been built in VB?
There was also the possibility that the Access ODBC drivers called back to a version of VB that was not thread safe. Again, a pretty unlikely story: from ODBC, you can't call back from the Access driver into VB: you can only do that inside Access.
However, eventually a more credible assertion emerged: by default Jet is configured to use three threads, and ASP is configured to pool multiple database threads, and if you let ASP call the create thread api to create a Jet database thread, Jet may call the create thread api from within the call. The create thread api is not re-entrant, and your database thread gets trashed.
This suggests three possible solutions: Configure Jet to use only one thread: Configure ASP to use only one thread, or, Call Jet using some kind of thread-safe call that isolates the two calls to the create-thread api.
ASP people don't like single-threading their database calls.
I've never got anyone to report back on the effect of Jet configuration.
There is apparently one particular kind of ADO call that gets around the api re-entrancy problem, but it's not all ADO/OLEDB calls that are legal: you still have to know what you are doing.
In the end, we still don't recommend Jet for web servers. Not just because it might not be stable in a high demand situation: more because you have to take it offline and have file-system access in order to do back up and modifications. If you are running your own web server for internal use, it's not an issue.
(david)
> The OLD DB recommendation came from a note on page 89 of O'Reilly's > "Fixing Access Annoyances" by Phil Mitchell and Evan Callahan. [quoted text clipped - 5 lines] > > - Tony M. Tony Toews - 17 May 2006 05:20 GMT > b. ADO should be used for all DIRECT BE connections. Why would you want to do direct BE connection?
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 17 May 2006 05:20 GMT >I'm starting this thread to pull together related questions and to >check my understanding. Please debate apparent misconceptions. BTW I decided to respond separately to each comment so as to keep responses shorter and easier for folks to debate the merit of one approach vs another.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Fred Boer - 17 May 2006 16:49 GMT I'm getting dizzy...
Cheers! Fred
P.S. But at least I understand now what's going on!
>>I'm starting this thread to pull together related questions and to >>check my understanding. Please debate apparent misconceptions. [quoted text clipped - 4 lines] > > Tony Tony Toews - 17 May 2006 20:08 GMT >I'm getting dizzy... <chuckle>
>P.S. But at least I understand now what's going on! Yeah, I shoulda put that one first but I never thought about that until the end.
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Tony Toews - 17 May 2006 05:23 GMT >Please debate apparent misconceptions. P.S. This could be an interesting discussion. <smile>
Tony
 Signature Tony Toews, Microsoft Access MVP Please respond only in the newsgroups so that others can read the entire thread of messages. Microsoft Access Links, Hints, Tips & Accounting Systems at http://www.granite.ab.ca/accsmstr.htm
Michel Walsh - 17 May 2006 19:26 GMT (About point 2)
If you use SQL to query your tables, you don't really care about ADO or DAO. And in general, you should use SQL, not recordset looping. After all, we are not in VB5 to loop on a recordset to fill a combo box list, isn't it? So the point should be, consider to use SQL first.
Vanderghast, Access MVP
> I'm starting this thread to pull together related questions and to > check my understanding. Please debate apparent misconceptions. > > Do you agree that these are best practices? (...)
> 2. DAO should be used when working within the FE (i.e. querying table > links). > > Reason - It's powerful. The default recordsets for bound forms are > DAO objects.
|
|
|