Toon posts:

[asp.net] krijg fout bij invoeren grote text in mysql

Pagina: 1
Acties:
  • 145 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig met een soort webspider te maken. Hiervoor wil ik een site opslaan
in de database. Als de site nu klein is lukt de INSERT wel gewoon maar als hij groter is (www.bcc.nl) doet hij het niet.
Ik krijg dan een :System.ArgumentException: DataSet Error with query error.
Als ik de query dan copy/paste naar phpMyAdmin werkt de query wel gewoon
dus erges een buffer limit ofzo? Ik heb echt geen flauw idee. Enig idee waar dit aan kan liggen of verholpen kan worden.

de insert statement:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string s;
WebRequest wrGETURL;
wrGETURL = WebRequest.Create(sUrl);
            
WebProxy myProxy = new WebProxy("myproxy",80);
myProxy.BypassProxyOnLocal = true;

wrGETURL.Proxy = WebProxy.GetDefaultProxy();

Stream objStream;
objStream = wrGETURL.GetResponse().GetResponseStream();

StreamReader objReader = new StreamReader(objStream);

s = Regex.Replace(objReader.ReadToEnd(),"\"|'","");

// DE QUERY WAAR HET DOUT GAAT
dCon.executeQuery("INSERT INTO spider_exampledata (websiteId, roundId, url, data) VALUES('"+wWebsite.getWebsiteId().ToString()+ "', 1,'"+ sUrl +"','"+s+"')");


