2010-01-12 1 views
0

Как я могу изменить следующий код для записи в базу данных null вместо пустой строки?Как я могу записать их в свою базу данных как Null вместо 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,

Майк

ответ

6

Они, как вы строите свой запрос, неэффективны, трудно читаются, подвержены ошибкам и хуже всего открыты для SQL-инъекций. Вы должны использовать параметры 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)" 

Вы можете задать значения для таких параметров, как:

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

Удивительный. Отличная обратная связь. Приветствия. – 2010-01-12 21:34:00

1

Эта вещь называется DBNull.Value. Это то, что вам нужно, а не Nothing.

Чтобы проверить, является ли значение DB NULL, используйте функцию IsDBNull.

0

Использование параметризованных запросов вместо того, чтобы значения в SQL. Помимо исправления проблемы с нулями, она также защитит от 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

Самая большая вещь, которую я предлагаю, вы используете параметризованные заявление SQL, как вы открытие до себя SQL-инъекции.

например. command.CommandText = "INSERT SomeTable (SomeField) VALUES (@SomeField)";

А затем добавить именованные параметры в команде с помощью command.Parameters.Add

Для значений, которые вы хотите сохранить, как NULL, установите значение параметра в DBNull.Value.

0

Если вы действительно, действительно хотел, вы делаете запрос вы строить работу, делая что-то вроде следующего:

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

... но, пожалуйста, пожалуйста не делать что. Код является уродливым, его трудно поддерживать, и он допускает всевозможные неприятности, такие как SQL-инъекция.

Вместо этого используйте параметризованный запрос - весь процесс довольно хорошо объяснен in this MSDN article.

После первого прохода, ваш код будет выглядеть примерно так:

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

... который до сих пор не очень: длинные многострочные SQL запросы будут продолжать загромождать код.

Чтобы устранить эту проблему, переместите запрос в хранимую процедуру. Это имеет огромное преимущество в том, что вы можете составить свой SQL в редакторе, предназначенном для этой цели, вместо того, чтобы блокировать его в коде.Если вы используете недавнюю версию SQL Server Studio или, конечно же, незаменимый SQL Prompt utility, у вас даже будет хорошая поддержка Intellisense.

Хранимая процедура будет в значительной степени совпадает с вашим текущим запросом, с некоторыми дополнительными декларациями параметров:

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

Ваш окончательный код будет взгляд что-то вроде:

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

Это может показаться много изменений в работе над простой проблемой, но ваш код будет намного более безопасным, читабельным и поддерживаемым.

Смежные вопросы