it-swarm.com.de

Parameter für die gespeicherte SQL Server-Prozedur "Nullable"

Problem:
Wenn Werte für das folgende Skript bereitgestellt werden und dann mit einem Setup in C # wie unten (oder in einer SQL Server-Umgebung) ausgeführt werden, werden die Werte in der Datenbank nicht aktualisiert.

Gespeicherte Prozedur:

-- Updates the Value of any type of PropertyValue
-- (Type meaining simple Value, UnitValue, or DropDown)
CREATE PROCEDURE [dbo].[usp_UpdatePropertyValue]
    @PropertyValueID int,
    @Value varchar(max) = NULL,
    @UnitValue float = NULL,
    @UnitOfMeasureID int = NULL,
    @DropDownOptionID int = NULL
AS
BEGIN   
    -- If the Property has a @Value, Update it.
    IF @Value IS NOT NULL
    BEGIN
        UPDATE [dbo].[PropertyValue]
        SET
            Value = @Value
        WHERE
            [dbo].[PropertyValue].[ID] = @PropertyValueID
    END
    -- Else check if it has a @UnitValue & UnitOfMeasureID
    ELSE IF @UnitValue IS NOT NULL AND @UnitOfMeasureID IS NOT NULL
    BEGIN
        UPDATE [dbo].[UnitValue]
        SET
            UnitValue = @UnitValue,
            UnitOfMeasureID = @UnitOfMeasureID
        WHERE
            [dbo].[UnitValue].[PropertyValueID] = @PropertyValueID          
    END
    -- Else check if it has just a @UnitValue
    ELSE IF @UnitValue IS NOT NULL AND @UnitOfMeasureID IS NULL
    BEGIN
        UPDATE [dbo].[UnitValue]
        SET
            UnitValue = @UnitValue
        WHERE
            [dbo].[UnitValue].[PropertyValueID] = @PropertyValueID  
    END
    -- Else check if it has a @DropDownSelection to update.
    ELSE IF @DropDownOptionID IS NULL
    BEGIN
        UPDATE [dbo].[DropDownSelection]
        SET
            SelectedOptionID = @DropDownOptionID
        WHERE
            [dbo].[DropDownSelection].[PropertyValueID] = @PropertyValueID
    END
END

Bei der Ausführung dieses Skripts (siehe unten) werden keine Werte aktualisiert.

Beispielausführung:

String QueryString = "EXEC [dbo].[usp_UpdatePropertyValue] @PropertyValueID, @Value, @UnitValue, @UnitOfMeasureID, @DropDownOptionID";
SqlCommand Cmd = new SqlCommand(QueryString, this._DbConn);

Cmd.Parameters.Add(new SqlParameter("@PropertyValueID", System.Data.SqlDbType.Int));
Cmd.Parameters.Add(new SqlParameter("@Value", System.Data.SqlDbType.Int));
Cmd.Parameters.Add(new SqlParameter("@UnitValue", System.Data.SqlDbType.Int));
Cmd.Parameters.Add(new SqlParameter("@UnitOfMeasureID", System.Data.SqlDbType.Int));
Cmd.Parameters.Add(new SqlParameter("@DropDownOptionID", System.Data.SqlDbType.Int));

Cmd.Parameters["@PropertyValueID"].Value = Property.Value.ID; // 1
Cmd.Parameters["@Value"].IsNullable = true;
Cmd.Parameters["@Value"].Value = DBNull.Value;
Cmd.Parameters["@UnitValue"].IsNullable = true;
Cmd.Parameters["@UnitValue"].Value = DBNull.Value;
Cmd.Parameters["@UnitOfMeasureID"].IsNullable = true;
Cmd.Parameters["@UnitOfMeasureID"].Value = DBNull.Value;
Cmd.Parameters["@DropDownOptionID"].IsNullable = true;
Cmd.Parameters["@DropDownOptionID"].Value = 2; // Current Value in DB: 3

Details:

Nach dem Ausführen einer Ausführung (über C # -Code oder SQL Server-Umgebung) wird dbo.DropDownSelection.SelectedOptionID Nicht aktualisiert. Ich vermute, dass es daran liegen könnte, dass dbo.DropDownSelection.SelectedOptionID Nicht nullfähig ist und der Parameter, den ich zum Festlegen verwende, nullfähig ist (obwohl er beim Festlegen niemals null sein sollte). Bei der Ausführung ist der Rückgabewert 0. Wenn ich eines der Updates außerhalb der Prozedur durchführe, funktionieren sie einwandfrei, daher der Verdacht, dass es sich um nullfähige Typen handelt.

Frage (n):

Kann dies daran liegen, dass die Parameter für die gespeicherte Prozedur nullwertfähig sind und die von mir festgelegten Felder nicht?

Wenn nicht, woran könnte es liegen?

17
Shelby115

Es sieht so aus, als würden Sie für jedes Argument außer PropertyValueID und DropDownOptionID Null übergeben, oder? Ich glaube nicht, dass eine Ihrer IF-Anweisungen ausgelöst wird, wenn nur diese beiden Werte nicht null sind. Kurz gesagt, ich denke, Sie haben einen logischen Fehler.

Davon abgesehen würde ich zwei Dinge vorschlagen ...

Anstatt auf NULL zu testen, verwenden Sie zunächst diese Syntax für Ihre if-Anweisungen (es ist sicherer) ...

    ELSE IF ISNULL(@UnitValue, 0) != 0 AND ISNULL(@UnitOfMeasureID, 0) = 0

Fügen Sie zweitens vor jedem UPDATE eine aussagekräftige PRINT-Anweisung hinzu. Auf diese Weise können Sie, wenn Sie den Sproc in MSSQL ausführen, die Nachrichten anzeigen und sehen, wie weit sie tatsächlich kommen.

10
Ash8087

Sie können/sollten Ihren Parameter auf den Wert DBNull.Value setzen.

if (variable == "")
{
     cmd.Parameters.Add("@Param", SqlDbType.VarChar, 500).Value = DBNull.Value;
}
else
{
     cmd.Parameters.Add("@Param", SqlDbType.VarChar, 500).Value = variable;
}

Oder Sie können Ihre Serverseite auf null setzen und den Parameter überhaupt nicht übergeben.

0
user1040975