Sunday, June 15, 2008

Why I Do Not Use ORM

An impedance mismatch occurs when two devices are connected so that neither is operating at peak efficiency. This lack of efficiency is not due to any intrinsic incompatibilities between the devices, it only exists once they are connected together the wrong way. Object Relational Mapping (ORM) does not cure a pre-existing impedance mismatch, it creates one, because it connects databases to applications in a way that hobbles both.

UPDATE: There is a newer Historical Review of ORM now available.

UPDATE: In response to comments below and on reddit.com, I have a new post that gives a detailed analysis of an algorithm implemented as a sproc, in app code with embedded SQL, and in ORM.

Welcome to the Database Programmer blog. This blog is for anybody who wants to see practical examples of how databases work and how to create lean and efficient database applications.

There are links to other essays at the bottom of this post.

This blog has two tables of contents, the Topical Table of Contents and the list of Database Skills.

Good Marketing, Terrible Analogy

Normally I like to reserve this space for a positive presentation of things that I have found that work, I don't like to waste time ranting against things I don't like. However, ORM is so pervasive in some circles that it is important to establish why you will not see it used here, so as to avoid a lot of unnecessary chatter about its absence.

The use of the term "impedance mismatch" is great marketing, worthy of a certain software company in the Northwest of the US, but the analogy is utterly wrong. The analogy is used incorrectly to imply an intrinsic incompatibility, but the real irony is that there is no such incompability, and if we want to use the analogy we are forced to say that ORM is the impedance mismatch, because it creates the inefficient connection.

It always comes back to the fact that modern databases were designed to provide highly reliable permanent storage, and they possess a slew of features that promote that end. Programming languages on the other hand are meant to process data in a stepwise fashion. When the two of them meet it is very important to establish a strategy that uses the strengths of both, instead of trying to morph one into the other, which never yields efficient results.

The Very Basics

The language SQL is the most widely supported, implemented, and used way to connect to databases. But since most of us have long lists of complaints about the language, we end up writing abstraction layers that make it easier for us to avoid coding SQL directly. For many of us, the following diagram is a fair (if not simplified) representation of our systems:

This diagram is accurate for ORM systems, and also for non-ORM systems. What they all have in common is that they seek to avoid manually coding SQL in favor of generating SQL. All systems seek to give the programmer a set of classes or functions that makes it easy and natural to work with data without coding SQL manually.

This brings us to a very simple conclusion: the largest part of working out an efficient database strategy is working out a good SQL generation strategy. ORM is one such strategy, but it is far from the simplest or the best. To find the simplest and the best, we have to start looking at examples.

First Example: Single Row Operations

Consider the case of a generic CRUD interface to a database having a few dozen tables. These screens will support a few single-row operations, such as fetching a row, saving a new row, saving updates, or deleting a row.

We will assume a web form that has inputs with names that begin with "inp_", like "inp_name", "inp_add1", "inp_city" and so forth. The user has hit [NEW] on their AJAX form, filled in the values, and hit [SAVE]. What is the simplest possible way to handle this on the server? If we strip away all pre-conceived ideas about the "proper" thing to do, what is left? There are only these steps:

  1. Assemble the relevant POST variables into some kind of data structure
  2. Perform sanity checks and type-validations
  3. Generate and execute an insert statement
  4. Report success or failure to the user

The simplest possible code to do this looks something like this (the example is in PHP):

# This is a great routine to have.  If you don't have
# one that does this, write it today!  It should return
# an associative array equivalent to:
#    $row = array( 
#       'name'=>'....'
#      ,'add1'=>'....'
#    )
# This routine does NOT sanitize or escape special chars
$row = getPostStartingWith("inp_");

# get the table name.  
$table_id = myGetPostVarFunction('table_id');

# Call the insert generation program.  It should have
# a simple loop that sanitizes, does basic type-checking,
# and generates the INSERT.  After it executes the insert
# it must caches database errors for reporting to the user.
#
if (!SQLX_Insert($table_id,$row)) {
    myFrameworkErrorReporting();
}

Without all of my comments the code is 5 lines! The Insert generation program is trivial to write if you are Using a Data Dictionary, and it is even more trivial if you are using Server-side security and Triggers.

This is the simplest possible way to achieve the insert, and updates and deletes are just as easy. Given how simple this is (and how well it performs), any more complicated method must justify itself considerably in order to be considered.

