Retrieving error codes from SQLite when using ExecuteNonQuery() - c#

In my C# project, I'm using System.Data.SQLite.dll downloaded from CodeProject.
My problem is as per the title - how to get the error codes after calling SqliteCommand.ExecuteNonQuery() function?
Error codes such as SQLITE_CONSTRAINT, SQLITE_BUSY, SQLITE_LOCKED as shown here.

use the Exception.StackTrace or the SQLiteException.ErrorCode
try
{
}
catch(SQLiteException ex)
{
string code = ex.ErrorCode;
}

I'm going to add to this to help others, if you're developing in .NET. Use the
SQLiteErrorCode enumeration to test the result, cast the ErrorCode:
try
{
}
catch(SQLiteException ex)
{
SQLiteErrorCode sqlLiteError= (SQLiteErrorCode)ex.ErrorCode;
//Do whatever logic necessary based of the error type
}

Good question.
System.Exception does not have a member by the name ".ErrorCode"
Catch Ex As SQLiteException
E = Ex.ResultCode
Return E
End Try

Related

Make the error shorter

I made a program in c#(I don't put here the code because there are lot of classes),and I made Exceptions to throw the mistakes,and when a mistake occurs this is what appears in the console:
System.Exception: Student whit id:1 already exists! at
StudentManagment.Service.AbstractService`4.Add(E entity) in
C:\Users\Robbi\source\repos\StudentManagment\StudentManagment\Service\AbstractService.cs:line
34 at StudentManagment.Domain.Program.Main(String[] args) in
C:\Users\Robbi\source\repos\StudentManagment\StudentManagment\Program.cs:line
23
And my question is, How can I make that in the console to appear just
Student whit id:1 already exists!
Catch the exception into a variable and output the exception.Message only. You are seeing a stack trace - ie all the methods that are in execution at the point of error. StackTraces are useful for debugging purposes, but not so great for displaying information to a user.
i.e
try
{
//do error here
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
This is a very beginner issue
While you show no code, heres some semi fake code to answer the question
try
{
do_it();
}
catch (Exception myEx) // you can do different things with different exception types
{
Console.WriteLine("Error: "+myEx.Message);
}
You have to use
ex.Message
where ex is your exceptption, something like
try
{
...
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
Of course, edit this minimal snippet code to satisfy your needs

How to catch an exception and use error codes when the requested PostgreSQL table can't be found?

I am using Entity Framework so I believe I should catch an NpgsqlException since it's the .NET data provider for PostgreSQL. So let's say I make a query to the context. If the table doesn't exist in the PostgreSQL database, I want to catch the exception thrown and then manually create it. The code below is an example of how an entity is inserted, and I have attempted to use error handling to create the table if need be:
try
{
return _context.Set(entityType).Add(entity);
}
catch (NpgsqlException)
{
CreateEntityTable(entity); //a private method I made
return _context.Set(entityType).Add(entity);
}
The problems are:
I'm not 100% sure I should be catching an NpgsqlException
I want to be sure that if an exception is thrown, it's because the table doesn't exist. I looked up the PostgreSQL documentation of error codes and error code 42P01 is undefined table. I believe I want to use that, but how? I looked up the members of the NpgsqlException class, and I found ErrorCode. However, that's a type int. It would be nice if I could change the code above to be like the following
try
{
return _context.Set(entityType).Add(entity);
}
catch (NpgsqlException ex)
{
if (ex.ErrorCode.Equals(42P01))
{
CreateEntityTable(entity); //a private method I made
return _context.Set(entityType).Add(entity);
}
}
But I'm not sure if that makes sense (I'm not even sure how 42P01 can be an int).
Any help would be appreciated.
You will want to use the Code property of the NpgsqlException as that will contain PostgreSql error code.
Updating your example:
try
{
return _context.Set(entityType).Add(entity);
}
catch (NpgsqlException ex)
{
if (ex.Code == "42P01")
{
CreateEntityTable(entity); //a private method I made
return _context.Set(entityType).Add(entity);
}
}
As an aside, I would suggest that you don't perform schema updates in your normal code. Only do something of this nature in an installer, or on start up as an upgrade.
Tested and working with ASP NET Core 3.1 and ASP NET Core 5.0
try
{
_context.Add(entity);
await _context.SaveChangesAsync().ConfigureAwait(false);
return RedirectToAction(nameof(Index));
}
catch (DbUpdateException ex)
{
if (ex.GetBaseException() is PostgresException pgException)
{
switch (pgException.SqlState)
{
case "23505":
ModelState.AddModelError(string.Empty, "This entity exists in the database");
return View(yourViewModelFromRequest);
default:
throw;
}
}
}
Try
...
catch (NpgsqlException e)
{
switch (e.SqlState)
{
case "23505":
MessageBox.Show("Some message...");
break;
default:
MessageBox.Show("Some message. Details: " + e.Message);
break;
}
}

Catch DB error details

I want a better way to catch database error details.
I'm currently using :
try
{
dbconn.table.AddObject(newRow);
dbconn.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine("DB fail ID:" + Row.id);
}
many times I found the Exception ex can no give me details on how the exception happen.
I think these exception most likely to be the DB connection kind.
So is there a better way to catch this ?
You should also output the exception. Most of the time, it holds useful and detailed information (e.g. names of violated constraints). Try this:
try
{
dbconn.table.AddObject(newRow);
dbconn.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine("DB fail ID:" + Row.id);
Console.WriteLine(ex.ToString());
}
For full details, use the ToString() method, it will give you the stack trace as well, not only the error message.
Use Console.WriteLine(ex.GetType().FullName) (or put a breakpoint and run under a debugger) to see the actual exception type being thrown. Then visit MSDN to see its description and base classes. You need to decide which of the base classes provides you with the information needed by exposing such properties. Then use that class in your catch() expression.
For Entity Framework, you might end up with using EntityException and then checking the InnerException property for the SQL exception object that it wraps.
try
{
dbconn.table.AddObject(newRow);
dbconn.SaveChanges();
}
catch (EntityException ex)
{
Console.WriteLine("DB fail ID:" + Row.id + "; Error: " + ex.Message);
var sqlExc = ex.InnerException as SqlException;
if (sqlExc != null)
Console.WriteLine("SQL error code: " + sqlExc.Number);
}
Instead of Exception use SqlException.
SqlException give you more detail. it has a Number property that indicate type of error and you can use that Number in a switch case to give some related information to user.
In short, yes there is a better way to handle it. The 'how' of it is up to you.
Exception handling in C# goes from the most specific exception type to the least specific. Also, you aren't limited to using just one catch block. You can have many of them.
As an example:
try
{
// Perform some actions here.
}
catch (Exception exc) // This is the most generic exception type.
{
// Handle your exception here.
}
The above code is what you already have. To show an example of what you may want:
try
{
// Perform some actions here.
}
catch (SqlException sqlExc) // This is a more specific exception type.
{
// Handle your exception here.
}
catch (Exception exc) // This is the most generic exception type.
{
// Handle your exception here.
}
In Visual Studio, it is possible to see a list of (most) exceptions by pressing CTRL+ALT+E.

How to read Google.GData.Client.GDataRequestException

I am writing a youtube upload software. Actually my question is generic here.
The Google.GData.Client produces an exception. But I don't know how to reach in order to write ?
I mean how do I access it ? I tried with E. but there is no Google.Gdata
I need to access Google.GData.Client.GDataRequestException.ResponceString
You need to change your catch clause to specify the type of exception (in your case, Google.GData.Client.GDataRequestException) so that you can access its members.
catch (Google.GData.Client.GDataRequestException ex)
{
Console.WriteLine(ex.ResponseString);
}
try {
// your GDataRequest code goes here
} catch (GDataRequestException e ) {
// your error code goes here
}

PHP exception Handling vs C#

this is a really basic question (I hope). Most of the exception handling I have done has been with c#. In c# any code that errors out in a try catch block is dealt with by the catch code. For example
try
{
int divByZero=45/0;
}
catch(Exception ex)
{
errorCode.text=ex.message();
}
The error would be displayed in errorCode.text. If I were to try and run the same code in php however:
try{
$divByZero=45/0;
}
catch(Exception ex)
{
echo ex->getMessage();
}
The catch code is not run. Based on my limeted understanding, php needs a throw. Doesn't that defeat the entire purpose of error checking? Doesn't this reduce a try catch to an if then statement?
if(dividing by zero)throw error
Please tell me that I don't have to anticipate every possible error in a try catch with a throw. If I do, is there anyway to make php's error handling behave more like c#?
You could also convert all your php errors with set_error_handler() and ErrorException into exceptions:
function exception_error_handler($errno, $errstr, $errfile, $errline )
{
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
try {
$a = 1 / 0;
} catch (ErrorException $e) {
echo $e->getMessage();
}
PHP's try-catch was implemented later in the language's life, and so it only applies to user-defined exceptions.
If you really want to handle actual errors, set your own error handler.
To define and catch exceptions:
function oops($a)
{
if (!$a) {
throw new Exception('empty variable');
}
return "oops, $a";
}
try {
print oops($b);
} catch (Exception $e) {
print "Error occurred: " . $e->getMessage();
}
From http://php.net/manual/en/language.exceptions.php
"Internal PHP functions mainly use Error reporting, only modern Object oriented extensions use exceptions. However, errors can be simply translated to exceptions with ErrorException."
See also http://www.php.net/manual/en/class.errorexception.php
I think the only way to deal with this in PHP is to write:
try
{
if ($b == 0) throw new Exception('Division by zero.');
$divByZero = $a / $b;
}
catch(Exception ex)
{
echo ex->getMessage();
}
Unlike in C#, not every issue will raise an exception in PHP. Some issues are silently ignored (or not silently - they print something to the output), but there are other ways to handle these. I suppose this is because exceptions were not a part of the language since the first version, so there are some "legacy" mechanisms.

Categories

Resources