I feel so dirty
-
I just stuck this in a small data import utility that I don't particularly care about:
catch ( System.Data.DataException err )
{
if ( !err.ToString().Contains ( "Cannot insert duplicate key" ) )
{
throw ;
}
}If they don't care enough to send me clean data, why should I spend a Friday afternoon writing good code?
-
I just stuck this in a small data import utility that I don't particularly care about:
catch ( System.Data.DataException err )
{
if ( !err.ToString().Contains ( "Cannot insert duplicate key" ) )
{
throw ;
}
}If they don't care enough to send me clean data, why should I spend a Friday afternoon writing good code?
that's the way to do it... why should always we developers have the pressure of being exact and clean :D would've done it too this way... if it was friday afternoon in the mid of summer ;P
-
I just stuck this in a small data import utility that I don't particularly care about:
catch ( System.Data.DataException err )
{
if ( !err.ToString().Contains ( "Cannot insert duplicate key" ) )
{
throw ;
}
}If they don't care enough to send me clean data, why should I spend a Friday afternoon writing good code?
PIEBALDconsult wrote:
err.ToString()
Whatever happened to
err.Message
? ;) MarcImperative to Functional Programming Succinctly Contributors Wanted for Higher Order Programming Project!
-
PIEBALDconsult wrote:
err.ToString()
Whatever happened to
err.Message
? ;) MarcImperative to Functional Programming Succinctly Contributors Wanted for Higher Order Programming Project!
Nah, I tried that first, but the text is in an InnerException. I have code that spelunks the Exceptions looking for the actual Error code from SQL Server, but I didn't have it handy.
-
Nah, I tried that first, but the text is in an InnerException. I have code that spelunks the Exceptions looking for the actual Error code from SQL Server, but I didn't have it handy.
If it's in the innermost exception:
catch ( System.Data.DataException err )
{
if ( !err.GetBaseException().Message.Contains ( "Cannot insert duplicate key" ) )
{
throw;
}
}Exception.GetBaseException Method | MSDN[^] If it can be anywhere in the chain:
catch ( System.Data.DataException err )
{
bool isDuplicateKey = false;
Exception currentErr = err;while (currentErr != null && !isDuplicateKey) { isDuplicateKey = currentErr.Message.Contains ( "Cannot insert duplicate key" ); currentErr = currentErr.InnerException; } if ( !isDuplicateKey ) { throw; }
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
If it's in the innermost exception:
catch ( System.Data.DataException err )
{
if ( !err.GetBaseException().Message.Contains ( "Cannot insert duplicate key" ) )
{
throw;
}
}Exception.GetBaseException Method | MSDN[^] If it can be anywhere in the chain:
catch ( System.Data.DataException err )
{
bool isDuplicateKey = false;
Exception currentErr = err;while (currentErr != null && !isDuplicateKey) { isDuplicateKey = currentErr.Message.Contains ( "Cannot insert duplicate key" ); currentErr = currentErr.InnerException; } if ( !isDuplicateKey ) { throw; }
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Though I can see the improvement; wouldn't the weak spot here being the check for a localized message? IIRC, then different (localized) versions of .NET will give different results. "Kan geen rij met dubbele sleutel invoegen in object 'dbo.aa673 met unieke index 'IX_673'." Next you'll hear "It worked on Win7, and then I opened it on another machine and it crashed. We didn't change anything and it should still be working. Why does Windows do that?" :laugh:
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)
-
Though I can see the improvement; wouldn't the weak spot here being the check for a localized message? IIRC, then different (localized) versions of .NET will give different results. "Kan geen rij met dubbele sleutel invoegen in object 'dbo.aa673 met unieke index 'IX_673'." Next you'll hear "It worked on Win7, and then I opened it on another machine and it crashed. We didn't change anything and it should still be working. Why does Windows do that?" :laugh:
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)
Indeed. Checking the SQL error codes would be a more robust approach. However, it sounds like this is a program that's only ever run on one computer, so it's unlikely to suddenly start throwing errors in Dutch. :)
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
If it's in the innermost exception:
catch ( System.Data.DataException err )
{
if ( !err.GetBaseException().Message.Contains ( "Cannot insert duplicate key" ) )
{
throw;
}
}Exception.GetBaseException Method | MSDN[^] If it can be anywhere in the chain:
catch ( System.Data.DataException err )
{
bool isDuplicateKey = false;
Exception currentErr = err;while (currentErr != null && !isDuplicateKey) { isDuplicateKey = currentErr.Message.Contains ( "Cannot insert duplicate key" ); currentErr = currentErr.InnerException; } if ( !isDuplicateKey ) { throw; }
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
When I do it right, I walk the InnerExceptions to find the first System.Data.SqlClient.SqlException with one of the following error codes:
errorcodes = new System.Collections.Generic.Dictionary() ; errorcodes \[ 1205 \] = PIEBALD.Data.ErrorCode.Deadlock ; errorcodes \[ 2601 \] = PIEBALD.Data.ErrorCode.Duplicate ; errorcodes \[ 2627 \] = PIEBALD.Data.ErrorCode.Duplicate ; errorcodes \[ 547 \] = PIEBALD.Data.ErrorCode.ReferentialIntegrity ; errorcodes \[ -2 \] = PIEBALD.Data.ErrorCode.Timeout ;
Then wrap it in a custom Exception:
public partial class DuplicateException : PIEBALD.Data.OperationFailedException ... public partial class ReferentialIntegrityException : PIEBALD.Data.OperationFailedException ... public partial class TimeoutException : PIEBALD.Data.OperationFailedException ...
Then my code can catch and act on specific error codes.
-
Indeed. Checking the SQL error codes would be a more robust approach. However, it sounds like this is a program that's only ever run on one computer, so it's unlikely to suddenly start throwing errors in Dutch. :)
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Richard Deeming wrote:
However, it sounds like this is a program that's only ever run on one computer
I wish I had gotten a penny everytime that assumption fell apart :)
Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)
-
I just stuck this in a small data import utility that I don't particularly care about:
catch ( System.Data.DataException err )
{
if ( !err.ToString().Contains ( "Cannot insert duplicate key" ) )
{
throw ;
}
}If they don't care enough to send me clean data, why should I spend a Friday afternoon writing good code?
What if locale is not english
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L %^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2 W_AD`EPABIKRDFVS)EVLQK)JKQUFK[M`UKs*$GwU#QDXBER@CBN% R0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
----------------------------------------------- 128 bit encrypted signature, crack if you can