ORM cannot be justified in this case because it is slower (objects are slower than procedural code), more complicated (anything more than 5 lines loses), and therefore more error-prone, and worst of all, it cannot accomplish any more for our efforts than we have already.

Objection! What About Business Logic?

The example above does not appear to allow for implementing business logic, but in fact it does. The SQLX_Insert() routine can call out to functions (fast) or objects (much slower) that massage data before and after the insert operation. I will be demonstrating some of these techniques in future essays, but of course the best permforming and safest method is to use triggers.

Example 2: Processes, Or, There Will Be SQL

Many programmers use the term "process" to describe a series of data operations that are performed together, usually on many rows in multiple tables. While processes are not common on a typical website, they are plenty common in line-of-business applications such as accounting, ERP, medical programs, and many many others.

Consider a time entry system, where the employees in a programming shop record their time, and once per week the bookkeeper generates invoices out of the time slips. When this is performed in SQL, we might first insert an entry into a table of BATCHES, obtain the batch number, and then enter a few SQL statements like this:

-- Step 1, mark the timeslips we will be working with
UPDATE timeslips SET batch = $batch
 WHERE batch IS NULL;
 
-- Step 2, generate invoices from unprocessed timeslips
INSERT INTO Invoices (customer,batch,billing,date)
SELECT CUSTOMER,$batch,SUM(billing) as billing,NOW()
  FROM timeslips
 WHERE batch = $batch
 GROUP BY customer;
 
-- Step 2, mark the timeslips with their invoices
UPDATE timeslips 
   SET invoice = invoices.invoice
  FROM invoices 
 WHERE timeslips.customer = invoices.customer
   AND timeslips.batch    = $batch;

While this example vastly simplifies the process, it ought to get across the basic idea of how to code things in SQL that end up being simple and straightforward.

Counter Example: The Disaster Scenario

The biggest enemy of any software project is success. Code that works wonderfully on the developer's laptop is suddenly thrown into a situation with datasets that are hundreds of times larger than the test data. That is when performance really matters. Processes that took 3 minutes on the laptop suddenly take 10 hours, and the customer is screaming. How do these things happen?

Mostly they happen because programmers ignore the realities of how databases work and try to deal with them in terms they understand, such as objects or even simple loops. Most often what happens is that the programmer writes code that ends up doing something like this:

foreach( $list_outer as $item_outer) {
    foreach( $list_inner as $item_inner) {
        ...some database operation
    }
}

The above example will perform terribly because it is executing round trips to the database server instead of working with sets. While nobody (hopefully) would knowingly write such code, ORM encourages you do to this all over the place, by hiding logic in objects that themselves are instantiating other objects. Any code that encourages you to go row-by-row, fetching each row as you need it, and saving them one-by-one, is going to perform terribly in a process. If the act of saving a row causes the object to load more objects to obtain subsidiary logic, the situation rapidly detiorates into exactly the code snippet above - or worse!

On a personal note, I have to confess that I am continually amazed and flabbergasted when I see blog posts or hear conversations in user groups about popular CMS systems and web frameworks that will make dozens of database calls to refresh a single page. A seasoned database programmer simply cannot write such a system, because they have habits and practices that instinctively guard against such disasters. The only possible explanation for these systems is the overall newnewss of the web and the extreme ignorance of database basics on the part of the CMS and framework authors. One can only hope the situation improves.

Sidebar: Object IDs are Still Good

There are some people who, like myself, examine how ORM systems work and say, "no way, not in my code." Sometimes they also go to the point of refusing to use a unique numeric key on a table, which is called by some people an "Object ID" or OID for short.

But these columns are very useful for single-row operations, which tend to dominate in CRUD screens (but not in processes). It is a bad idea to use them as primary keys (see A Sane Approach To Choosing Primary Keys), but they work wonderfully in any and all single-row operations. They make it much easier to code updates and deletes.

Conclusions

The recurring theme of these essays is that you can write clean and efficient code if you know how databases work on their own terms. Huge amounts of application code can be swept away when you understand primary keys and foreign keys and begin to normalize your tables. The next step from there is knowing how to code queries, but sooner or later you have to grapple with the overall architecture. (Well supposedly you would do that first, but many of us seem to learn about architectural concerns only after we have coded long enough to recognize them).

