Hej, Finns inget interface för CommandBuilder. Hittar ingen information om Microsoft Data Access Block version 3.0. Vad e det? Här har du lite information om DAAB Ok, Det borde du kunna, men tycker du att det är värt det besväret och priset!? Förstår inte riktigt vad du menar. Om jag gör som du nämnde ovan och Skapar basklass med de vanliga funktionerna och subklasser för varje provider och låter de implementera en CreateCommand metod som finns definierad i basklassen. Vad ska då CreateCommand metoden returnera? en array med IDbCommand eller kanske en egendefinierad klass som innehåller 3 IDbCommand variabler samt get och set metoder för dessa eller? Du skulle säkert kunna vinna lite prestanda, men frågan är om den extra prestandan du vinner är värt det besväret att själv skapa en metod som genererar fram insert, delete och update (Du får det nämligen gratis av CommandBuilder)!? Hmm, du skulle kunna göra så att din UpdateDataset metod tar ditt dataset och UpdateDatset metoden i sig använder sig av din CommandBuilder metod där du skickar in två argument med ditt dataset och din dataadapter. CommandBuilder metoden skulle då kunna lägga till InsertCommand och de andra till dataadaptern. På så sätt behöver inte din CommandBuilder returnera något plus att du förbereder dataadaptern för användning. Ska testa lite nu så återkommer jag så fort jag tagit fram en bra lösningSkapa komandon dynamiskt utan CommandBuilder
Jag bygger ett system som ska kunna arbeta mot flera olika databaser (Oracle och sql-erver till att börja med).
För att klara av detta använder jag mig av interfacen
IDbDataAdapter
IDbConnection
IDbCommand
Därefter använder jag mig av en Activator för att instansiera rätt sorts objekt (beroende på vilken databas jag använder)
T.ex.
myConnection = Activator.CreateInstance("C:\Program\Microsoft.NET\OracleClient.Net\System.Data.OracleClient.dll", IDbConnection)
Jag har en hel del tabeller i systemet och vill inte skriva Stored procedures för all kommunikation med databasen och vill på ngt sätt automatiskt generera update/insert/delete satser utifrån en select sats
Till en början använde jag mig av CommandBuilder för att generera update/delete/insert kommandon. Efter att ha gått över och använda interfacen ovan så hittar jag ingen bra metod att skapa mina insert/update/delete kommandon dynamiskt.
Någon som har ett förslag om hur man kan göra detta utan att använda CommandBuilder objektet. Alternativt om det finns ngt bra sätt att använda CommandBuilder objektet tillsammans med interfacen ovan.
Kod innan interfacen kom i spel:
Dim SelectComand As OracleCommand = oConn.CreateCommand()
Dim DataAdapter As OracleDataAdapter
Dim CommandBuilder As New System.Data.OracleClient.OracleCommandBuilder
SelectComand.CommandText = "SELECT * FROM " & strTabellnamn
DataAdapter = New OracleDataAdapter(SelectComand)
CommandBuilder = New OracleCommandBuilder(DataAdapter)
DataAdapter.Update(dsDataSet)Sv: Skapa komandon dynamiskt utan CommandBuilder
Ett förslag är att du skapar en abstrakt klass som innehåller alla vanliga anrop mot databas och skapar subklasser för varje provider som ärver basklassen. I dessa subklasser lägger du till deras egna CommandBuilders. Du kan tex i basklassen ha en metod som heter BuildCommand som måste överlagras av alla subklasser och i överlagringen anropar du deras respektive CommandBuilder.
Ett förslag är att du tar en titt på Microsoft Data Access Block version 3.0.
/Fredrik Normén NSQAURED2
http://www.nsquared2.netSv: Skapa komandon dynamiskt utan CommandBuilder
Vet du hur CommandBuilder gör för att bygga select-satserna. Vad e det för klasser och metoder den använder för att få ut informationen om tabeller från databasen. För om jag har fattat det rätt så frågar CommandBuilder objectet databasen om shemat för den tabell som select-satsen berör och skapar utifrån de informationen Update/insert/delete -satser med tillhörande parametrar.
Är det någon som har gjort någon test eller läst någon test om hur mycket prestanda man förlorar genom att använda sig av commandbuilder i stället för att skriva alla satserna själv.
Låter vettigt att göra som du föreslår med BuildCommand osv. Idag har jag en abstrakt klass som hanterar alla sorters db-kopplingar. Om jag sen vill ha en dataklass som arbetar mot en specifik tabell eller uppsätttning tabeller får den ärva från den abstrakta klassen och sedan specificera sina select-satser.Sv: Skapa komandon dynamiskt utan CommandBuilder
[Microsoft Data Access Application Block för .NET]
Här har du länken till DAAB 3.0.
http://www.gotdotnet.com/Community/Workspaces/Workspace.aspx?id=c20d12b0-af52-402b-9b7c-aaeb21d1f431
CommandBuilder bygger inte select-satster ;) Den utgår som du säkert vet från ett SelectCommand objekt och gör extra databas anrop för att få ut metdata för att kunna skapa InsertCommand, DeleteCommand och UpdateCommand objekten. Select frågan i SelectCommand måste returnera en primåär nycket eller unik column för att fungera.
Jag skulle inte rekommendera dig att använda CommandBuilder om prestandan spelar stor roll för dig. Det är bättre att själv sätta upp InsertCommand etc.
Självklart är det betydligt enklare att använda CommandBuildern och det tar mindre tid att utveckla. Om du anser att du har råd med den extra resursen som krävs av CommandBuilder för att kunna utveckla fortare och gör det enkelhet för dig, så tycker jag att du kan använda dig av CommandBuilder.
Snart kommer det artiklar från Microsoft om hur och vad man bör tänka på för att öka prestandan på sina tillämpningar. Där rekommenderar tex Microsoft att inte använda CommandBuilder i runtime. Jag skulle rekommendera dig att läsa dom artiklaran när dom dyker upp, för det kan ge dig en hel del kunskap om hur både .Net fungerar och vad utvecklare bör tänka på för att få ökad prestanda på sina tillämpningar.
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Skapa komandon dynamiskt utan CommandBuilder
En annan sak som jag undrar är om man inte kan få ut tillräckligt med information från typade dataset för att skapa insert/update och delete commandon.
vilka av följande parametrar behöver man igentligen använda?
Parameter.ParameterName
Parameter.DbType
Parameter.Size
Parameter.Direction
Parameter.IsNullable
Parameter.Precision
Parameter.Scale
Parameter.SourceColumn
Parameter.SourceVersion
Parameter.ValueSv: Skapa komandon dynamiskt utan CommandBuilder
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Skapa komandon dynamiskt utan CommandBuilder
Att skriva funktionen är ett engångsjobb och man slipper fråga databasen efter metainformation för att skapa command objekten vilket borde leda till förbättrad prestanda eller? Var bara en tanke men den kanske inte fungerar i Praktiken ;-)Sv: Skapa komandon dynamiskt utan CommandBuilder
Sv: Skapa komandon dynamiskt utan CommandBuilder
Det du ev kommer att spara prestanda på är den extra tid då en connection måste vara öppen för att CommandBuilder ska kunna skapa upp InsetCommand och resterande objekt.
Om du utgår från ett typat dataset så kommer du ev alltid behöva använda dig av det typade dataset i din metod, du kommer kanske få problem med helt vanliga dataset.
Det tar iofs inte så lång tid att skapa en genererare utifrån ett Dataset, så jag är sammtidigt nyfiken på prestandavinsten att själv generera fram kommandona än att låta CommandBuildern göra det. Om du nu bestämmer dig för att göra en egen genererare så skulle jag var mycket tacksam om du kunde göra ett prestanda test och posta in resultatet här i detta forum.
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Skapa komandon dynamiskt utan CommandBuilder
/Fredrik Normén NSQUARED2
http://www.nsquared2.netSv: Skapa komandon dynamiskt utan CommandBuilder
Tack för förslagen och informationen Fredrik