• 0

C# - SqlTransaction has completed


Question

limok

Hi,

 

I'm having trouble with the code below used in a .Net 4.5.2 website. The error I get is that the sql transaction is no longer useable. I'm guessing the first insert is failing and the app isn't rolling back the transaction properly.

 

Secondly - the bizarre thing I can pass the exact same values from one machine that will work but from another machine it will not.

 

if you need more info ask away.

 

thanks.

using (SqlConnection connection = new SqlConnection(cs))
            {
                connection.Open();
                SqlCommand cmd = connection.CreateCommand();
                SqlTransaction tran;

                tran = connection.BeginTransaction("sampleTransaction");

                cmd.Connection = connection;
                cmd.Transaction = tran;

                try
                {
                    cmd.CommandText = @"INSERT INTO dbo.sk_srf_headm(order_ref, customer, reason, returningSample, comments, submitted_by, dateReq, requested_by)
                                                     VALUES(@order_ref, @customer, @reason, @returning_sample, @comments, @submitted_by, @date_req, @requested_by)";
                    cmd.Parameters.AddWithValue("@order_ref", order.orderRef);
                    cmd.Parameters.AddWithValue("@customer", order.customer);
                    cmd.Parameters.AddWithValue("@date_req", SqlDbType.DateTime).Value = order.dateReq;
                    cmd.Parameters.AddWithValue("@reason", order.reason);
                    cmd.Parameters.AddWithValue("@returning_sample", order.returningSample);
                    cmd.Parameters.AddWithValue("@comments", order.comments);
                    cmd.Parameters.AddWithValue("@submitted_by", order.salesExec);
                    cmd.Parameters.AddWithValue("@requested_by", order.salesExecFor);
                    cmd.ExecuteNonQuery();

                    int line_no = 1;
                    foreach (orderItem item in order.Items.getItems())
                    {
                        cmd.CommandText = @"INSERT INTO dbo.sk_srf_detm(order_ref, line_no, product, description, quantity, oc_qty, freeStock, locations)
                                VALUES(@srfRef, @line_no, @product, @description, @quantity, @oc_qty, @freeStock, @locations)";
                        cmd.Parameters.AddWithValue("@srfRef", order.orderRef);
                        cmd.Parameters.AddWithValue("@line_no", line_no);
                        cmd.Parameters.AddWithValue("@product", item.productNumber);
                        cmd.Parameters.AddWithValue("@description", item.description);
                        cmd.Parameters.AddWithValue("@quantity", item.quantity);
                        cmd.Parameters.AddWithValue("@oc_qty", item.oc_qty);
                        cmd.Parameters.AddWithValue("@freeStock", item.freeStock);
                        cmd.Parameters.AddWithValue("@locations", item.locations);
                        cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        line_no++;
                    }
                    tran.Commit();
                    return true;
                }
                catch (Exception ex)
                {
                    try
                    {
                        tran.Rollback();                        
                    }
                    catch
                    {

                    }
                    return false;
                }
            }

 

Link to post
Share on other sites

Recommended Posts

  • 0
DevTech

not clear if that is the exact code you are using because you are not closing the connection and you are not printing the exception in either catch

 

if the exception throws before the commit for example, the rollback is stupid

 

so it doesn't look like real code you would actually use...

 

and a return inside a catch just hurts my eyeballs...

 

 

 

Link to post
Share on other sites
  • 0
ZakO

Which exact line is throwing the exception? 

 

Quote

I'm guessing the first insert is failing and the app isn't rolling back the transaction properly.

If the rollback is failing it will be throwing another exception, what exception is it throwing? At the moment you're just swallowing the exception with an empty catch block. 

 

44 minutes ago, DevTech said:

not clear if that is the exact code you are using because you are not closing the connection 

He doesn't need to close the connection. It's created inside a using block and SqlConnection implements IDisposable with the Dispose method ensuring the connection is automatically closed. 

Link to post
Share on other sites
  • 0
DevTech
3 minutes ago, ZakO said:

He doesn't need to close the connection. It's created inside a using block and SqlConnection implements IDisposable with the Dispose method ensuring the connection is automatically closed. 

Yeah but that won't happen until garbage collection, making it a possible reason why the code works on one machine and not the other.

 

(which I should have pointed out as the reason for that comment, but there is only so much time in the universe)

 

Link to post
Share on other sites
  • 0
ZakO
5 minutes ago, DevTech said:

Yeah but that won't happen until garbage collection, making it a possible reason why the code works on one machine and not the other.

 

(which I should have pointed out as the reason for that comment, but there is only so much time in the universe)

 

Dispose will be called and the connection closed immediately as the code exits the using block, it doesn't wait for a GC. 

Link to post
Share on other sites
  • 0
DevTech
8 minutes ago, ZakO said:

Dispose will be called and the connection closed immediately as the code exits the using block, it doesn't wait for a GC. 

I've seen all sorts of weird garbage collection behaviour and he has not specified his machines, O/S, patch level etc so I'd be inclined to run tests or a debugger and see what is going on

 

Can't find a shred in interest within me in doing that kind of thing here. I just do UWP these days which now generates a C++ backend executable for all sorts of new mangled runtime oddities.

Link to post
Share on other sites
  • 0
limok
45 minutes ago, Riva said:

put a using on your transaction. Commit stays inside.

You said this value works from one machine but not the other. Can you expand a bit more? Does this code work on another machine?

This has been published on IIS so we can test with a few users. Out of around 5 users the application throws the sqltransaction error for two of them and intermittently works for them sometime. Oddly enough if I submit the same information as them it always works for me and for other users,

 

27 minutes ago, DevTech said:

I've seen all sorts of weird garbage collection behaviour and he has not specified his machines, O/S, patch level etc so I'd be inclined to run tests or a debugger and see what is going on

 

Can't find a shred in interest within me in doing that kind of thing here. I just do UWP these days which now generates a C++ backend executable for all sorts of new mangled runtime oddities.

 How would I attach a debugger to a users machine or rather how could I debug whilst the user in using the web app.

 

55 minutes ago, ZakO said:

Which exact line is throwing the exception? 

 

If the rollback is failing it will be throwing another exception, what exception is it throwing? At the moment you're just swallowing the exception with an empty catch block. 

 

He doesn't need to close the connection. It's created inside a using block and SqlConnection implements IDisposable with the Dispose method ensuring the connection is automatically closed. 

I'm not sure where error is being thrown - I might add a label on the web page and print the error out on the catch statements.

Link to post
Share on other sites
  • 0
DevTech
9 minutes ago, limok said:

This has been published on IIS so we can test with a few users. Out of around 5 users the application throws the sqltransaction error for two of them and intermittently works for them sometime. Oddly enough if I submit the same information as them it always works for me and for other users,

 

 How would I attach a debugger to a users machine or rather how could I debug whilst the user in using the web app.

 

I'm not sure where error is being thrown - I might add a label on the web page and print the error out on the catch statements.

I wasn't taking this very seriously.

 

If that is real code that you are making for real people then pick one of thousand logging libaries on GitHub and log everything.

 

Every single catch block anywhere should log the exception.

 

And don't put a return statement inside a catch.

 

Link to post
Share on other sites
  • 0
DevTech

If the error is data entry dependent then good chance one of your data fields doesn't convert correctly to one of the SQL fields for the user getting an error

 

So log all the data too...

 

For debugging, you can remote attach to the iis machine or just run the web app on your dev machine using the bad data sample.

 

 

Link to post
Share on other sites
  • 0
limok
2 minutes ago, DevTech said:

If the error is data entry dependent then good chance one of your data fields doesn't convert correctly to one of the SQL fields for the user getting an error

 

So log all the data too...

 

For debugging, you can remote attach to the iis machine or just run the web app on your dev machine using the bad data sample.

 

 

Like I said, I'm using the exact same data on a few machines, a couple of machines refuse to work.

 

A quick google returns ELMAH as a good debug logger on live asp.net web apps. I might use that.

