Avatar billede jokkejensen Novice
29. januar 2013 - 08:53 Der er 12 kommentarer og
1 løsning

Dynamic.Web api -> escape markup før insert i DB

Hej Eksperter.

Jeg sidder og forsøger at skrive et modul til Dynamic.web.

Deres API, indeholder kun IDbConnections, da løsningen kan køre mssql/access. Jeg ved bare ikke hvordan lortet fungere, er vandt til ex SqlClient.

kan jeg type tvinge en IdbConnections til at opføre sig som en normal SqlConnection ?

- Nå, det kunne være problemet skulle præsenteres først.

Jeg har noget skummelt markup fra en service jeg ikke har kontrol over, der modtager jeg følgende markup : "content" området:

http://pastebin.com/idmw1thj

Som man kan se er der brugt apos og quotes til at lave attributter i markuppen, disse vil jeg gerne escape før jeg benytter CMS'ets API til at kaste artiklerne ned i en lokal database. Og hvad jeg har læst mig til, kræver det at jeg benytter parameters på et sqlcommand.

Men her sidder jeg fast, jeg kan godt fyre Dynamic.Database.ExececuteNonQuery() af, men hvordan fanden får jeg så escaped den streng.

Men ville gerne lære at benytte et IdbDB Object.

Ex returnere Dynamicweb.Database.CreateAdapter() en iDbDataAdapter, hvordan smider jeg et sql command ind med values ?

http://developer.dynamicweb-cms.com/api/dynamicweb/ -> Dynamicweb -> Database

vh

Venligst
Jacob
Avatar billede dw-jea Nybegynder
29. januar 2013 - 10:40 #1
Hej Jacob

Der er flere måder, at løse den udfordring på. Hvis din tabel har en Identity kolonne som Primary Key, så er den letteste måde at løse problemet på, at lade dit data objekt nedarve fra Dynamicweb.Modules.Common.DbObject.

I din constructor kalder du base constructor, sådan:
public YourClass() : base("YourTable", "YourTableKeyColumn") {}.
Det vil virke for en løsning, der kører SQL, men hvis du på et tidspunkt også skal understøtte Access, skal du angive hvilken mdb-fil, din tabel lever i, som tredje parameter til
base("", "", "YourDatabase.mdb").

Derefter er det eneste, du skal gøre, at implementere de to abstrakte metoder Fill og FillRow, og DbObject klarer resten for dig.


Hvis du derimod ikke har en tabel med en Identity kolonne, så kan du, som du konkret spørger om, blot lave et cast fra IDbConnection til SqlConnection:
using (SqlConnection conn = (SqlConnection)Database.GetConnection()) {...}
Det kræver blot, at din løsning altid vil blive afviklet på SQL Server, eller vil det ikke virke.

Venligst
Jeppe
Senior Software Developer
Dynamicweb Software A/S

PS. Det er lettere at finde dine spørgsmål, og svare på dem, hvis du opretter dem på vores eget forum: http://developer.dynamicweb-cms.com/forum.aspx
Avatar billede dw-jea Nybegynder
29. januar 2013 - 10:47 #2
Vil lige præcisere.

Ved DbObject på Access, skal alle tre parametre angives, altså
base("YourTable", "YourTableKeyColumn", "YourDatabase.mdb")

Og så hedder den metode, der giver dig en database connection ikke Database.GetConnection() men Database.CreateConnection()
Avatar billede jokkejensen Novice
29. januar 2013 - 11:04 #3
tak Jea, jeg skal lige kigge på det, vender tilbage !!
Avatar billede jokkejensen Novice
29. januar 2013 - 11:05 #4
(det er typisk mssql vi benytter)
Avatar billede jokkejensen Novice
29. januar 2013 - 11:22 #5
using (SqlConnection conn = (SqlConnection)Database.CreateConnection())
                                {
                                       
                                }

Løser mine problemer perfekt, syntes ellers jeg havde forsøgt at typecaste.

Tak for din tid. Dropper du et svar.
Avatar billede jokkejensen Novice
29. januar 2013 - 11:39 #6
How, lige et hurtigt side spm.

