Bug #53596 | 'Allow User Variables = True' - ignored in 6.3.1 | ||
---|---|---|---|
Submitted: | 12 May 2010 10:07 | Modified: | 12 May 2010 11:21 |
Reporter: | Jono G | Email Updates: | |
Status: | Can't repeat | Impact on me: | |
Category: | Connector / NET | Severity: | S2 (Serious) |
Version: | 6.3.1 | OS: | Windows |
Assigned to: | CPU Architecture: | Any | |
Tags: | 6.3.1, Connector .NET, Connector/Net |
[12 May 2010 10:07]
Jono G
[12 May 2010 10:13]
Tonci Grgin
Hi Jono. I am wondering if your query: "select date, @currentdate := date AS rowdate, ((SELECT quantity FROM config_roomtype WHERE id = '3') - (SELECT COUNT(id) FROM reservation_rooms WHERE room_type_id = '3' AND date = rowdate)) AS EQO from availability works in command line client at all... Please test the correctness of your query first and then we'll see.
[12 May 2010 10:14]
Jono G
Hi Tonci, Yes in the MySQL Query browser it returns the rows perfectly fine. In VS2010 if I remove the @rowdate stuff as mentioned above, then i get no errors. Feel free to contact me via email and I can show you via Teamviewer my screen.....
[12 May 2010 10:17]
Tonci Grgin
Definitely works given correct query: MySqlConnection conn = new MySqlConnection(); conn.ConnectionString = "DataSource=xx;Database=test;UserID=xx;Password=xx;PORT=xx;Allow Zero Datetime=True;allow user variables = true"; conn.Open(); MySqlCommand cmdCreateTable = new MySqlCommand("SET @StartDate = NOW()", conn); cmdCreateTable.CommandTimeout = 0; cmdCreateTable.ExecuteNonQuery(); cmdCreateTable.CommandText = "SELECT @StartDate"; DataTable dt = new DataTable(); MySqlDataAdapter da = new MySqlDataAdapter(cmdCreateTable); da.Fill(dt); and so on...
[12 May 2010 10:19]
Jono G
I have also tested this query in the mysql query browser: "myCommand.CommandText = "select date, @currentdate := 7 AS rowdate FROM reservation_rooms" It returns the rows in the mysql query browser. And this returns the same error when run from VS2010. So the problem is the '@currentdate := 7 AS rowdate' That part is not working when used in VS2010 with MySQL Connector/NET 6.3.1 Don't know if that helps?
[12 May 2010 10:21]
Jono G
Can I show you on Teamviewer Tonci? Thanks.
[12 May 2010 10:26]
Tonci Grgin
Jono, don't know what Teamviewer is... Now, for your query. It comes as a surprise such syntax is actually allowed as it is meaningless. Can you tell me what on earth are you trying to achieve by putting "@currentdate := 7" in query? I need to understand that before proceeding. Also, it would be best if you can make a test query not dependent on any tables you have (and I don't).
[12 May 2010 10:55]
Jono G
Hi Tonci, Teamviewer is a screen sharer program where I can show you my screen in realtime and you can control my mouse/keyboard. You can view more here: www.teamviewer.com - or download the program here http://www.teamviewer.com/download/TeamViewerQS.exe and give me your ID once installed so we can screenshare. In regards to that last query, that was just a point of example to show that a SQL local variable that is generated inside the SQL Select does not work. The original query was a larger one dependant on multiple tables. If you try this on a table with just a id column: "select id, @numbercount := 1 AS numbercount, (@numbercount + id) as doublednumbercount FROM reservation_rooms" In MySQL query it will return 3 columns - id, numbercount and doublednumbercount. It will show the row id, and it will also show a column doublednumbercount which is the total of the current row number + the numbercount variable. Thanks.
[12 May 2010 11:03]
Tonci Grgin
Jono, using teamviewer would be remote debugging. Fir that, you need a support contract. Now, I've checked your sample and found out that mysql command line client indeed sets user variable value that way, so your claim is legit. However, writing "select id, @numbercount := 1 AS numbercount, (@numbercount + id) as doublednumbercount FROM reservation_rooms" does not look too intuitive to me. As a workaround, while I test in c/NET, please try following sequence: SET @numbercount=1; select id, @numbercount AS numbercount, (@numbercount + id) as doublednumbercount FROM reservation_rooms" That should work.
[12 May 2010 11:08]
Jono G
Hi Tonci, I have tried: " myCommand.CommandText = "SET @numbercount=1; select id, @numbercount AS numbercount, (@numbercount + id) as doublednumbercount FROM reservation_rooms;" " However same error. The above SQL works in MySQL Query Browser however.
[12 May 2010 11:21]
Tonci Grgin
Jono, this problem can not be repeated with latest sources (6.3.x) which I'm obliged to test against. //CREATE TABLE `updatetest` ( // `Id` bigint(20) NOT NULL AUTO_INCREMENT, // `Version` smallint(5) unsigned NOT NULL, // `UDate` datetime NOT NULL, // PRIMARY KEY (`Id`), // UNIQUE KEY `Id` (`Id`) //) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 | //+----+---------+---------------------+ //| Id | Version | UDate | //+----+---------+---------------------+ //| 1 | 1 | 2009-05-20 09:23:39 | //| 2 | 4 | 2010-05-12 13:12:15 | //+----+---------+---------------------+ MySqlConnection conn = new MySqlConnection(); conn.ConnectionString = "DataSource=**;Database=test;UserID=**;Password=**;PORT=**;Allow Zero Datetime=True;allow user variables = true; respect binary flags=false"; conn.Open(); //Case 1, user varibale is properly pre-set MySqlCommand cmdCreateTable = new MySqlCommand("SET @numbercount = 1", conn); cmdCreateTable.CommandTimeout = 0; cmdCreateTable.ExecuteNonQuery(); cmdCreateTable.CommandText = "SELECT @numbercount AS NrCnt, (@numbercount+1) As NrC_2 FROM updatetest"; DataTable dt = new DataTable(); MySqlDataAdapter da = new MySqlDataAdapter(cmdCreateTable); da.Fill(dt); DisplayData(dt); dt.Clear(); dt.Dispose(); da.Dispose(); //Case 2, user varibale is set in SELECT only cmdCreateTable.CommandText = "SELECT Id, @numbercnt := 1 AS NrCn2, (@numbercnt+Version) As NrC_3 FROM updatetest"; da = new MySqlDataAdapter(cmdCreateTable); da.Fill(dt); DisplayData(dt); dt.Clear(); dt.Dispose(); da.Dispose(); conn.Close(); Console.WriteLine("Done."); private static void DisplayData(System.Data.DataTable table) { foreach (System.Data.DataRow row in table.Rows) { foreach (System.Data.DataColumn col in table.Columns) { Console.WriteLine("{0} = {1}", col.ColumnName, row[col].ToString()); } Console.WriteLine("============================"); } } The data displayed is correct: NrCnt = 1 NrC_2 = 2 ============================ NrCnt = 1 NrC_2 = 2 ============================ NrCnt = NrC_2 = Id = 1 NrCn2 = 1 NrC_3 = 2 ============================ NrCnt = NrC_2 = Id = 2 NrCn2 = 1 NrC_3 = 5 ============================ Done. Tests were done using remote MySQL server 5.1.31 on OpenSolaris x64 box. If still experiencing problems, try upgrading your c/NET.
[12 May 2010 11:30]
Tonci Grgin
Verbose output also shows no problems... mysql Information: 1 : 1: Connection Opened: connection string = 'server=xx;database=test;User Id=xx;password=xx;port=xx;Allow Zero Datetime=True;Allow User Variables=True;Respect Binary Flags=False;logging=True' mysql Information: 3 : 1: Query Opened: SHOW VARIABLES mysql Information: 4 : 1: Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1 mysql Information: 5 : 1: Resultset Closed. Total rows=268, skipped rows=0, size (bytes)=6335 mysql Information: 6 : 1: Query Closed mysql Information: 3 : 1: Query Opened: SHOW COLLATION mysql Information: 4 : 1: Resultset Opened: field(s) = 6, affected rows = -1, inserted id = -1 mysql Information: 5 : 1: Resultset Closed. Total rows=127, skipped rows=0, size (bytes)=3958 mysql Information: 6 : 1: Query Closed mysql Information: 3 : 1: Query Opened: SET NAMES utf8 mysql Information: 4 : 1: Resultset Opened: field(s) = 0, affected rows = 0, inserted id = 0 mysql Information: 5 : 1: Resultset Closed. Total rows=0, skipped rows=0, size (bytes)=0 mysql Information: 6 : 1: Query Closed mysql Information: 3 : 1: Query Opened: SET character_set_results=NULL mysql Information: 4 : 1: Resultset Opened: field(s) = 0, affected rows = 0, inserted id = 0 mysql Information: 5 : 1: Resultset Closed. Total rows=0, skipped rows=0, size (bytes)=0 mysql Information: 6 : 1: Query Closed mysql Information: 10 : 1: Set Database: test mysql Information: 3 : 1: Query Opened: SET @numbercount = 1 mysql Information: 4 : 1: Resultset Opened: field(s) = 0, affected rows = 0, inserted id = 0 mysql Information: 5 : 1: Resultset Closed. Total rows=0, skipped rows=0, size (bytes)=0 mysql Information: 6 : 1: Query Closed mysql Information: 3 : 1: Query Opened: SELECT @numbercount AS NrCnt, (@numbercount+1) As NrC_2 FROM updatetest mysql Information: 4 : 1: Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1 mysql Information: 5 : 1: Resultset Closed. Total rows=2, skipped rows=0, size (bytes)=8 mysql Information: 6 : 1: Query Closed NrCnt = 1 NrC_2 = 2 ============================ NrCnt = 1 NrC_2 = 2 ============================ mysql Information: 3 : 1: Query Opened: SELECT Id, @numcnt := 1 AS NrCn2, (@numcnt+Version) As NrC_3 FROM updatetest mysql Information: 4 : 1: Resultset Opened: field(s) = 3, affected rows = -1, inserted id = -1 mysql Information: 5 : 1: Resultset Closed. Total rows=2, skipped rows=0, size (bytes)=12 mysql Information: 6 : 1: Query Closed NrCnt = NrC_2 = Id = 1 NrCn2 = 1 NrC_3 = 2 ============================ NrCnt = NrC_2 = Id = 2 NrCn2 = 1 NrC_3 = 5 ============================ Done.