Voor een nieuws site binnen het bedrijf waar ik werk, maak ik gebruik van ASP (JScript, niet .NET) & MSSQL2005 Express.
De body van een nieuws-item word daarbij opgeslagen in een varchar(max) veld.
Bij het ophalen van de waarde uit dit body veld, krijg ik nu niks in de browser te zien (maakt niet uit welke browser).
Google
Rond gezocht op google, en wat ik vooral terugvind is het bekende probleem waar velden als varchar(max) achteraan in de kolom selectie van je query moeten worden gedefiniëerd, maar dat was mij al bekend, dus dat doe ik ook.
Na enkele testen gedraaid, werd het probleem (voor mij) alleen maar raarder. Zie ook de testcase hieronder. De originele code is in JScript, maar de testcase heb ik voor het gemak in VBScript neergezet. Beiden hebben hetzelfde probleem.
Testcase
Aanmaken van de tabel & invoeren van één enkele waarde.
Connectionstring moet natuurlijk even worden aangepast indien iemand van plan is het zelf ook te testen.
Uitvoeren van de selectie, hier gebeuren rare dingen:
Wanneer bovenstaande code word gedraaid, word de lengte correct weergegeven (54 karakters), de vartype is 8 (string).
Echter, bij de waarde, komt dit te staan:
Direct na de eerste bracket word de string afgekapt, de laatste bracket word niet naar het scherm geschreven.
Daarnaast levert de Asc '0' op. Ik ga er vanuit dat die 0 word gezien als het einde van de string, vandaar dat de Response.Write() er op dat moment mee ophoud.
De hele variable b staat daar overigens vol mee, maar waarom?
Wanneer ik de select-query in SQL Server Management Studio Express draai, dan geeft die de waarde wel correct weer.
Oplossing?
Een simpele oplossing voor bovenstaande testcase is de volgende select-query gebruiken, ipv de select die in de testcase is te vinden:
Echter, de originele query is een stuk ingewikkelder dan dat, en MSSQL staat het niet toe om dingen als 'distinct' te gebruiken icm 'text' velden, ook niet als er convert voor word gebruikt.
Een andere oplossing is gebruik maken van varchar(8000) ipv varchar(max). Dat doe ik nu ook, maar dat betekend wel dat ik aan een max van 8000 characters gebonden ben.
Op zich niet zo heel erg, ik hoor het wel wanneer men gaat zeuren dat het niet meer past ;-)
Er word gebruik gemaakt van een WYSIWYG editor, dus dat vult wel een stuk sneller dan plain text.
Toch ben ik benieuwd: heeft iemand enig idee hoe dit kan worden veroorzaakt? Ik heb veel mee gemaakt met ASP & verschillende database engines, maar dit slaat toch wel alles.
Het moge duidelijk zijn dat dit totaal geen tijdsnood of iets dergelijks heeft.
De body van een nieuws-item word daarbij opgeslagen in een varchar(max) veld.
Bij het ophalen van de waarde uit dit body veld, krijg ik nu niks in de browser te zien (maakt niet uit welke browser).
Rond gezocht op google, en wat ik vooral terugvind is het bekende probleem waar velden als varchar(max) achteraan in de kolom selectie van je query moeten worden gedefiniëerd, maar dat was mij al bekend, dus dat doe ik ook.
Na enkele testen gedraaid, werd het probleem (voor mij) alleen maar raarder. Zie ook de testcase hieronder. De originele code is in JScript, maar de testcase heb ik voor het gemak in VBScript neergezet. Beiden hebben hetzelfde probleem.
Testcase
Aanmaken van de tabel & invoeren van één enkele waarde.
Connectionstring moet natuurlijk even worden aangepast indien iemand van plan is het zelf ook te testen.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
| Dim Connection Set Connection=Server.CreateObject("ADODB.Connection") Connection.Open("driver={SQL Native Client};server=localhost;database=asa;uid=;pwd=;trusted_connection=yes;") Connection.Execute("create table test (body varchar(max))") Connection.Execute("insert into test (body) values ('dit is een test waarde met een length van 54 karakters')") Connection.Close() |
Uitvoeren van de selectie, hier gebeuren rare dingen:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Dim b, Connection, rs Set Connection=Server.CreateObject("ADODB.Connection") Connection.Open("driver={SQL Native Client};server=localhost;database=asa;uid=;pwd=;trusted_connection=yes;") Set rs=Connection.Execute("select body from test") b=rs.Fields.Item("body").Value Response.Write("Value: ["&b&"]") Response.Write("<br />Length: "&Len(b)&"<br />Vartype: "&vartype(b)&"<br />Asc: "&Asc(Left(b,1))) rs.Close() Connection.Close() |
Wanneer bovenstaande code word gedraaid, word de lengte correct weergegeven (54 karakters), de vartype is 8 (string).
Echter, bij de waarde, komt dit te staan:
code:
1
| Value: [ |
Direct na de eerste bracket word de string afgekapt, de laatste bracket word niet naar het scherm geschreven.
Daarnaast levert de Asc '0' op. Ik ga er vanuit dat die 0 word gezien als het einde van de string, vandaar dat de Response.Write() er op dat moment mee ophoud.
De hele variable b staat daar overigens vol mee, maar waarom?
Wanneer ik de select-query in SQL Server Management Studio Express draai, dan geeft die de waarde wel correct weer.
Oplossing?
Een simpele oplossing voor bovenstaande testcase is de volgende select-query gebruiken, ipv de select die in de testcase is te vinden:
SQL:
1
| select convert(text, body) as body from test |
Echter, de originele query is een stuk ingewikkelder dan dat, en MSSQL staat het niet toe om dingen als 'distinct' te gebruiken icm 'text' velden, ook niet als er convert voor word gebruikt.
Een andere oplossing is gebruik maken van varchar(8000) ipv varchar(max). Dat doe ik nu ook, maar dat betekend wel dat ik aan een max van 8000 characters gebonden ben.
Op zich niet zo heel erg, ik hoor het wel wanneer men gaat zeuren dat het niet meer past ;-)
Er word gebruik gemaakt van een WYSIWYG editor, dus dat vult wel een stuk sneller dan plain text.
Toch ben ik benieuwd: heeft iemand enig idee hoe dit kan worden veroorzaakt? Ik heb veel mee gemaakt met ASP & verschillende database engines, maar dit slaat toch wel alles.
Het moge duidelijk zijn dat dit totaal geen tijdsnood of iets dergelijks heeft.