A thorough knowledge of database behavior tends to lead a person away from ORM. First off, the two basic premises of ORM are factually incorrect: One, that there is some native incompatibility between databases and code, and two, that all the world must be handled in objects. These two misconceptions themselves might be excusable if they turned out to be harmless, but they are far from harmless. They promote a willful ignorance of actual wise database use, and in so doing are bound to generate methods that are inefficient at best and horrible at worst.

Overall, there are always simpler and better performing ways to do anything that ORM sets out to achieve.

Next Essay: Performance on Huge Inserts

Addendum June 19, 2008

After reading the comments on the blog over the last few days I have decided to put in this addendum rather than attempt to answer each comment independently. I have attempted to answer the objections in descending order of relevance.

The Example is Trivial or "Cheats"

This is a very compelling challenge to the article offered by bewhite and Michael Schuerig and it deserves a meaningful response. What I want to do is flesh out my approach and why I find it better than using ORM. While I do not expect this to lead to agreement, I hope that it answers their challenges.

  • My sphere of activity is business applications, where two dozen tables is trivial and the norm is for dozens or hundreds of tables.
  • When table count beyond the trivial, many concerns come into play that do not appear at lower table counts.
  • I have found that a single unified description of the database works best for these situations, provided it can specify at very least schema, automations, constraints, and security. This is what I refer to as the data dictionary.
  • The first use of the data dictionary is to run a "builder" program that builds the database. This builder updates schemas, creates keys and indexes, and generates trigger code. The same builder is used for clean installs and upgrades.
  • The generated trigger code answers directly the challenges as to how non-trivial inserts are handled. Downstream effects are handled by the triggers, which were themselves generated out of the dictionary, and which implement security, automations, and constraints. No manual coding of SQL routines thank you very much.
  • All framework programs such as SQLX_Insert() read the dictionary and craft the trivial insert. The code does what you would expect, which is check for type validity, truncate overlong values (or throw errors). But it does need to know anything more than is required to generate an INSERT, all downstream activity occurs on the server.
  • The dictionary is further used to generate CRUD screens, using the definitions to do such things as gray out read-only fields, generate lookup widgets for foreign keys, and so forth. This generated code does not enforce these rules, the db server does that, it simply provides a convenient interface to the data.
  • A big consequence here is that there is no need for one-class-per-table, as most tables can be accessed by these 'free' CRUD screens.
  • That leaves special-purpose programs where 'free' CRUD screens don't reflect the work flow of the users. In a business app these usually come down to order entry, special inquiry screens and the lot. These can be programmed as purely UI elements that call the same simple SQLX_Insert() routines that the framework does, because the logic is handled on the server.
  • This approach is not so much about code reuse as code elimination. In particular, the philosophical goal is to put developer assets into data instead of code.
  • When this approach is taken to its full realization, you simply end up not needing ORM, it is an unnecessary layer of abstraction that contributes nothing to quality at any stage.

These ideas are implemented in my Andromeda framework. It is not the purpose of this blog to promote that framework, but it has been successfully used to produce the types of applications I describe on this blog. I make mention of it here for completeness.

So to conclude, both of these gentlemen are correct that the example says nothing about how the crucial SQLX_Insert() routine is coded, and I hope at least that this addendum fleshes this out and makes clear where it is different from ORM.

The Model Should Be Based On Classes

bewhite asks "Do you propose us to organize our applications in terms of tables and records instead of objects and classes?"

Yes. Well, maybe not you, but that's how I do it. I do not expect to reach agreement on this point, but here at least is why I do it this way:

  • My sphere of activity is business applications, things like accounting, ERP, medical management, job control, inventory, magazine distribution and so forth.
  • I have been doing business application programming for 15 years, but every program I have ever written (with a single recent exception) has replaced an existing application.
  • On every job I have been paid to migrate data, but the old program goes in the trash. Every program I have written will someday die, and every program written by every reader of this blog will someday die, but the data will be migrated again and again. (...and you may even be paid to re-deploy your own app on a new platform).
  • The data is so much more important than the code that it only makes sense to me to cast requirements in terms of data.
  • Once the data model is established, it is the job of the application and interface to give users convenient, accurate and safe access to their data.
  • While none of this precludes ORM per se, the dictionary-based approach described above allows me to write both procedural and OOP code and stay focused on what the customer is paying for: convenient, accurate and safe access.
  • The danger in casting needs in any other terms is that it places an architectural element above the highest customer need, which is suspect at best and just plain bad customer service at worst. We all love to write abstractions, but I much prefer the one that gets the job done correctly in the least time, rather than the one that, to me, appears to most in fashion.