Link to post
Share on other sites
  • 0
DevTech

asp.net on GitHub is insnaely active and worth monitoring - one of their projects is a logging abstraction layer for which they mention a few popular loggers

 

Link to post
Share on other sites
  • 0
DevTech

I keep a list of UWP libs on my GitHUb here:

 

https://github.com/10UWP/The-UWP-Tools-List

 

Most UWP general purpose libs run in most environments due to the restricted subset

 

I will use this situation as an incentive to add in some logging libaries!

 

 

 

Link to post
Share on other sites
  • 0
limok
1 minute ago, DevTech said:

Logging

 

Most Starred:

 

https://github.com/search?l=C%23&o=desc&p=1&q=log&s=stars&type=Repositories&utf8=%E2%9C%93

 

Most Recently Updated:

 

https://github.com/search?l=C%23&o=desc&p=1&q=log&s=stars&type=Repositories&utf8=%E2%9C%93

 

When trying to quickly find a lib I try to balance those two searches so I have a very active but quality result.

 

 

thanks - will take a look 

Link to post
Share on other sites
  • 0
DevTech
15 minutes ago, limok said:

thanks - will take a look 

In the case of logging, I think every programmer gets the urge to make their own logging libary and too many give in to that itch and upload something to GitHub. The noise level for logging is rarher high - there are simply too many great logging libraries and too many crap ones and well just too many.... So the searches I gave you are not as helpful as for something more specialized...

 

So I will try to point out a few things.

 

(The most efficient low overhead logging is ETW which is built into every Windows computer and was originally  used only inside of device drivers. A while back Microsoft released the API for user level usage. A logging lib that targets ETW is worth looking at if you are confident of always running on Windows.)

 

 

 

  •  

 

 

  •  

 

 

Link to post
Share on other sites
  • 0
limok

Hi,

 

I'm debugging the code on my machine and the debugger is doing crazy things jumping backwards and forwards and not going in the correct order.

 

Looks like the reason I'm getting this error is that it's trying to insert this data more than once causing a duplicate insert in sql with the same primary key.

 

Also getting the process or thread has changed since the last step. on the debugging arrow.

 

How do I correct this?

Link to post
Share on other sites
  • 0
limok

Ok it seems IE11 is causing the debugger to go mental. Chrome does not do this?

 

IE is version 11...

Link to post
Share on other sites
  • 0
limok

Solved it - I was using an HTML button that had an event handler in the codebehind using onserverclick running the above code. For some reason this executed the code twice. I've since changed the button to an asp.net button and code is only executed once.

 

thanks for your help.

  • Like 2
Link to post
Share on other sites
  • 0
DevTech

Thanks for taking the time to come back with your results.

 

  • Like 1
Link to post
Share on other sites
  • 0
BinaryData
7 minutes ago, DevTech said:

Thanks for taking the time to come back with your results.

 

As someone who requests help frequently, thanks for not being a jerk like a lot of people have been. :)

 

  • Like 1
Link to post
Share on other sites
  • 0
DevTech
3 minutes ago, BinaryData said:

As someone who requests help frequently, thanks for not being a jack ass like a lot of people have been. :)

We all need lots of elastic material in our skins and lots of tolerance for different styles of communication. The simple fact that wonderful human beings take the time to type something in to keep a forum discussion going even if their text is some sort of negative anti-pattern is still a miracle of the internet community.

 

And well, I'm fairly certain, despites my efforts to the contrary, that I was perceived as a jack ass in the recent thread on PC security...

Link to post
Share on other sites
  • 0
neufuse
On ‎4‎/‎19‎/‎2016 at 2:30 PM, DevTech said:

not clear if that is the exact code you are using because you are not closing the connection and you are not printing the exception in either catch

 

 

not sure why you think this... the using block guarantees that the connection is closed on exit of scope all the using block is is a try catch finally block, it doesn't close on GC like you implied, it closes all the connections in the finally block, there is zero need to close or dispose of the connection when instantiated in a using block, it is guaranteed to be closed when it exits the block immediately

  • Like 1
