2010-01-12 3 views
0

Comment puis-je modifier le code suivant pour écrire dans la base de données null au lieu de chaînes vides?Comment puis-je les écrire dans ma base de données comme Null au lieu de Nothing

Public Sub SetChangeRequest(ByVal referenceLeaseID As Integer, _ 
            ByVal referenceCustomerID As Integer, _ 
            Optional ByVal custUnitNum As Object = Nothing, _ 
            Optional ByVal driverFirstName As Object = Nothing, _ 
            Optional ByVal driverLastName As Object = Nothing, _ 
            Optional ByVal driverEmail As Object = Nothing, _ 
            Optional ByVal plateNumber As Object = Nothing, _ 
            Optional ByVal plateProvince As Object = Nothing, _ 
            Optional ByVal usageProvince As Object = Nothing, _ 
            Optional ByVal invoiceGroups As Object = Nothing) 
    mcmd = New SqlCommand 
    mcmd.CommandType = CommandType.Text 
    mcmd.Connection = mcn 
    mcmd.CommandText = "IF EXISTS (SELECT * FROM ChangeRequest WHERE ReferenceLeaseID = " & referenceLeaseID & ")" & vbNewLine & _ 
         "DELETE FROM ChangeRequest WHERE ReferenceLeaseID = " & referenceLeaseID & vbNewLine & _ 
         "INSERT INTO ChangeRequest (ReferenceLeaseID, ReferenceCustomerID, CustomerUnitNum, DriverFirstName, DriverLastName, DriverEmail, PlateNumber, PlateProvince, UsageProvince, InvGroupID)" & vbNewLine & _ 
         "VALUES ('" & referenceLeaseID & "', '" & referenceCustomerID & "', '" & custUnitNum & "', '" & driverFirstName & "', '" & driverLastName & "', '" & driverEmail & "', '" & plateNumber & "', '" & plateProvince & "', '" & usageProvince & "', '" & invoiceGroups & "')" 
    mcn.Open() 
    mcmd.ExecuteScalar() 
    mcn.Close() 
End Sub 

Cheers,

Mike

Répondre

6

La manière dont vous construisez votre requête est inefficace, difficile à lire, sujette aux erreurs et, pire encore, ouverte aux attaques par injection SQL. Vous devez utiliser les paramètres SQL:

mcmd.CommandText = "IF EXISTS (SELECT * FROM ChangeRequest WHERE ReferenceLeaseID = @referenceLeaseID") " _ 
        "DELETE FROM ChangeRequest WHERE ReferenceLeaseID = @referenceLeaseID " & _ 
        "INSERT INTO ChangeRequest (ReferenceLeaseID, ReferenceCustomerID, CustomerUnitNum, DriverFirstName, DriverLastName, DriverEmail, PlateNumber, PlateProvince, UsageProvince, InvGroupID) " & _ 
        "VALUES (@referenceLeaseID, @referenceCustomerID, @custUnitNum, @driverFirstName, @driverLastName, @driverEmail, @plateNumber, @plateProvince, @usageProvince, @invoiceGroups)" 

Vous pouvez spécifier des valeurs pour les paramètres tels que:

mcmd.Parameters.Add("@parameterName", If(ParameterValue Is Nothing, DBNull.Value, ParameterValue)) 
+0

Génial. Super feedback. À votre santé. –

1

Il y a cette chose appelée DBNull.Value. C'est ce que vous voulez au lieu de Nothing.

Pour tester si une valeur de base de données est NULL, utilisez la fonction IsDBNull.

0

Utilisez une requête paramétrées au lieu de mettre les valeurs dans SQL. En plus de corriger le problème des valeurs nulles, il protège également contre l'injection SQL.