Old Fashioned Technnologies

More than one comment said simply that triggers and other server-side technologies "went out". Since I was there and watched it happen I would contend that when the web exploded a new generation came along with different needs. In particular the need for content and document management caused people to question all of the conventional uses of the SQL databases, and like all programmers they are convinced their world is the only world and all of the world, ergo, triggers are history because I don't use them. Nevertheless, those of us who continue to write business applications continue to use the technologies that worked well then and only work better now.

Ken Does Not Like OOP

I love OOP, especially for user interfaces. I just don't think it should own the domain model, and I don't think that "trapping" business logic inside of classes gives nearly the same independence as a data dictionary does. I've tried it both ways and I'll stick with the dictionary.

Any Use of OO Code Implies ORM

A few comments said outright that if you are using OOP code then you are by definition mapping. Technically this is untrue if you understand the use of the term "map" as opposed to "interface". Mapping is the process of creating a one-to-one correspondence between items in one group (the code) to items in the other (the database). A non-ORM interface is one in which any code, procedural or OOP, passes SQL and handles data without requiring a one-to-one mapping of tables or rows to classes or functions. My apps are not ORM because I have no such requirement that there be a class for every table, and no such requirement that there be any specific code to handle a table.

Don't Talk about Procedural Being Faster

At least three comments blasted this contention. To put things in context, performance in a database application goes in two stages. First and absolutely most critical is to be extremely smart about reducing database reads, since they are 1000's of times slower than in-memory operations. However, once that is done, there is no reason to ignore speed improvements that can be gained by optimizing the code itself. The commenters are correct that this gain is of a very low order, but I would stand by the statement after making this contextual addendum.

Thank You All

This was the most widely read piece in this series, definitely the most controversial. There will not likely be any other articles this controversial, as the main purpose of this essay was to provide regular readers with some background as to why they will not see ORM-based examples in future essays. Thanks for the comments!

Related Essays

This blog has two tables of contents, the Topical Table of Contents and the list of Database Skills.

Other philosophy essays are:

496 comments:

«Oldest   ‹Older   401 – 496 of 496
The Best Data Science Institute said...
This comment has been removed by the author.
delfen said...

This blog is the general information for the feature. You got a good work for this blog.We have a developing our creative content of this mind.Thank you for this blog. This for very interesting and useful.



Data Science Training in Chennai

Data Science Training in Velachery

Data Science Training in Tambaram

Data Science Training in Porur

Data Science Training in Omr
Data Science Training in Annanagar



buy damaged cars said...
This comment has been removed by the author.
Kashi Digital Agency said...

Seo company in Varanasi, India : Best SEO Companies in Varanasi, India: Hire Kashi Digital Agency, best SEO Agency in varanasi, india, who Can Boost Your SEO Ranking, guaranteed SEO Services; Free SEO Analysis.

Best Website Designing company in Varanasi, India : Web Design Companies in varanasi We design amazing website designing, development and maintenance services running from start-ups to the huge players


Wordpress Development Company Varanasi, India : Wordpress development Company In varanasi, india: Kashi Digital Agency is one of the Best wordpress developer companies in varanasi, india. Ranked among the Top website designing agencies in varanasi, india. wordpress website designing Company.

E-commerce Website designing company varanasi, India : Ecommerce website designing company in Varanasi, India: Kashi Digital Agency is one of the Best Shopping Ecommerce website designing agency in Varanasi, India, which provides you the right services.

meritstep1 said...

I just loved your article on the beginners guide to starting a blog.If somebody take this blog article seriously in their life,
he/she can earn his living by doing blogging.thank you for thizs article.
servicenow online training

Cubestech said...

Interesting blog, Thanks for the sharing,

"Top Digital Marketing Service Provider in Chennai
Mobile app development company in chennai
Best ERP erp software solutions in chennai"

Vietnam Airline said...

Mua vé máy bay tại Aivivu, tham khảo ngay

săn vé tết 2021

vé máy bay đi Mỹ giá bao nhiêu

ve may bay di Phap

giá vé máy bay đi hàn quốc khứ hồi vietjet

vé máy bay vietjet đi nhật bản

