Greg
Greg

Reputation: 11480

A little bit of string cast

Update:


When a database returns a value through the scalar, it will always be an object. So when the value is returned you should have a preconceived notion of what the type will be. Why would you use ToString(); when you you have a SELECT which passes two parameters.

As if it doesn't exist it will always throw a null. So in my refactor I believed the as would be the proper approach. As ToString() will throw an error --- So what form of cast is it comparable to?


I've got some code I'm maintaining, but in apart of my refactor I came across a ToString() attached to an ExecuteScalar. My question would be, does the usage of ToString() equate to:

(string)command.ExecuteScalar();

Or would it represent this:

command.ExecuteScalar() as string;

Obviously the as string would fail gracefully, where the cast (string) would actually fall into an InvalidCastException. So when you call:

command.ExecuteScalar().ToString();

Which method of casting is it attempting to do?

Upvotes: 2

Views: 241

Answers (4)

Alfredo Alvarez
Alfredo Alvarez

Reputation: 334

Let's think about it for a bit.

When you do command.ExecuteScalar() you get back and object in a lot of cases based on the provider you get an int.

What happens is the order of operations triggers

  • Command.ExecuteScalar() gets and object back.
  • We are assuming he is an int for the excercise we get that int back.
  • To String gets called which is defined in the int32 object itself.
  • You get back the string that was determined inside.

For the most part toString is not meant to throw an exception if no one has implemented in the chain you just get the object type back which is the implementation on the object.

With that said in the case of the int it would probably be the one above. Note if execute scalar returns null to string will error out since null is not an object.

Hope that helps.

P.S. If you tell me the object type of ExecuteScalar i can give you a better answer.

Upvotes: 1

Vimal CK
Vimal CK

Reputation: 3563

If command.ExecuteScalar() returns null then it would be something like null.ToString() which will break your production code.

also (string)command.ExecuteScalar() can break your code.

I would suggest to use below line

var result = command.ExecuteScalar() as string;
if(result != null)
{
  //your code
}

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1500155

No, it doesn't mean either of those - it simply means calling ToString() on whatever the value is.

In particular, if the value is not a string, it will convert it to a string anyway - whereas string would fail with InvalidCastException and the as would return null.

So for example:

object x = 10;
string a = x.ToString(); // "10"
string b = x as string; // null
string c = (string) x; // Bang

Of course, ToString() can still throw an exception too - most obviously if the target of the call is a null reference.

Personally, I would suggest using a cast if you know what the result type should be - although the result of ExecuteScalar is more commonly a numeric value (e.g. a count) rather than a string.

Yes, that means an exception will be thrown if you're wrong - but if your query isn't doing what it's meant to anyway, then stopping due to an exception may well be better than going ahead with a bogus view of the world. (See my blog post on casting vs as for more on this attitude.)

Upvotes: 10

Xiaoy312
Xiaoy312

Reputation: 14477

Neither, because Object.ToString() will returns you a string representation of the object. Regardless whether the query returns a varchar or int.

Upvotes: 7

Related Questions