Public Sub SetChangeRequest(ByVal referenceLeaseID As Integer, _ 
            ByVal referenceCustomerID As Integer, _ 
            Optional ByVal custUnitNum As Object = Nothing, _ 
            Optional ByVal driverFirstName As Object = Nothing, _ 
            Optional ByVal driverLastName As Object = Nothing, _ 
            Optional ByVal driverEmail As Object = Nothing, _ 
            Optional ByVal plateNumber As Object = Nothing, _ 
            Optional ByVal plateProvince As Object = Nothing, _ 
            Optional ByVal usageProvince As Object = Nothing, _ 
            Optional ByVal invoiceGroups As Object = Nothing) 
    mcmd = New SqlCommand 
    mcmd.CommandType = CommandType.Text 
    mcmd.Connection = mcn 
    mcmd.CommandText = "IF EXISTS (SELECT * FROM ChangeRequest WHERE ReferenceLeaseID = " & referenceLeaseID & ")" & vbNewLine & _ 
         "DELETE FROM ChangeRequest WHERE ReferenceLeaseID = " & referenceLeaseID & vbNewLine & _ 
         "INSERT INTO ChangeRequest (ReferenceLeaseID, ReferenceCustomerID, CustomerUnitNum, DriverFirstName, DriverLastName, DriverEmail, PlateNumber, PlateProvince, UsageProvince, InvGroupID)" & vbNewLine & _ 
         "VALUES (@ReferenceLeaseID, @ReferenceCustomerID, @CustomerUnitNum, @DriverFirstName, @DriverLastName, @DriverEmail, @PlateNumber, @PlateProvince, @UsageProvince, @InvGroupID)" 
    mcmd.Parameters.AddWithValue("ReferenceLeaseID", referenceLeaseID) 
    mcmd.Parameters.AddWithValue("ReferenceCustomerID", referenceCustomerID) 
    mcmd.Parameters.AddWithValue("CustomerUnitNum", custUnitNum) 
    mcmd.Parameters.AddWithValue("DriverFirstName", driverFirstName) 
    mcmd.Parameters.AddWithValue("DriverLastName", driverLastName) 
    mcmd.Parameters.AddWithValue("DriverEmail", driverEmail) 
    mcmd.Parameters.AddWithValue("PlateNumber", plateNumber) 
    mcmd.Parameters.AddWithValue("PlateProvince", plateProvince) 
    mcmd.Parameters.AddWithValue("UsageProvince", usageProvince) 
    mcmd.Parameters.AddWithValue("InvGroupID", invoiceGroups) 
    mcn.Open() 
    mcmd.ExecuteScalar() 
    mcn.Close() 
End Sub 
1

grande chose que je vous suggère est que vous utilisez une instruction SQL que vous paramétré ouvrir vous-même à sql injection.

par exemple. command.CommandText = "INSERT SomeTable (SomeField) VALEURS (@SomeField)";

puis ajoutez les paramètres nommés à la commande en utilisant command.Parameters.Add

Pour les valeurs que vous souhaitez stocker NULL, définissez la valeur de paramètre à DBNull.Value.

0

Si vous avez vraiment, vraiment voulu, vous faites la requête que vous construisez le travail en faisant quelque chose comme ce qui suit:

"VALUES (" & IIf(referenceLeaseID Is Nothing, "NULL", "'" & referenceLeaseID & "'")) 

... mais s'il vous plaît, s'il vous plaît ne le font pas cette. Le code est moche, difficile à maintenir, et permet toutes sortes de désagréments comme l'injection SQL. À la place, utilisez une requête paramétrée - l'ensemble du processus est assez bien expliqué in this MSDN article.

Après la première passe, votre code sera alors ressembler à quelque chose comme ceci:

Dim cmd = New SqlCommand(".... VALUES (@p0)") 
cmd.Parameters.Add(New SqlParameter("@p0", referenceLeaseID)) 

... qui est toujours pas assez: les longues requêtes SQL multi-ligne continueront d'encombrer votre code.

Pour résoudre ce problème également, déplacez votre requête dans une procédure stockée. Cela a l'énorme avantage de pouvoir composer votre SQL dans un éditeur prévu à cet effet, au lieu de le mélanger dans du code.Si vous utilisez une version récente de SQL Server Studio ou, bien sûr, l'indispensable SQL Prompt utility, vous aurez même un bon support Intellisense.

La procédure stockée sera à peu près identique à votre requête en cours, avec quelques déclarations de paramètres supplémentaires:

CREATE PROCEDURE UpdateDriverRecord 
    @referenceLeaseID NVARCHAR(42) 
BEGIN 
    ...VALUES(referenceLeaseID = @referenceLeaseID) 
END 

Votre code final quelque chose de ressembler à:

Dim cmd = New SqlCommand("UpdateDriverRecord") 
cmd.CommandType = CommandType.StoredProcedure 
cmd.Parameters.Add("@referenceLeaseID", SqlDbType.NVarChar, 42) 

Cela peut sembler Beaucoup de changements pour contourner un problème simple, mais votre code sera beaucoup plus sécurisé, lisible et maintenable.

Questions connexes