giá vé máy bay đi Anh

mua vé máy bay giá rẻ

Kashi Digital Agency said...

Seo company in Varanasi, India : Best SEO Companies in Varanasi, India: Hire Kashi Digital Agency, best SEO Agency in varanasi, india, who Can Boost Your SEO Ranking, guaranteed SEO Services; Free SEO Analysis.

Best Website Designing company in Varanasi, India : Web Design Companies in varanasi We design amazing website designing, development and maintenance services running from start-ups to the huge players


Wordpress Development Company Varanasi, India : Wordpress development Company In varanasi, india: Kashi Digital Agency is one of the Best wordpress developer companies in varanasi, india. Ranked among the Top website designing agencies in varanasi, india. wordpress website designing Company.

E-commerce Website designing company varanasi, India : Ecommerce website designing company in Varanasi, India: Kashi Digital Agency is one of the Best Shopping Ecommerce website designing agency in Varanasi, India, which provides you the right services.

cheap erectile dysfunction pills online said...

Fantastic goods from you, man. I have understand your stuff previous to and you are just too fantastic. I actually like what you have acquired here, certainly like what you're stating and the way in which you say it. You make it entertaining and you still care for to keep it wise. I can not wait to read much more from you. This is actually a terrific website.

BTree Systems, Software (IT) Training Institute said...

The Best Training Center in Adyar Chennai & Affordable Fee Please Call Us below Courses
aws training in chennai
Python training in Chennai
data science training in chennai
hadoop training in chennai
machine learning training chennai

sonnu said...

Nice Blog! thank you for sharing useful info............
documentum training Online
Adobe Marketing Cloud Training Online
kofax training online
Salesforce Wave Analytics Training Online
siebel crm training online

sripadojwar1994 said...

ExcelR provides Data Science course . It is a great platform for those who want to learn and become a data scientist. Students are tutored by professionals who have a degree in a particular topic. It is a great opportunity to learn and grow.

Data Science Course
Data science courses
Data scientist certification
Data scientist courses

Amrita Bansal said...

This is my first-time visit to your blog and I am very interested in the articles that you serve. Provide enough knowledge for me. Thank you for sharing useful and don't forget, keep sharing useful info:

Python Training in Gurgaon
Data Science Training in Gurgaon
Data Analytics Training in Gurgaon
Selenium Training in Gurgaon

jhansi said...



Thank you for sharing the article. The data that you provided in the blog is informative and effective.
tally training in chennai

hadoop training in chennai

sap training in chennai

oracle training in chennai

angular js training in chennai

mrbobystone said...

Nice Blog !
Here We are Specialist in Manufacturing of Movies, Gaming, Casual, Faux Leather Jackets, Coats And Vests See 8 Ball Jacket

Cubestech said...

WOW! Many thanks for keeping your content up to date. Your level of dedication is clearly visible through this blog!

Cheers!!

"Best mobile app development service in chennai
Best ERP software solutions in chennai
Digital Marketing Agency in Chennai
Best web development company in chennai"

Nida said...

I appreciate your effort and want you to keep on posting such posts

website development company in kochi

Josh said...

Best IT Training Institute in chennai, Drilling consultants

Vietnam Airline said...

Đại lý vé máy bay Aivivu, tham khảo

vé máy bay đi Mỹ hạng thương gia

vé máy bay giá rẻ tết 2021

vé máy bay đi Canada bao nhiêu tiền

ve may bay di Phap gia bao nhieu

đường bay từ Việt Nam sang Anh

đặt vé máy bay giá rẻ ở đâu

combo nghỉ dưỡng đà nẵng

combo khách sạn đà lạt

tự xin visa trung quốc 2021

đăng ký cách ly khách sạn

Fuel Digital Marketing said...

Thanks for sharing great article with Us. Keep posting like this with us.
spa in chennai | massage in chennai | spa and salon in chennai|spa in coimbatore | massage in coimbatore | spa in vellore | massage in vellore | spa in tiruppur

Ricky Liame said...

Informative post! I am really glad to read this post with us, thank you for sharing about database programming.

access database developer London

Fubo.tv/Activate-code said...

If you are thinking of getting rid of your cable TV subscription, then fubo.tv/Connect is definitely one of the best options. All you require is a good internet connection for using it. when fubo.tv/activate, you get access to more than 100 channels for watching live.

