new SqlParameter("test", 0).Value == null. Kodėl?

įvertino 0 Atsakyta (Patvirtinta) Ši žinutė turi 2 patvirtinti atsakymai | 6 Atsakymai | 3 Šalininkai

Top 50 autorių
7 Žinutės
Taškai 115
paulgrab parašyta 2010-2-10 20:04

Pateiksiu kodo gabaliuką:

            if ((int)(new SqlParameter("test", 1).Value) == 1)
            {
                Console.WriteLine("Gerai");
            }

            if (new SqlParameter("test", 0).Value == null)
            {
                Console.WriteLine("WTF ???");
            }

            int zero = 0;
            if ((int)(new SqlParameter("test", zero).Value) == 0)
            {
                Console.WriteLine("Gerai");
            }

            const int ConstZero = 0;
            if (new SqlParameter("test", ConstZero).Value == null)
            {
                Console.WriteLine("WTF ???");
            }

Kodėl taip veikia? Ko aš nežinau? :-)

 

Bandyta ant V2008 SP1 .NET Framework 2.0

  • | Žinučių taškai: 35

Atsakyta (Patvirtinta) Patvirtinti atsakymai

Top 10 autorių
Vyras
37 Žinutės
Taškai 625
Verified by paulgrab

When you specify an Object in the value parameter, the SqlDbType is inferred from the Microsoft .NET Framework type of the Object.

Use caution when you use this overload of the SqlParameter constructor to specify integer parameter values. Because this overload takes a value of type Object, you must convert the integral value to an Object type when the value is zero, as the following C# example demonstrates.

If you do not perform this conversion, the compiler assumes that you are trying to call the SqlParameter (string, SqlDbType) constructor overload.

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));


Plačiau čia.

  • | Žinučių taškai: 40
Top 25 autorių
Vyras
21 Žinutės
Taškai 480
Verified by paulgrab

Nu tai daryk (object)0 vietoj (int)0 ;)

  • | Žinučių taškai: 25

Visi atsakymai

Top 25 autorių
25 Žinutės
Taškai 410

Nelabai supratau, matau kodo gabalą, o kaip veikia ar turi veikt ..?

  • | Žinučių taškai: 20
Top 50 autorių
7 Žinutės
Taškai 115

Kaip veikia, tai temos pavadinime manau aiškiai parašyta.

Dėl kodo, tai jis veikia taip, kad įvykdo visus IF sakinius. Manau taip neturėtų veikt. Arba aš kažko nežinau.

  • | Žinučių taškai: 5
Top 10 autorių
Vyras
37 Žinutės
Taškai 625
Verified by paulgrab

When you specify an Object in the value parameter, the SqlDbType is inferred from the Microsoft .NET Framework type of the Object.

Use caution when you use this overload of the SqlParameter constructor to specify integer parameter values. Because this overload takes a value of type Object, you must convert the integral value to an Object type when the value is zero, as the following C# example demonstrates.

If you do not perform this conversion, the compiler assumes that you are trying to call the SqlParameter (string, SqlDbType) constructor overload.

Parameter = new SqlParameter("@pname", Convert.ToInt32(0));


Plačiau čia.

  • | Žinučių taškai: 40
Top 50 autorių
7 Žinutės
Taškai 115

Ačiū, tai ir norėjau sužinoti. Nelabai mėgstu naudoti Convert klasę, bet teks, nes (int)0 irgi neveikia :-)

  • | Žinučių taškai: 20
Top 25 autorių
Vyras
21 Žinutės
Taškai 480
Verified by paulgrab

Nu tai daryk (object)0 vietoj (int)0 ;)

  • | Žinučių taškai: 25
Top 50 autorių
7 Žinutės
Taškai 115

Šį kartą pasitaikė truputį kitoks atvejis, bet prisiminęs atsakymus išspręndžiau nenaudojant daug kodo :)

 

double? myValue = null;

 Jeugu darome taip: new SqlParameter("@NormRatio", (object)myValue);, tai parametro SqlDbType = NVarChar

O jeigu taip: new SqlParameter("@NormRatio", SqlDbType.Float) { Value = resouceNormRatio };, tai tai parametro SqlDbType = Float ir kodo nedaug užima.

Gal kam pravers.

  • | Žinučių taškai: 5
Puslapis 1 iš 1 (7) | RSS
DotNetGroup.LT, 2009
Sprendimas