Link to post
Share on other sites
  • 0
DevTech
52 minutes ago, neufuse said:

not sure why you think this... the using block guarantees that the connection is closed on exit of scope all the using block is is a try catch finally block, it doesn't close on GC like you implied, it closes all the connections in the finally block, there is zero need to close or dispose of the connection when instantiated in a using block, it is guaranteed to be closed when it exits the block immediately

This point was made and answered earlier in the thread.

 

At the time I was mentally searching for edge cases that could explain why it worked on one computer and not the other one and having seen weird garbage collection issues in the past I was musing to myself on if the compiler might do oddball code gen based on the return statement inside the nested catch creating a stack unwind tree that would lead to defensive codegen for deferred garbage collection. Just one of many thoughts that rambled thru my head at the time...

 

But my premise that safe code generation would have priority over memory management was completely wrong as it turns out objects can get garbage collected while their methods are still executing so I won't hold that thought in my head again!

 

https://blogs.msdn.microsoft.com/oldnewthing/20100810-00/?p=13193

 

as it turns out, his issue had nothing at all to do with his code.

 

Link to post
Share on other sites
  • 0
DevTech

Off-topic:

 

My previous post linked to a Raymond Chen blog article and I couldn't resist reading a few more of his no-nonsense articles. :)

 

So when I see the same code working on one compter and not the other, I realized that "creepy spooky juju" is a perfect description of the first thought thought that pops into my head and that it is almost always the wrong thought! I need to be slapping myself in the head every time that happens!

 

No connection to the thread, this article is delicious:

 

"Finalizers are a Ouija board, permitting dead objects to operate “from beyond the grave” and affect live objects. As a result, when finalizers are involved, there is a lot of creepy spooky juju going on, and you need to tread very carefully, or your soul will become cursed."

 

https://blogs.msdn.microsoft.com/oldnewthing/20100813-00/?p=13153

 

Link to post
Share on other sites
  • 0
limok

Just out of interest why would an HTML button cause this. the code was

 

<button ID="btnSubmit" runat="server" class="btn-primary btn" onServerClick="btnSubmit_Click">Submit</button>

changed to

<asp:Button ID="btnSubmit" runat="server" Text="Submit" CssClass="btn-primary btn" OnClick="btnSubmit_Click" /> 

the aspx page is inheriting a master page.

 

it was pure luck that this fixed. what kind of debugging/tools would you guys have done to find the culprit?

Link to post
Share on other sites
  • 0
DevTech
5 hours ago, limok said:

Just out of interest why would an HTML button cause this. the code was

 


<button ID="btnSubmit" runat="server" class="btn-primary btn" onServerClick="btnSubmit_Click">Submit</button>

changed to


<asp:Button ID="btnSubmit" runat="server" Text="Submit" CssClass="btn-primary btn" OnClick="btnSubmit_Click" /> 

the aspx page is inheriting a master page.

 

it was pure luck that this fixed. what kind of debugging/tools would you guys have done to find the culprit?

Um, don't forget that if you have critical code in a Javascript button click event it will not execute if the user submits the form using the Enter key...

 