For lettest at integrere Custommodules i DW search, så skal det helst være en flad database (477 rækker) der kommer lidt redundans data men ikke noget voldsomt. ?
Avatar billede dw-jea Nybegynder
29. januar 2013 - 14:15 #7
Når du siger DW Search, så antager jeg, at du mener søgning i frontend (Searchv1), og ja, så har du ret. Din ItemTable skal indeholde al den data, du vil søge i, da søgning ikke laver joins for at finde data.
Avatar billede dw-jea Nybegynder
29. januar 2013 - 15:20 #8
Svaret på det oprindelige spørgsmål er givet i min første kommentar. Håber også du fik svar på dit opfølgningsspørgsmål.
Avatar billede arne_v Ekspert
29. januar 2013 - 16:23 #9
Nu ved jeg ikke noget som helst om DynamicWeb, men at caste fra en IDbConnection til en SQLConnection er en gyselig loesning.

Nu er der nogen som har gjordt sig den umage at lave et database uafhaengigt API. Saa skal man ikke starte med at goere det database afhaengigt.
Avatar billede arne_v Ekspert
29. januar 2013 - 16:30 #10
IDbConnection understoetter parameters.

Outline:

DbProviderFactory dbf = DbProviderFactories.GetFactory(provstr);
IDbConnection con = dbf.CreateConnection();
con.ConnectionString = constr;
con.Open();
IDbCommand ins = con.CreateCommand();
ins.CommandText = "INSERT INTO ...";
ins.Connection = con;
IDbDataParameter p1 = ins.CreateParameter();
p1.ParameterName = "@id";
p1.DbType = DbType.Int32;
ins.Parameters.Add(p1);
IDbDataParameter p2 = ins.CreateParameter();
p2.ParameterName = "@txt";
p2.DbType = DbType.String;
p2.Size = 50;
ins.Parameters.Add(p2);
((IDbDataParameter)ins.Parameters["@id"]).Value = p1;
((IDbDataParameter)ins.Parameters["@txt"]).Value = p2;
ins.ExecuteNonQuery();
Avatar billede Syska Mester
30. januar 2013 - 23:40 #11
Alt efter hvor kompleske dine queries er, så ville jeg måske kigger på Dapper.

Det er extensions methods til IDbConnection ... dvs smart som Arne_v skriver :-)

Mega awesome simple wrapper og pisse hurtig.
http://code.google.com/p/dapper-dot-net/
Avatar billede jokkejensen Novice
12. februar 2013 - 08:15 #12
Tak for Jeres tid alle sammen, vil bruge Arne_V's fremover. Men da DW kun kører på mssql eller access, vil det meget sjældent være aktuelt med at benytte access databaserne, men igen, det er et custommodul til flere løsninger, så må hellere få rettet.

@Buzzzz >> jeg kører bare en opdateringsrutine fra et restkald, det tager under 2-3 sec (så snart restservice er vækket, .net app)

@Arne_V >> takker igen for det egentlige korrekte svar :), sig til hvis du vil ha' nogle points.

@Dw-jea >> tak for hurtigt level 2 support, det får jeg jo ikke på under 2 timer i DW fora, jeg ville slet ikke få flere synspunkter, og sikkert aldrig have lært at benytte Idb forbindelsen korrekt som i ligger op til gennem API.

Men performance mæssigt er det acceptabelt for mig, og skide skønt med eksempler, der følger deres API
Avatar billede jokkejensen Novice
01. maj 2013 - 12:12 #13
@dw-jea >> http://www.eksperten.dk/spm/980573

Så må vi se om der kommer respons på mit indlæg på Jeres forum før ovenstående, eller om i alle sidder og høster virtuelle points på exp.dk.

Sidste gang svarede du på 2 timer, så fulgte dit råd om at benytte Jeres fora, men... der sker intet.. Beklager min irritation, vil til en hver tid værdsætte din hjælp, men forstår ikke at jeg skal benytte Jeres forum, når det er lidt små dødt.

Venligst
Jacob
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester