31. december 2005 - 14:22Der er
37 kommentarer og 1 løsning
En hård lille nytårs nød at knække
Hejsa E
Jeg sidder og roder lidt med et problem, men nu må jeg altså have ander med ind over inden jeg bliver helt gal :)
jeg har et program som kalder en webservice for at checke for opdateringer osv. webservicen modtager en variabel og kalder en stored procedure som returnerer et resultat. fint nok...
Der kommer en MySql fejl ved alle kald som jeg ikke kan greje!
Koden: webservice - .net 1.1 lavet så den returnerer en string så jeg kan læsse fejlen, normalt er det en int.
[WebMethod(Description="This service gives dealers status")] public string xgetProgStatus(string progVersion) { string status = getProgStatus2(progVersion); return status; }
try { // 1 = OK // 4 = der findes en nyere programversion // 5 = programmet skal opdateres // 6 = programversion mangler conn.Open(); progStatus = cmd.ExecuteScalar().ToString(); } catch (Exception ex) { progStatus = ex.ToString(); } finally { conn.Close(); } return progStatus; }
Stored procedure;
CREATE PROCEDURE `P_GetProgVersion` ( Pversion varchar(45) ) BEGIN SELECT CASE WHEN status = NULL THEN 6 WHEN status = 0 THEN 1 WHEN status = 1 THEN 4 WHEN status = 2 THEN 5 END AS vstatus FROM qeversion where version = Pversion;
-- 1 = OK -- 4 = der findes en nyere programversion -- 5 = programmet skal opdateres -- 6 = programversion mangler END
Fejlen:
MySql.Data.MySqlClient.MySqlException: Parameter '?' must be defined at MySql.Data.MySqlClient.MySqlCommand.SerializeParameter(PacketWriter writer, String parmName) at MySql.Data.MySqlClient.MySqlCommand.PrepareSqlBuffers(String sql) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() at MySql.Data.MySqlClient.MySqlCommand.ExecuteScalar() at VinGuideXML.VinGuideXML.getProgStatus2(String progVersion)
Jeg har også læst mig frem til, at man i MySql 5 bruger ? foran parametre i stored procedures, men...
I deres MySql Query Browser får man en fejlmeddelse når man bruger ?
You have an error in your SQL syntax; check the manual that corresponds to your MySql server version for the right syntax to use near '?version varchar(45) ) BEGIN SELECT CASE...
Det undrer mig da også at jeg har kunnet få det til at virke uden at bruge ?, dog ikke i forbindelse med webservices.
Hvis jeg prøver at køre det med ? (til trods for fejlen i MQB) får jeg en anden fejl: MySql.Data.MySqlClient.MySqlException: Exception trying to retrieve parameter info for P_GetProgVersion: Invalid attempt to access a field before calling Read() ---> MySql.Data.MySqlClient.MySqlException: Invalid attempt to access a field before calling Read() at MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue(Int32 index) at MySql.Data.MySqlClient.MySqlDataReader.GetString(Int32 index) at MySql.Data.MySqlClient.StoredProcedure.GetParameterList(String spName) at MySql.Data.MySqlClient.StoredProcedure.Prepare(String spName) --- End of inner exception stack trace --- at MySql.Data.MySqlClient.StoredProcedure.Prepare(String spName) at MySql.Data.MySqlClient.MySqlCommand.PrepareSqlBuffers(String sql) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() at MySql.Data.MySqlClient.MySqlCommand.ExecuteScalar() at VinGuideXML.VinGuideXML.getProgStatus2(String progVersion)
Har lige opgraderet MySql til 5.0.18 men det hjalp heller ikke. Arne er du tør for ideer ? for så må jeg vel hellere skrive det til Mysql dev som en bug!
try { // 1 = OK // 4 = der findes en nyere programversion // 5 = programmet skal opdateres // 6 = programversion mangler conn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); progStatus = reader["vstatus"].ToString(); } catch (Exception ex) { progStatus = ex.ToString(); } finally { conn.Close(); } return progStatus; }
DROP PROCEDURE IF EXISTS `vinguide`.`P_GetProgVersion` $$ CREATE PROCEDURE `P_GetProgVersion`( _version varchar(45) ) BEGIN SELECT CASE WHEN status = NULL THEN 6 WHEN status = 0 THEN 1 WHEN status = 1 THEN 4 WHEN status = 2 THEN 5 END AS vstatus FROM qeversion where version = _version;
-- 1 = OK -- 4 = der findes en nyere programversion -- 5 = programmet skal opdateres -- 6 = programversion mangler END
MySql.Data.MySqlClient.MySqlException: Parameter '?' must be defined at MySql.Data.MySqlClient.MySqlCommand.SerializeParameter(PacketWriter writer, String parmName) at MySql.Data.MySqlClient.MySqlCommand.PrepareSqlBuffers(String sql) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() at VinGuideXML.VinGuideXML.getProgStatus2(String progVersion)
Det virker fint hvis jeg kalder proceduren direkte i query browseren, så det er ikke den i hvert fald. Jeg vil lige prøve at lave en app der kalder den, for at se om det er webservicen, for så må det jo være connectoren...
3.23 skal først opgraderes til 4.0, så til 4.1 og så til sidst til 5.0 Jeg prøvede at opgradere en 4.0 til 5.0 og det tog en krig at få det til at køre...
Nu skete der noget. Jeg kunne ikke få lov til at lave en reference til den Mysql data dll som jeg hidtil har brugt, så jeg prøvede at kopiere dll fra installationsmappen over i projektmappen igen og selvom de har samme versionsnummer så var de ikke lige store, og nu er der hul igennem, bortset fra at koden ikke virker... måske du lige vil hjælpe med det
CREATE TABLE qeportal (serial VARCHAR(20), active CHAR(1)); INSERT INTO qeportal VALUES('12345678901234567890', 'y'); DELIMITER // CREATE PROCEDURE checkserial(_serial varchar(20)) BEGIN SELECT CASE WHEN active IS NULL THEN 2 WHEN active = 'y' THEN 1 WHEN active = 'n' THEN 3 ELSE 2 END AS userstatus FROM qeportal WHERE serial = _serial; END// DELIMITER ; CALL checkserial('12345678901234567890'); CALL checkserial(''); DELIMITER // CREATE PROCEDURE checkserial2(_serial varchar(20)) BEGIN DECLARE n INTEGER; SELECT COUNT(*) INTO n FROM qeportal WHERE serial = _serial; IF n > 0 THEN SELECT CASE WHEN active IS NULL THEN 2 WHEN active = 'y' THEN 1 WHEN active = 'n' THEN 3 ELSE 2 END AS userstatus FROM qeportal WHERE serial = _serial; ELSE SELECT 2 AS userstatus; END IF; END// DELIMITER ; CALL checkserial2('12345678901234567890'); CALL checkserial2(''); DROP PROCEDURE checkserial; DROP PROCEDURE checkserial2; DROP TABLE qeportal;
mysql> DELIMITER // mysql> CREATE PROCEDURE checkserial(_serial varchar(20)) -> BEGIN -> SELECT CASE WHEN active IS NULL THEN 2 WHEN active = 'y' THEN 1 WHEN active = 'n' THEN 3 ELSE 2 END AS userstatus FROM qeportal WHERE serial = _seria l; -> END// Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER // mysql> CREATE PROCEDURE checkserial2(_serial varchar(20)) -> BEGIN -> DECLARE n INTEGER; -> SELECT COUNT(*) INTO n FROM qeportal WHERE serial = _serial; -> IF n > 0 THEN -> SELECT CASE WHEN active IS NULL THEN 2 WHEN active = 'y' THEN 1 W HEN active = 'n' THEN 3 ELSE 2 END AS userstatus FROM qeportal WHERE serial = _s erial; -> ELSE -> SELECT 2 AS userstatus; -> END IF; -> END// Query OK, 0 rows affected (0.00 sec)
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.