Data Science Course in Mysuru said...

I found Hubwit as a transparent s ite, a social hub which is a conglomerate of Buyers and Sellers who are ready to offer online digital consultancy at decent cost.

Data Science Course in Mysore

ve may bay tet said...

Aivivu - đại lý chuyên vé máy bay, tham khảo

vé máy bay đi Mỹ bao nhiêu

các chuyến bay từ mỹ về việt nam hiện này

chuyến bay từ canada về việt nam

Lịch bay từ Hàn Quốc về Việt Nam hôm nay

Best Training Institute said...

Thankyou for sharing this kind of valuable information with us. Your post give great knowledge
Power Bi training in bangalore
Power Bi institutes in bangalore

Babit said...

I am very enjoyed for this blog. It's an informative topic. It helps me very much to solve some problems. Thank you for sharing this blog.
Big Data Hadoop Training Cost

Double click training said...

learn double click

99 Digital Academy said...

Great Article, Thanks for the nice information. Here I have a suggestion for the best learning of Digital Marketing Course. 99 Digital Academy is the best digital marketing training institute for advanced digital marketing course in Gurgaon.

99 Digital Academy said...

Great Article, Thanks for the nice information. Here I have a suggestion for the Best Free Guest Posting Site List. These Guest Posting sites will help you in improving SEO of your website.

Anonymous said...

Nice blog.
Python training in bangalore

Anonymous said...

Good information
python training in bangalore

Rision Digital said...

Really it is very nice one Post. Thanks a lot for writing this post. Here I am posting about how to Career in Digital Marketing. Rision Digital is a site that helps you to Learn Digital Marketing & Blogging.

Anonymous said...


VERY HELPFULL POST
THANKS FOR POSTING
MERN STACK TRAININIG IN DELHI SASVBA
ARTIFICIAL INTELLIGENCE INSTITUTE IN DELHI SASVBA
MACHINE LEARNING TRAINING IN DELHI SASVBA
DEEP LEARNING TRAINING IN DELHI NCR SASVBA
GMB
SASVBA
FOR MORE INFO:

hamdan hussain said...

By the end of this doubleclick for publishers training course, you will be fully prepared with the ability to gain full control over every aspect of doubleclick for publishers (DFP). This should allow you to plan, execute, optimise and properly track all your digital media campaigns

Priya Rathod said...

The blog was absolutely fantastic! Lot of information is helpful in some or the other way. Keep updating the blog, looking forward for more content...Great job, keep it up
AWS Training in Hyderabad
AWS Course in Hyderabad

Priya Rathod said...

It is better to engaged ourselves in activities we like. I liked the post. Thanks for sharing.
DevOps Training in Hyderabad
DevOps Course in Hyderabad

jeya sofia said...

Great Post with valuable information. I am glad that I have visited this site. Share more updates.
Firebase Training Course
English Speaking Course Online
jira online training

Addons said...

predictive analytics services in los angeles
augmented reality and virtual reality in los angeles
machine learning in los angeles
cms portfolio in los angeles

abhishek said...

very nice funny quotes for friends thanks for sharing this quotes

Siva Vadlamuri said...

It is very usefull blog. Thanks for sharing
UI Development Training In Bangalore
Angular Development Training In Bangalore
React Js Training Institute In Bangalore

Om packers and movers said...

Appreciate your blog and got many information from your blog. I want to tell you something about packers and movers in Gurgaon our packers and movers service is very fast and safe.

salome said...

really interesting and informative article
best-angular-training in chennai |

Manoj Patil said...

Thanks a lot for sharing kind of information. Your article provides such great information with good knowledge. Digital Marketing Courses in Pune with Placement

Anonymous said...

Worth reading! Our experts also have given detailed inputs about these trainings & courses! Presenting here for your reference. Do checkout Data Analytics Course

Anonymous said...

Nice blog post,
Digital Marketing Training in KPHB with 100% Internships & Job Assistance

Robert John said...
This comment has been removed by the author.
Robert John said...

Canon Printer Error Code 5b02 is a very annoying error. If you are facing the same error check this blog and Just follow the steps which are written on the blog to fix the Canon Printer Error Code 5b02. We give online help for Any problem with Printer Errors.

Follow this blog - Guide to fix Canon Printer Error Code 5b02

Anonymous said...