dbcon class (relevante gedeeelte):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int executeQuery(string sQuery)
{
            
    try
    {
        OleDbCommand com = new OleDbCommand(sQuery,Ocon);
                return com.ExecuteNonQuery();
    }
    catch (Exception e)
    {
        throw new ArgumentException("DataSet Error with query: "+sQuery);
                
    }
    return -1;
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Herschrijf je query eens, en maak gebruik van parameters:

code:
1
2
3
4
5
6
7
8
OleDbConnection conn = new OleDbConnection ( ... );
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO tabel (veld1, veld2 ) VALUES (@p_veld1, @p_veld2)";
cmd.Parameters.Add ("@p_veld1", OleDbType.Integer);
cmd.Parameters.Add ("@p_veld2", OleDbType.Binary); // evt binary gebruiken voor 
die data?
cmd.Parameters["@p_veld1"].Value = ...

[ Voor 6% gewijzigd door whoami op 16-01-2003 09:43 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Als je parameters gebruikt los je dan dit probleem op (ben nu even niet in staat om uit te testen), hoekomt het dan dat het met parameters wel werkt en als je een query string opbouwt weer niet?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Verwijderd schreef op 16 January 2003 @ 10:43:
Als je parameters gebruikt los je dan dit probleem op (ben nu even niet in staat om uit te testen)
Ben ik niet zeker. ;)
Gewoon ff een andere methode proberen.
hoekomt het dan dat het met parameters wel werkt en als je een query string opbouwt weer niet?


Als je parameters gebruikt, dan moet jij je niet bezig houden met het converten van de data naar een string, om zo je querystring te kunnen opbouwen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
hmm, probeer nu met die parameters(simpel voorbeeld dat alleen de url als parameter invult en de rest gewoon beetje text/nummers):
code:
1
2
3
4
cmd.CommandText = "INSERT INTO spider_exampledata (websiteId, roundId, url, data) VALUES (1,1 ,@p_url, 'wat data')";
cmd.Parameters.Add ("@p_url", OleDbType.VarChar);
cmd.Parameters["@p_url"].Value = sUrl;
cmd.ExecuteNonQuery();

maar krijg nu de volgende error:
System.Data.OleDb.OleDbException: No error information available: DB_E_ERRORSINCOMMAND(0x80040E14

snap er nix van waarom ie dit nu weer doet(op google hebben verschillende mensen dit probleem ook)

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Moet je die enkele quotes rond wat data niet escapen?

https://fgheysels.github.io/


Verwijderd

Topicstarter
daar ligt het niet aan, als ik de query gewoon zonder @p_url doe en hiervaan 'url' van maak, dus gewoon om even te testen -> werkt ie wel. ligt puur aan de parameters vreemd genoeg.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
MSDN Info over error

Bevat de error-message geen verdere info?

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik krijg verder geen foutmelding te zien idd...

hmm, heb wat dingen even getest met de volgende resultaten:
1. met een 200.000 a's in een string gezet en die dan ineens naar de table schrijven dat werkt.
code:
1
2
for (int i=0; i<=200000;i++)
s = s+"a";


2. webiste binnen gehaald, en hiervan 1 lange string gemaakt en dit waren dan 36448 karakters en die wil hij niet posten:
code:
1
2
3
4
5
6
7
string sLine = "";
while (sLine!=null)
{
    sLine = objReader.ReadLine();
    if (sLine!=null)
        s = s + Regex.Replace(sLine,"\"|'|\n","");
}


hieruit blijkt dus (denk ik) dat het niet aan de lengte ligt maar ergens anders aan. de string is niet te groot maar wat dan?

[ Voor 10% gewijzigd door Verwijderd op 16-01-2003 13:51 ]


Verwijderd

Topicstarter
ik heb een hele website erin gestopt, string regel voor stringregel mbv sLine = objReader.ReadLine(); maar hij geeft aan dat de volgende 4 verschillenende strings een error optreedt als ik deze in de DB wil stoppen:

NS4=(document.layers)?true:false;
IE4=((document.all)&&(bV=4))?true:false;
MOZ=(bv=5)&&(browserName==Netscape)?true:false;
ver4=(NS4||IE4)?true:false;

voorbeeld output:
DataSet Error with query: UPDATE spider_exampledata SET data = 'MOZ=(bv=5)&&(browserName==Netscape)?true:false;' WHERE dataId =19


De reste van de strings pikte die, wat is er nu juist fout met deze strings?

[ Voor 18% gewijzigd door Verwijderd op 16-01-2003 19:58 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Eerlijk gezegd, ik weet het niet.
Er staan wel keywords in zoals true en false, maar die staan in een string dus die zouden betekenisloos moeten zijn.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik snap er niets meer van:
dit werkt:
code:
1
dCon.executeQuery("UPDATE spider_exampledata SET data = 'MOZ=(bv=5)&&(browserName==Netscape)' WHERE dataId ="+iDataId.ToString());

en dit niet:
code:
1
dCon.executeQuery("UPDATE spider_exampledata SET data = 'MOZ=(bv=5)&&(browserName==Netscape)?' WHERE dataId ="+iDataId.ToString());

zoek de verschillen: bij de 1 staat er een ? en bij de ander niet..

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 25-08 13:24

gorgi_19

Kruimeltjes zijn weer op :9

http://www.dotnet247.com/247reference/msgs/27/137120.aspx :P
quote: Newsgroup - Help question on parametrized queries
<From MSDN>
The SQL Server.NET Data Provider does not support the question mark (?)
placeholder for passing parameters to a SQL Statement or a stored procedure
called by a Command of CommandType.Text. In this case, named parameters must
be used.

[ Voor 74% gewijzigd door gorgi_19 op 16-01-2003 20:12 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Zeer vreemd.

In C# heb je een operator die voor strings kan zetten, zodat je niet alle tekens hoeft te escapen. (Dat is de @), heb je in VB.NET ook niet zoiets?

C#:
code:
1
string s1 = @"c:\test\data";

is hetzelfde als:
code:
1
string s1 = "c:\\test\\data";


Maar ik denk niet dat het daar zal aanliggen.
Heb je het al eens geprobeerd door je string door:
code:
1
Server.HtmlEncode()

te halen?
of was het nu weer Server.HtmlDecode()

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42


Mja, maar dan nog begrijp ik niet waarom het een probleem geeft....
In dat voorbeeld is die string een SQL - string die uitgevoerd wordt, en .NET aanziet dat ? niet als een parameter-placeholder. (Naar ik vermoed was dit dus vroeger zo om parameters te gebruiken). Maar als .NET dat nu niet meer accepteert als parameter placeholder, waarom maakt hij er dan problemen van? Waarom ziet hij het niet als een nietszeggend karakter?

En als je die code dan als volgt schrijft:
code:
1
2
3
4
OleDbCommand cmd = new OleDbCommand (conn);
cmd.CommandText = "INSERT INTO tabel (veld) VALUES (@p_param)";
cmd.Parameters.Add ("@p_Param", OleDbType.Varchar);
cmd.Parameters["@p_param"].Value = "string met een vraagteken ? ";

Zou het dan toch wel moeten werken?

[ Voor 21% gewijzigd door whoami op 16-01-2003 20:16 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
wat moet ik importen om van Server.XXX gebruik te maken, nu kent ie server object nog niet ( sorry voor luie vraag maar ik wordt zo moe van dit probleem :()

[ Voor 27% gewijzigd door Verwijderd op 16-01-2003 20:18 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 25-08 13:24

gorgi_19

Kruimeltjes zijn weer op :9

whoami: Het was een linkje die ik in Google tegenkwam. Het probleem zelf ben ik nog nooit tegengekomen.

Het enige wat ik kan doen is met linkjes gooien over dit onderwerp.. :)
Het enige wat ik kan bedenken is dat het een 'verboden teken is'
Zeker na deze quote:
'The question mark specifies that we will later put a parameter (a variable of sorts) here. This will not work unless we add the parameter!
Maar dit blijft giswerk..

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
code:
1
System.Web.HttpServerUtility

denk ik....

Maareh, heb je dat linkje van gorgi_19 al eens bekeken?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
gorgi_19 schreef op 16 januari 2003 @ 20:20:
whoami: Het was een linkje die ik in Google tegenkwam. Het probleem zelf ben ik nog nooit tegengekomen.

Het enige wat ik kan doen is met linkjes gooien over dit onderwerp.. :)
Het enige wat ik kan bedenken is dat het een 'verboden teken is'
Zeker na deze quote:

[...]

Maar dit blijft giswerk..

Ja, maar, maar , maar, ..... in .NET gebruiken we geen ? meer als parameter, dus mag hij dat niet als een raar teken gaan zien...
Maar anyway, als je gebruik zou maken van parameters, zou hij niet meer mogen protesteren dan denk ik...

https://fgheysels.github.io/


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 16-08 23:04
' - tjes eruitfilteren of escapen

woei!


Verwijderd

Topicstarter
het rare is dat UPDATE's met stukken als: http://www.dixons.nl/Stor.../inhoudsOpgave.asp?itemID
wel erin mogen en andere stukken met ? weer niet. Ik ga zo es die link es grondig bestuderen.. Maar over 30 minuten: donderdagavond->studenten avond :P ff
wat problemen van me af zetten..
Maar wat wordt je er kriegel van..

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 25-08 13:24

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 16 januari 2003 @ 20:22:

[...]

Ja, maar, maar , maar, ..... in .NET gebruiken we geen ? meer als parameter, dus mag hij dat niet als een raar teken gaan zien...
Maar anyway, als je gebruik zou maken van parameters, zou hij niet meer mogen protesteren dan denk ik...
whoami: een beetje laat, maar ik kwam deze quote nog tegen.. ? wordt blijkbaar nog wel als parameter gebruikt. :)
When using parameters with an OleDbCommand, the names of the parameters added to the OleDbParameterCollection must match the names of the parameter markers in your stored procedure. The OLE DB .NET Data Provider treats parameters in the stored procedure as named parameters and searches for the matching parameter markers.

The OLE DB .NET Data Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by a Command of CommandType.Text. In this case, you must use the question mark (?) placeholder, as in the following example.

SELECT * FROM Customers WHERE CustomerID = ?
As a result, the order in which Parameter objects are added to the Parameters collection must directly correspond to the position of the question mark placeholder for the parameter.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Hmm..
Hoe kun je dan een string in je DB bewaren met een parameter? Mij lijkt het dat, als je gebruik maakt van parameters, je wel een string kunt meegeven die een ? bevat:

code:
1
cmd.Parameters["@p_Param1"].Value = "Is dit een string?";


Zal het ff testen...

Ik heb dus ff getest:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO Tabel1 (naam) VALUES (@p_gName)";
            
cmd.Parameters.Add ("@p_gName", OleDbType.VarChar);
                        
cmd.Parameters["@p_gName"].Value = "naam?veld";
            
try
{
  conn.Open();
  cmd.ExecuteNonQuery();        
}
catch( OleDbException ex )
{
  MessageBox.Show ( ex.Message );
}
finally
{
  conn.Close();
}


Dit werkt dus, zoals ik verwacht had, zonder problemen. Misschien moet je het ook maar eens zo proberen. (Had ik het al niet eens vermeld?). :P

[ Voor 53% gewijzigd door whoami op 18-01-2003 11:27 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik kan in sommige gevallen gewoon de ? meesturen in de string, maar net bij 4 gevallen ging het dan toch fout.. heb nu een replace gedaan om zo de vraagtekens ff te vervangen. zal eens bovenstaand voorbeeld es gaan toepassen.
Nu weer een probleem trouwens met het ophalen van de grote string. .net geeft als fout:
DB_E_NOTABLE error, dit wijst erop dat de table niet bestaat. Maar voer ik de query gewoon uit in phpMyAdmin dan werkt het wel gewoon goed.

google link:
http://groups.google.com/...ecf%40tkmsftngxa03&rnum=1
dit heb ik dus ook.

[ Voor 17% gewijzigd door Verwijderd op 18-01-2003 11:52 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
Misschien zitten er nog wel een paar bugs in die MySQL .NET driver ofzo...
Wat drijft mensen toch om MySQL te willen gebruiken... :P :+

https://fgheysels.github.io/


Verwijderd

Topicstarter
hehe, tja, ms sql kost 1500 euro/ licentie heb ik begrepen van de opdrachtgever anders wist ik het wel.... Verder wilde ik eigenlijk PostgreSQL maar ik kon daar nog geen goede driver voor vinden.
Gebruik My OleDB.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
MSDE is gratis....
(SQL Server engine, maar je kunt slechts 5 concurrente sessies hebben, daarna wordt er een vertraging ofzo ingebouwd).

https://fgheysels.github.io/

Pagina: 1