MySQL VB.Net Delimiter probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
Hallo,

Ik wil graag een text bestand met sql query's uitvoeren alleen werkt dit niet als ik stored procedures erbij zet.

als voorbeeld:

create.sql
code:
1
2
3
4
5
6
7
8
9
DROP TABLE IF EXISTS `website`.`manage_users`;
CREATE TABLE  `website`.`manage_users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `password` varchar(100) NOT NULL,
  `salt` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `username` (`username`,`password`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Dit voer ik uit:
code:
1
2
3
4
5
6
7
8
Dim conn As New MySqlConnection(connectionString)
conn.Open()
Dim cmd As New MySqlCommand
cmd.Connection = conn
cmd.CommandText = fileContents
Dim adp As New MySql.Data.MySqlClient.MySqlDataAdapter(cmd)
Dim ds As DataSet = New DataSet
adp.Fill(ds)


En dat werkt gewoon.

Maar verander ik create.sql naar het toevoegen van een stored procedure:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER $$

DROP PROCEDURE IF EXISTS `update_setting` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_setting`(
  txt_setting varchar(45),
  txt_value text
)
BEGIN

  select * from manage_users;

END $$

DELIMITER ;


dan krijg ik een error op delimiter:
code:
1
2
3
4
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 
'DELIMITER $$ DROP PROCEDURE IF EXISTS `update_setting` $$ CREATE DEFINER=`ro' at line 1


Heeft iemand enig idee hoe ik een stored procedure kan toevoegen via een sql query?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 06:56

Janoz

Moderator Devschuur®

!litemod

Als ik een beetje rondzoek lijkt het alsof delimiter enkel nodig is op de commandline. Probeer hem eens uit te voeren zonder de delimiter? (en wanneer dat nog niet werkt, eventueel de drop en de create apart uitvoeren)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
Ja dat heb ik geprobeerd.

Maar het probleem is dat in de stored procedure een ; (punt comma) zit.

code:
1
2
3
4
5
BEGIN

  select * from manage_users; <-- deze

END $$


Die query moet hij uitvoeren als ik de stored procedure aanroep (call update_setting();)

Maar tijdens het aanmaken van die stored procedure zit hij de punt coma als het einde van een opdracht.

Dus ipv
code:
1
2
3
4
5
6
7
8
9
CREATE PROCEDURE `update_setting`(
  txt_setting varchar(45),
  txt_value text
)
BEGIN

  select * from manage_users;

END $$


voert hij dit uit (tot de punt comma)
code:
1
2
3
4
5
6
7
CREATE PROCEDURE `update_setting`(
  txt_setting varchar(45),
  txt_value text
)
BEGIN

  select * from manage_users; <-- punt comma


Dus de delimiter moet veranderd worden van ; punt comma naar iets anders $$ bijvoorbeeld.
En in mysql query browser doet mysql dat met

code:
1
DELIMITER $$


maar doe ik het via een query dan slikt hij dat niet. :(

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 06:56

Janoz

Moderator Devschuur®

!litemod

Ik weet waarom die delimiter er is. Op de commandline heb je enkel de ; als afbakening van je query. Bij het uitvoeren vanuit een applicatie heb je echter nog een afbakening, en dat is de string die je opstuurt. Als ik een beetje rondkijk dan vind ik eigenlijk alleen php voorbeelden, maar daaruit lijkt het dat je gewoon de volledige definitie van de stored procedure op kunt sturen (incl ; ) en dat dat gewoon werkt. Blijkbaar werkt dat in VB anders?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
Janoz, je bent een held. :> :> :> :> :>

Zoals jij het zegt werkt het gewoon.

Gosh wat stom. Hoezo moeilijk doen als het makkelijk kan.

De delimiter kan er inderdaad uit. Ik had dat al geprobeerd, "dacht ik" alleen had ik toen een ; op een verkeerde plek nog staan.

Na je post heb ik het nog een keer geprobeerd en het werkt gewoon.

Excuus, je 1e post was al voldoende. Nogmaals bedankt _/-\o_

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DELIMITER $$

DROP PROCEDURE IF EXISTS `update_setting` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_setting`(
  txt_setting varchar(45),
  txt_value text
)
BEGIN

  update settings set value = txt_value where setting = txt_setting;

END $$

DELIMITER ;


wordt dus gewoon:
code:
1
2
3
4
5
6
7
8
9
10
DROP PROCEDURE IF EXISTS `update_setting`;
CREATE PROCEDURE `update_setting`(
  txt_setting varchar(45),
  txt_value text
)
BEGIN

  update settings set value = txt_value where setting = txt_setting;

END;