Awesome blog post,
Digital Marketing Course in Hyderabad in Hyderabad, the student will learn how to use PPC, CPC, CPM, CPA, Display Ads, Shopping Ad Campaign and he will also learn how to promote a website online.

Anonymous said...

nice article

click here

James Williams said...

Nice post, thanks for sharing such a informative information.
Java Online Training
Python Online Training
PHP Online Training

Home Improvement said...

Great post I must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more. smart campaigns

Vé máy bay từ Canada về việt nam said...

Đặt vé tại phòng vé Aivivu, tham khảo

giá vé máy bay đi Mỹ khứ hồi

giá vé máy bay từ mỹ về việt nam

giá vé từ nhật về việt nam

vé máy bay từ đức về việt nam giá rẻ

đăng ký bay từ canada về Việt Nam

mua ve may bay tu han quoc ve viet nam

khách sạn cách ly ở đà nẵng

Unknown said...

A charming conversation is worth remark. I believe that you should distribute more on this topic, it probably won't be an untouchable issue yet for the most part individuals don't examine these issues. To the following! Kind respects!!

best interiors

IK Softech said...



I am inspired with your post writing style & how continuously you describe this topic. After reading your post, thanks for taking the time to discuss this, I feel happy about it and I love learning more about this topic. sap sd training in bangalore

data scientist course said...

Viably, the article is actually the best point on this library related issue. I fit in with your choices and will enthusiastically foresee your next updates.data scientist training in hyderabad

KITS Technologies said...

aws training

eddielydon said...

Statistics students and professor are worried to find the deviation calculator because their work depends on it. Organization 13 Coat

Cubestech - Software Development Company said...

Hey there

Thanks for sharing this informative post, Waiting for your updates

Software Development company
Mobile app development company
Best web development company

learning.oilab said...

Digital Marketing Training In Jodhpur Oh my goodness! Impressive article dude! Thanks For Sharing It.Thanks for this blog and it more informative and useful to read.

Rajeshshrimali said...

Best Astrologer In Jodhpur Great Article. Keep Up The Good Work. Love to read such Great Content which provides quality Knowledge as well as interesting facts.

sharmi kaashiv infotech said...

informative article...
thanks for sharing..

internship completeion letter , internship certificate online , internship offering companies , internship offer letter , internship acceptance letter , internship and apprenticeship difference , how many internships should i do , internship and inplant training difference , internship guidelines for students , why internship is necessary

sharmi kaashiv infotech said...
This comment has been removed by the author.
George Mark said...

I like the way you express information to us. Thanks for such post and please keep it up. Baywatch Jacket

Anonymous said...

Nice post and thanks for sharing. keep going

Are you searching for any inexpensive web development Company in Chennai? We are here

Website Development Company in Chennai
Ecommerce Website Development Company in Chennai

Lokeswari said...

Gathered lots of information here, do share more updates.

internship meaning | internship meaning in tamil | internship work from home | internship certificate format | internship for students | internship letter | Internship completion certificate | internship program | internship certificate online | internship graphic design

manasa said...

Decent Information, significant and magnificent plan, as offer great stuff with smart thoughts and ideas, loads of extraordinary Information and motivation, the two of which I want, on account of deal such an accommodating Information.

Data Science Training in Hyderabad

Credo Systemz said...

very interesting to read and informative article. Python Training in Chennai

Jobs update Live said...

Thank you for share nice post
cms development company in india

best web design company in chennai

outsource video editing services

outsource real estate photo editing

technologyforall said...
This comment has been removed by the author.
Maneesha said...

Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post.
data analytics training in hyderabad

Asha Kaashiv said...

Hi, the information you are sharing is very nice and useful for us thanks for sharing project details click here MSc Computer Science Project Topics in Android , MSc Computer Science Project Topics in Asp.Net , CSE Mini Projects , CSE Projects for Final Year , CSE Mini Project Topics , CSE Final Year Project Domains

Tamil Typing said...

Thanks for sharing informative post. Are looking for best Tamil typing tool online, make use of our Tamil typing software to make translation faster. Thirumana Porutham in Tamil | Samacheer Kalvi Books PDF

JavaTution said...

Very good article on Java. Please Keep up the good work. Very informative. Will refer this to my students. I am an Online Java Tutor having 15+ years experience in Java development and Online Java Training

Excelr Tuhin said...