Link to post
Share on other sites
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By News Staff
      Save 97% off this Complete C Suite Programming Bundle
      by Steven Parker

      Today's highlighted deal comes via our Online Courses section of the Neowin Deals store, where you can save 97% off this Complete C Suite Programming Bundle. Master this foundational, general-purpose programming language with 80 hours of specially curated instructions on C++, C#, SQL, and more.



      This deal consists of the following courses:

      Complete Modern C++
      The Most Comprehensive C++ Tutorial with C++11/14/17 Features Master C# And SQL by Building Applications
      Become a Better Software Developer by Learning How to Build Applications Using C# & SQL Learn C# by Building Applications
      Understand the Concepts of C#6 & C#7 and Use Them to Build Real World .NET Console Apps The Complete Introduction to C++ Programming
      Learn All the Basics of C++ by Practice & Create Various Basic C++ Applications Structural Design Patterns in Modern C++
      Learn Structural Design Patterns in Depth & Their Implementation in Modern C++ Creational Design Patterns in Modern C++
      Learn Creational Design Patterns in Depth & Their Implementation in Modern C++ Object Oriented Analysis, Design & Programming with UML
      Learn Object-Oriented Analysis, Design & Programming Using UML in C++, Java and C# Detecting Memory Leaks in C/C++ Applications
      Apply Techniques to Detect & Isolate Memory-Related Errors in Visual Studio C/C++ Pointers & Applications
      Learn the Application of Pointers Such As Usage in Dynamic Arrays, Linked Lists, & More Beginner Object Oriented Programming In C# and .NET Core
      Learn Object-Oriented Programming Fundamentals & Climb Up the Developer Hierarchy Good to know
      Length of time users can access this course: lifetime Certificate of completion included Updates included Redemption deadline: redeem your code within 30 days of purchase For a full description, specs, and instructor info, click here.

      Here's the deal:
      This Complete C Suite Programming Bundle normally costs* $1,990, but you can pick it up for just $49.99 for a limited time - that represents a saving of $1,940.01 (97%) off.

      Get this deal, or learn more about it
      See all discounted Online Courses. This is a time-limited offer.
      Get $1 credit for every $25 spent · Give $10, Get $10 · 10% off for first-time buyers.

      Not for you?
      That's OK, there are other deals on offer you can check out here.



      Enter giveaways: Polycade Home Arcade | $5K in cash | $10K in Crypto Ivacy VPN - 5 year subscription for just $1 per month NordVPN - 2 year subscription at up to 68% off Private Internet Access VPN - subscriptions at up to 71% off Unlocator VPN or SmartDNS - unblock Geoblock with 7-day free trial Neowin Store for our preferred partners. Subscribe to Neowin - for $14 a year, or $28 a year for Ad-Free experience Disable Sponsored posts · Neowin Deals · Free eBooks · Neowin Store

      Disclosure: This is a StackCommerce deal or giveaway in partnership with Neowin; an account at StackCommerce is required to participate in any deals or giveaways. For a full description of StackCommerce's privacy guidelines, go here. Neowin benefits from shared revenue of each sale made through our branded deals site, and it all goes toward the running costs.

    • By Hamza Jawad
      SQL Server Big Data Clusters CU10 brings important new capabilities
      by Hamza Jawad



      With the release of SQL Server 2019, Microsoft brought Big Data Clusters (BDC) for customers as a way to utilize both structured and unstructured data. Running exclusively on Linux containers that are hosted on Kubernetes, these clusters can be deployed both on-premise and on the cloud. Last year, the tech giant released the cumulative update 5 (CU5) for SQL Server 2019, focusing on expanding capabilities offered through BDC.

      Today, Microsoft has unveiled the SQL Server Big Data Clusters CU10 release. With this update, a few new important capabilities have been introduced. These have been highlighted as follows:

      Notably, when it comes to base image upgrading, the documentation for the CU10 release states that due to the stricter security requirements of Ubuntu 20.04, users may face issues if they attempt to use BDC to connect to SQL Server instances before SQL Server 2017. If such a case arises, they should refer to the following solution.

      When upgrading existing BDC, the new CU10 images will be utilized once the usual in-place upgrade to the CU has been performed. Additionally, High Availability capabilities for Hadoop's key management service (KMS) components further improves the Encryption at Rest feature set. After the upgrade, all namenode pods will have a KMS, not only offering increased high availability, but also providing a performance boost for encryption operations on encryption zones.

    • By News Staff
      Get this Backend Developer Bootcamp Bundle for only $29.99
      by Steven Parker

      Today's highlighted deal comes via our Online Courses section of the Neowin Deals store, where for only a limited time, you can save 96% off this Backend Developer Bootcamp Bundle. This 31-hour course bundle takes you behind the scenes of web development: C#, SQL, .NET Core, and more.



      This bundle includes the following courses:

      Learn C# By Building Applications
      Understand the Concepts of C#6 & C#7 and Use Them to Build Real World .NET Console Apps Master C# and SQL by Building Applications
      Learn How to Build Real-World Applications Using C# & SQL Beginner Object Oriented Programming in C# and .NET Core
      Learn Object-Oriented Programming Fundamentals & Climb Up the Developer Hierarchy Learn ASP.NET Core and SQL by Writing ToDo API
      Write an API with Step-by-Step Instructions Using ASP.NET Core, SQL Server, & T-SQL Microsoft SQL Server & T-SQL Course for Beginners
      Learn about the Benefits of SQL & How SQL Server Stores Data Good to know
      Length of time users can access this course: lifetime Certificate of completion included Redemption deadline: redeem your code within 30 days of purchase For a full description, specs, and instructor info, click here.

      Here's the deal:
      This Backend Developer Bootcamp Bundle normally costs $995, but you can pick it up for just $29.99 for a limited time - that represents a saving of $965.01 (96%) off.

      Get this deal, or learn more about it
      See all discounted Online Courses. This is a time-limited offer.
      Get $1 credit for every $25 spent · Give $10, Get $10 · 10% off for first-time buyers.

      Not for you?
      That's OK, there are other free eBooks on offer you can check out here.



      Home Gym Giveaway | Bitcoin (BTC) Investment Giveaway Ivacy VPN - 5 year subscription for just $1 per month NordVPN - 2 year subscription at up to 68% off Private Internet Access VPN - subscriptions at up to 71% off Unlocator VPN or SmartDNS - unblock Geoblock with 7-day free trial Neowin Store for our preferred partners. Subscribe to Neowin - for $14 a year, or $28 a year for Ad-Free experience Disable Sponsored posts · Neowin Deals · Free eBooks · Neowin Store

      Disclosure: A valid email address is required to fulfill your request. Complete and verifiable information is required in order to receive this offer. By submitting a request, your information is subject to TradePub.com's Privacy Policy.

    • By News Staff
      Save 98% off this All-in-One Coding Skills Bundle
      by Steven Parker

      Today's highlighted deal comes via our Online Courses section of the Neowin Deals store, where you can save 98% off the All-in-One Coding Skills Bundle. Boost your IT skill set and master coding with 25 hours on Scratch, Kodu, Python, SQL, Flutter, C++, and ITIL.



      This bundle consists of the following courses:

      Scratch 3.0 Programming Masterclass: Learn by Creating 12 Funny Games
      Build Games in Scratch 3.0 Including Snake, Pac-Man, Racing Game, & Elsa from Frozen Learn Coding by Creating 3D Games with Kodu Game Lab
      Be an Expert Coder in the Exciting, Funny Kodu Game Lab Python MTA 98-381 Complete Preparation Course
      Your Complete Python Resource to Succeed in the Python Certification MTA 98-381 Exams! MTA 98-361: Software Development Fundamentals Preparation Course
      Everything You Need to Pass the Microsoft MTA 98-361 Exam with Step-by-Step Examples SQL: Mastering MySQL & MariaDB with Examples for Beginners
      Understand SQL Using the MySQL Database, How to Install MySQL Service & Design Databases Master Flutter & Dart with a Complete Showcase Mobile App
      Build iOS & Android Apps with a Showcase Example Based on Dart and Flutter Framework C++: Master C++ with Step-by-Step Examples for Beginners
      Start from the Basics & Go All the Way to Creating Your Own Applications ITIL 4 Certification Exam: A Complete Preparation Masterclass to Master ITIL
      A 3-Step Process to Master ITIL & Pass the Exam Good to know
      Length of time users can access this course: lifetime This plan is only available to new users Redemption deadline: redeem your code within 30 days of purchase For a full description, specs, and instructor info, click here.

      Here's the deal:
      This All-in-One Coding Skills Bundle normally costs $1,592, but you can pick it up for just $29.99 for a limited time - that represents a saving of $1,562.01 (98%) off.

      Get this deal, or learn more about it
      See all discounted Online Courses. This is a time-limited offer.
      Get $1 credit for every $25 spent · Give $10, Get $10 · 10% off for first-time buyers.

      Not for you?
      That's OK, there are other free eBooks on offer you can check out here.



      Home Gym Giveaway | Bitcoin (BTC) Investment Giveaway Ivacy VPN - 5 year subscription for just $1 per month NordVPN - 2 year subscription at up to 68% off Private Internet Access VPN - subscriptions at up to 71% off Unlocator VPN or SmartDNS - unblock Geoblock with 7-day free trial Neowin Store for our preferred partners. Subscribe to Neowin - for $14 a year, or $28 a year for Ad-Free experience Disable Sponsored posts · Neowin Deals · Free eBooks · Neowin Store

      Disclosure: A valid email address is required to fulfill your request. Complete and verifiable information is required in order to receive this offer. By submitting a request, your information is subject to TradePub.com's Privacy Policy.

    • By News Staff
      Get this Interactive Learn to Code Bundle at 73% off for just $29.99
      by Steven Parker

      Today's highlighted deal comes via our Online Courses section of the Neowin Deals store, where you can save 73% off the Interactive Learn to Code Bundle. Start writing codes and programs from scratch with 9 interactive courses on SQL, JavaScript, PHP, jQuery, BootStrap, and more.



      This deal consists of the following courses:

      An Interactive SQL Tutorial for Beginners: Introduction to SQL
      Getting Started with SQL Doesn't Have to Be Hard An Interactive JavaScript Course for Beginners
      Learn JavaScript Interactively with a One-of-a-Kind JS Online Course Interactive jQuery Tutorial: Learn jQuery Step-by-Step
      Take an Interactive jQuery Training Course for Beginners to Quickly Master jQuery Events, Effects & More Learn PHP Online: PHP Basics Explained in an Interactive & Fun Manner
      An Interactive Tutorial for Beginners Who Want to Master PHP Basics in a Non-Boring Way The Complete Solidity Smart Contract Guide
      Master Solidity Programming Through Hands-On Experience Master Python Fundamentals the Fun Way: An Interactive Python Tutorial
      A Python Training Course for Absolute Beginners Who Wants to Master the Language Without Getting Bored A Responsive Web Design Course: Find Out How to Create a Responsive Website
      Make a Website Mobile-Friendly with a Step by Step, Responsive Web Design Tutorial Bootstrap Tutorial: Learn to Create Dynamic Websites in a Pinch
      Find Out How to Use Bootstrap the Fun Way by Using an Interactive Course An Interactive Java Tutorial: Learn by Practice!
      Learn Java From Scratch by Combining Theory with Hands-On Coding Experience Good to know
      Length of time users can access this course: lifetime Certification of completion included Redemption deadline: redeem your code within 30 days of purchase For a full description, specs, and instructor info, click here.

      Here's the deal:
      This Interactive Learn to Code Bundle normally costs* $112, but you can pick it up for just $29.99 for a limited time - that represents a saving of $82.01 (73%) off.

      >> Get this deal, or learn more about it <<
      See all discounted Online Courses. This is a time-limited offer.


      Get $1 credit for every $25 spent · Give $10, Get $10 · 10% off for first-time buyers.

      Not for you?
      If this offer doesn't interest you, why not check out the following offers:

      The Win Your Dream 2020 Tesla Model 3 Giveaway
      The Nintendo Gaming Bundle Giveaway 20% off Ivacy VPN subscription with coupon code IVACY20 NordVPN subscription at up to 68% off for a 2 year plan Private Internet Access VPN subscription at up to 71% off Unlocator VPN or SmartDNS unblock Geoblock with 7-day free trial Disable Sponsored posts · Other recent deals · Preferred partner software

      Disclosure: This is a StackCommerce deal or giveaway in partnership with Neowin; an account at StackCommerce is required to participate in any deals or giveaways. For a full description of StackCommerce's privacy guidelines, go here. Neowin benefits from shared revenue of each sale made through our branded deals site, and it all goes toward the running costs.

      running costs.