Shamil Salakhetdinov
shamil at users.mns.ru
Mon Mar 13 03:08:49 CST 2006
> I'll keep this and study it. Hi Dan, Please try to stress test it "to death" first of all because as I wrote in a posting to John here there are rumors it forces MS Access to loose stability... > Having said all that, when I go to companies and tell them that I develop > in > Access, have been doing so for eight years, and show them how my system > works, the concern over Access drops off. Good news! I thought MS Access is getting "semi-dead"... > I am looking forward to what Access 12 will have in it. I've seen some of > the descriptive material published by MS, and so far it looks great! Yes, it does look quite differently and most of the changes are mainly power users oriented AFAIS - therefore MS Access developers may expect more "messy software" to fix coming in their direction! :) Shamil ----- Original Message ----- From: "Dan Waters" <dwaters at usinternet.com> To: "'Access Developers discussion and problem solving'" <accessd at databaseadvisors.com> Sent: Sunday, March 12, 2006 8:22 PM Subject: Re: [AccessD] Access XP forms bound to ADO recordsets > Hi Shamil, > > Thank you for this additional information. I've learned to read your > information as though I was a student in your class! I'll keep this and > study it. > > The fact that people are moving away from Access as a development platform > is interesting. My experience is that people in IT departments have had > bad > experiences with Access. They've repeatedly seen where someone in their > company learns how to use Access to some extent to do something that many > people like. But because that person doesn't have the ability or time to > become a real developer, the application has trouble. Then the IT > department gets told by a VP that this is a 'must have' application that > the > IT department must fix Now! So, the IT department has to fix it with > unbudgeted time and unbudgeted funds. After a few experiences like this, > IT > people tend to get leery of Access. > > However, with VB or VB.net, a person without actual training in database > development and connection between a FE and BE, can't even get started. > (I > have to admit that when I began developing in Access, I didn't understand > the concept of FE and BE either.) This makes (today) the choice of > developing significant applications using VB.net the 'safe' choice for > larger companies. > > Having said all that, when I go to companies and tell them that I develop > in > Access, have been doing so for eight years, and show them how my system > works, the concern over Access drops off. They can see for themselves > that > I can produce. I typically market to small to medium sized companies, so > that may factor in also. > > I am looking forward to what Access 12 will have in it. I've seen some of > the descriptive material published by MS, and so far it looks great! > > Dan Waters > > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Shamil > Salakhetdinov > Sent: Saturday, March 11, 2006 6:12 PM > To: Access Developers discussion and problem solving > Subject: Re: [AccessD] Access XP forms bound to ADO recordsets > > Dan, > > Yes, I have seen that - in fact I did do google before I started my > experimenting. > In KB281998 "How to bind Microsoft Access forms to ADO recordsets" > http://support.microsoft.com/kb/281998 they talk AFAIS about binding to > connected ADODB recordsets. > > The original question (as I got it) was hwo to bind to disconnected ADODB > recordsets and then implied question is: is there a simple and generic way > to translate/transfer changes from disconnected recordset to the > backend... > > As it happens there is a trick to do that described in my previous > posting. > > I did do google now additionally and I did find that the similar trick is > described already several years ago. They do it a little bit differently > but > the principle is the same - they write: > > <<< > Now, the clever tricks: > > 1. Open a static, optimistic batch recordset, disconnect it, save it > to a simple in-memory stream object, set the stream position to zero > so it can be read from the beginning, and open a new copy of the > recordset from the stream. Now, bind one copy to the form, and start > working. When you're ready to do a batch update, first compare the 2 > recordsets for changes, and apply any adds, changes, and deletes to > the unbound recordset, then run BatchUpdate from the unbound > recordset. Note that Access sets values of IDENTITY columns to zero, > so that's an easy way to filter for added records. > ... >>>> > > This excerpt is from this posting (watch line wraps!): > > <<< > ADP: A2K vs 2002? > From: Steve Jorgensen > Date: Sun, Jul 21 2002 7:29 pm > > http://groups.google.com/group/comp.databases.ms-access/browse_frm/thread/17 > 53dbca8189eb3/f20d79536029060e?hl=en&lr=&ie=UTF-8&oe=UTF-8&rnum=1&prev=/grou > ps%3Fas_q%3DBind%2520form%2520to%2520disconnected%2520recordset%26safe%3Dima > ges%26ie%3DUTF-8%26oe%3DUTF-8%26as_ugroup%3D*.*access.*%26lr%3D%26hl%3Den#f2 > 0d79536029060e >>>> > > And here is another related information: > > <<< > From: Steve Jorgensen > Date: Thurs, Nov 28 2002 11:45 pm > > http://groups.google.com/group/comp.databases.ms-access/msg/40e731c75071f8c9 > ?q=Bind+form+to+disconnected+recordset+group:*.*access.*&hl=en&lr=&ie=UTF-8& > oe=UTF-8&rnum=2 >>>> > > So they approve that my trick is legal and is a kind of "wheel > reinwention" - the difference of my "wheel" is that I do trasnslate > changes > to the second disconected recordset when form events fire - the > disadvantage > of my method is that it needs more tricky coding, which still needs to be > well tested, the advantage - is that as soons as the changes on the > current > row are done I can serialize second disconnected recordset to xml file and > in the case of client app's failure batch changes will not be lost etc. > > Strange that such a valuable information first time published in summer > 2002 > about using ADODB disconnected recordsets is so rarely discussed on > Internet - everybody in this World is abandoning "MS Access toy" and > switiching to .NET development? > > But this feature properly applied makes MS Access FEs good candidates to > be > used as true FEs - without any significant performance/locking hits on BEs > I > mean.... > > Shamil > > ----- Original Message ----- > From: "Dan Waters" <dwaters at usinternet.com> > To: "'Access Developers discussion and problem solving'" > <accessd at databaseadvisors.com> > Sent: Sunday, March 12, 2006 2:27 AM > Subject: Re: [AccessD] Access XP forms bound to ADO recordsets > > >> Shamil, >> >> I've been reading you post with interest. Have you looked at MS KB >> 281998? >> This gives a method for an Access form to connect to SQL Server, Jet, and >> Oracle BE's and be updateable. They identify a specific provider to do >> this >> that can be used to set up bound forms. >> >> The provider is: "Microsoft.Access.OLEDB.10.0" >> >> I have not tried this, but thought you might be interested. >> >> Dan Waters >> >> >> -----Original Message----- >> From: accessd-bounces at databaseadvisors.com >> [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Shamil >> Salakhetdinov >> Sent: Saturday, March 11, 2006 5:04 PM >> To: Access Developers discussion and problem solving >> Subject: Re: [AccessD] Access XP forms bound to ADO recordsets >> >> John at all, >> >> I did make some more experimenting and it happens that MS Access 2003 >> (and >> probably XP) and ADO 2.8 (and 2.7 also?) can work in bound mode with >> disconnected updatable ADODB recordsets with both MS Access and MS SQL >> backends. >> >> I did use Provider=Microsoft.Jet.OLEDB.4.0 to connect to MS Access >> backend >> and Provider=SQLOLEDB.1 to connect to MS SQL 2000 backend. >> >> Some more testing/experimenting is needed but I did do quite some tests >> and >> they worked OK. >> >> As I wrote already this feature is new for me and a (big) surprise - this >> is >> a functionality I have been waiting for 8+ years since 1997 when we made >> here a custom framework to work with MS Access and MS SQL in disconnected >> mode, but it was rather heavyweight and because of the bugs in MS Access >> I >> decided to not make it broadly available.... >> >> Basically this means that MS Access forms can be used in bound mode with >> very low performance hit to the MS Access and MS SQL backends - the same >> way >> ADODB disconnected recordsets are used in n-tier applications. >> >> The programming of form's events processing is relatively simple and it >> should be possible to generalize it to make a simple lightweight >> framework >> in case back-end database(s) follow systematic naming conventions and >> database models design principles. >> >> The "trick" is to open two ADODB recordsets: >> >> - one with batch update enabled >> - second without batch update >> >> and make them disconnected. >> >> Then bind MS Access form to the second recordset (without batch update >> enabled). >> >> (I did experiemnet with recordsets having several source rows as a >> generic >> case to see are there any chances to use MS Access subforms in bound >> editable mode with disconnected ADODB recordsets) >> >> When MS Access form fires insert, update, delete events all the changes >> can >> be easily translated from the second recordset (where these changes are >> made >> "automagically" because MS Access form is bound to it) to the first >> recordset. >> >> On form close(or using special button) first recordset can be reconnected >> to >> the backend and batch update applied. (Of course in the case of special >> button to apply batch changes the two disconnected recordsets have to be >> resynchronized after updates). >> >> etc. >> >> Here is how "automagically" generated by ADODB batch update looks in the >> case of MS SQL backend (Info obtained from MS SQL profiler, line breaks >> are >> inserted manually to make it readable): >> >> exec sp_executesql >> >> N'UPDATE "Northwind".."Categories" SET >> "CategoryID"=@P1,"CategoryName"=@P2,"Description"=@P3 WHERE >> "CategoryID"=@P4 >> AND "CategoryName"=@P5; >> >> DELETE FROM "Northwind".."Categories" WHERE "CategoryID"=@P6 AND >> "CategoryName"=@P7; >> >> UPDATE "Northwind".."Categories" SET >> "CategoryID"=@P8,"CategoryName"=@P9,"Description"=@P10 WHERE >> "CategoryID"=@P11 AND "CategoryName"=@P12; >> >> INSERT INTO "Northwind".."Categories" >> ("CategoryID","CategoryName","Description") VALUES (@P13, at P14, at P15)', >> >> N'@P1 int, at P2 nvarchar(15), at P3 ntext, at P4 int, at P5 nvarchar(15), at P6 int, at P7 >> nvarchar(15), at P8 int, at P9 nvarchar(15), at P10 ntext, at P11 int, at P12 >> nvarchar(15), at P13 int, at P14 nvarchar(15), at P15 ntext', >> >> 99, N'CatName', N'Updated category description', >> 99, N'CatName', >> 66, N'DelCatName', >> 991, N'CatName2N', N'Updated dscr', 991, N'CatName2', >> 662, N'newCatName', N'new Cat description' >> >> Live connection to the back-end is needed only on opening of the source >> recordsets and on applying batch changes. Therefore connections can be >> pooled/should be possible to pool (I didn't experiment here) and to share >> them between several (many) front-end applications/clients if these >> connections are opened using ActiveX DCOM servers running on server >> PCs/.NET >> Remoting(?) objects. As well as actual disconnected recordset creation >> and >> reconnection and backend update can be executed on (Web) server side - >> depending on whatever is used on backend.... >> >> Yes, I know dynamic SPs accessing database tables directly do not look >> nice >> but there could be many ways to make it working differently using >> predefined >> stored procedures (e.g. by serializing ADODB recordset into XML file(s) >> where all the updates (inserts, deletes, updates) are coded special >> easily >> parsed way and then reformat these XML files into the calls to the >> predefined stored procedures etc.etc. >> >> Here is how it looks this saved XML(no direct correspondence with >> presented >> above batch T-SQL update) : >> >> - <xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" >> xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" >> xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> >> - <s:Schema id="RowsetSchema"> >> - <s:ElementType name="row" content="eltOnly" rs:updatable="true"> >> - <s:AttributeType name="CategoryID" rs:number="1" rs:writeunknown="true" >> rs:basecatalog="Northwind" rs:basetable="Categories1" >> rs:basecolumn="CategoryID"> >> <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" >> rs:fixedlength="true" rs:maybenull="false" /> >> </s:AttributeType> >> - <s:AttributeType name="CategoryName" rs:number="2" >> rs:writeunknown="true" >> rs:basecatalog="Northwind" rs:basetable="Categories1" >> rs:basecolumn="CategoryName"> >> <s:datatype dt:type="string" dt:maxLength="15" rs:maybenull="false" /> >> </s:AttributeType> >> - <s:AttributeType name="Description" rs:number="3" rs:nullable="true" >> rs:writeunknown="true" rs:basecatalog="Northwind" >> rs:basetable="Categories1" >> rs:basecolumn="Description"> >> <s:datatype dt:type="string" dt:maxLength="1073741823" rs:long="true" /> >> </s:AttributeType> >> <s:extends type="rs:rowbase" /> >> </s:ElementType> >> </s:Schema> >> - <rs:data> >> <z:row CategoryID="1" CategoryName="Beverages" Description="Soft drinks, >> coffees, teas, beers, and ales" /> >> <z:row CategoryID="2" CategoryName="Condiments" Description="Sweet and >> savory sauces, relishes, spreads, and seasonings" /> >> <z:row CategoryID="3" CategoryName="Confections" Description="Desserts, >> candies, and sweet breads" /> >> <z:row CategoryID="4" CategoryName="Dairy Products" >> Description="Cheeses" >> /> >> <z:row CategoryID="5" CategoryName="Grains/Cereals" Description="Breads, >> crackers, pasta, and cereal" /> >> <z:row CategoryID="6" CategoryName="Meat/Poultry" Description="Prepared >> meats" /> >> <z:row CategoryID="7" CategoryName="Produce" Description="Dried fruit >> and >> bean curd" /> >> <z:row CategoryID="8" CategoryName="Seafood" Description="Seaweed and >> fish" /> >> - <rs:update> >> - <rs:original> >> <z:row CategoryID="99" CategoryName="Update me" Description="Update me - >> OK" /> >> </rs:original> >> <z:row CategoryID="99" CategoryName="Update me" Description="Update me - >> OK1" /> >> </rs:update> >> - <rs:update> >> - <rs:original> >> <z:row CategoryID="991" CategoryName="Update me2" Description="Update >> me2 - OK" /> >> </rs:original> >> <z:row CategoryID="991" CategoryName="Update me2" Description="Update >> me2 - OK1" /> >> </rs:update> >> <z:row CategoryID="661" CategoryName="Inserted2" Description="Inserted2" >> /> >> - <rs:insert> >> <z:row CategoryID="662" CategoryName="Inserted3" Description="inserted >> 3" >> /> >> </rs:insert> >> - <rs:delete> >> <z:row CategoryID="66" CategoryName="DeleteMe" Description="Deleted" /> >> </rs:delete> >> </rs:data> >> </xml> >> >> I do not post code here now because I wanted to experiment more and >> because >> it would be useful if somebody else tries to repeat the "trick" described >> above - if it will work for them then a whole set of new opportunities to >> use MS Access as a real development tool will be opened.... >> >> I will post code after additional tests within one-two weeks when it will >> become clear that it works. >> >> Please post any links here if you think that my posted information looks >> like "wheel reinvention" or you think it doesn't have practical >> application >> because of this or that several limitations etc.etc. >> >> Thank you. >> >> Shamil >> >> P.S. I have installed on my PC: >> >> - MS Windows 2003 Server SP1 >> - MS Office 2003/MS Access 2003 SP1 >> - MS SQL 2000 SP3a >> - MDAC 2.8 >> - NET Framework 1.1 and 2.0 >> - Visual Studio 2003 and 2005 >> - I have also MS SQL Server 2005 Express edition but I didn't experiment >> with it >> >> P. P.S. Yes, I didn't talk about identity(autonumber) fields - I >> generally >> use GUIDs for PKs. >> To properly manage numeric identity values some more tricks are needed - >> I'd >> be grateful if somebody post information on this subject >> (updategram/diffgram XML is a direct solution here probably - and >> serialized/saved ADODB batch update can be converted into diffgrams by >> using >> XSLT or VB(A) or VB.NET/C#/C++ code etc.) >> > > <<< tail skipped >>> > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com