Hi! This is my first visit to your blog! We are a team of volunteers and new initiatives in the same niche. Blog gave us useful information to work. You have done an amazing job!

satta

satta matta matka

pranisha said...


Infycle Technologies offers the best Python training in Chennai for tech professionals and freshers with New year offers. In addition to the Python Training Course, Infycle also offers other technical courses such as Data Science, Oracle, Java, Power BI, Digital Marketing, Big Data, etc., which will be trained with complete practical classes. Dial 7504633633 to get more info and a free demo

Anonymous said...

Microsoft recently updated a certification named Azure Data Engineer Associate. To get this tag you need to clear one examination named: Exam DP-203: Data Engineering on Microsoft Azure.

Unknown said...

I have a mission that I’m just now working on, and I have been at the look out for such information data analytics course in kanpur

Ricky Liame said...

This is the kind of blog i was looking for, keep sharing them always.
access database developer Leeds

James Brown said...

We are from a leading education providers company. Our course has been specially developed for students and professionals in the early stages of their careers who wish to pursue rewarding careers in Data Science. The course curriculum is well-designed so that even the most novice student can grasp the concepts in a simple manner.

Check outhttps://www.careerera.com/data-science/certification-course/india/delhi

sowmya said...
This comment has been removed by the author.
salome said...

interesting to read. Python training in Chennai

data science training in lucknow said...

It is a subcategory of data analysis. It takes out the hidden patterns from big data. Its main task is to develop models for machine learning that is employed in AI.

Stphen07 said...
This comment has been removed by the author.
www.vepsun.in said...

Best Data science Training provided by Vepsun in Bangalore for the last 12 years. Our Trainer has more than 20+ Years
of IT Experience in teaching Virtualization and bootcamp topics.. we are very delighted to say that Vepsun is
the Top data science training Provider in Bangalore. We provide the best atmosphere for our students to learn.
Our Trainers have great experience and are highly skilled in IT Professionals. It includes a mixture of
infrastructure as service and packaged software as service offerings and also automation. We have trained
more than 10000 students in data science and our trainer has been awarded as the best Citrix and programming
trainer in India.
www.vepsun.in

tan45 said...

Thank You For sharing Good Information
Good Quality Content

From
https://www.tan45.in

Web Designing Training in Bangalore said...

You ought to be a part of a contest for one of the finest sites on the internet. I will recommend this web site!

https://infocampus.co.in/web-designing-training-in-bangalore.html
https://infocampus.co.in/web-development-training-in-bangalore.html
https://infocampus.co.in/
https://infocampus.co.in/php-training-bangalore.html
https://infocampus.co.in/phpmysql-training-bangalore.html
https://www.firstenquiry.com/reactjs-training-in-bangalore
https://www.campusinterview.in/top-50-javascript-interview-questions-and-answers/
https://www.campusinterview.in/top-50-react-interview-questions/
https://infocampus.co.in/2023/02/what-is-react

infocampus said...

Your style is very unique in comparison to other folks I have read stuff from. Thank you for posting when you've got the opportunity, Guess I will just book mark this site.

Web Designing Training in Bangalore | Full Stack Training in Bangalore | Best Training Institute in Bangalore

k21academy said...

azure certification path 2023

VISWA Technologies said...

Hi, This site's information is very nice..I Hope to really understand this site's information...Hadoop training in Hyderabad….Dell Boomi Online Training
SQL Server DBA Online Training

Chaitanya said...

I am truly pleased to glance at this blog posts which consists of plenty of helpful facts, thanks for providing these statistics..
Oracle Enterprise Manager Training from Hyderabadg
IT Business Analyst Training from Hyderabadg

Irich photography said...

Very good post

Best Institute For Software Training said...

I appreciate you providing this excellent knowledge. Very helpful and sensible for me. I appreciate your wonderful blog; keep up the good work and thanks for sharing your knowledge.
Aws Training institute in Hyderaba

Anonymous said...

Hi, This site's information is very nice. I Hope to really understand this site's information. DevOps training in Hyderabad
Devops Training in JNTU

Ecp said...

good info!

vcube said...

I'm happy to say that it was interesting to read the post. I learned something new from your article. You're doing a fantastic job.
Testing Tools Training Near Me

kosmik said...

This is really great informative blog.Devops training in kphb Keep sharing.

«Oldest ‹Older   401 – 496 of 496   Newer› Newest»