Вот мой объект SQLCommand:
oCommand.CommandText =
"INSERT INTO hits (id,client_id,client_ip,page,vars) VALUES _
(@@IDENTITY,@client_id,@ip,@page,@vars)"
oCommand.Parameters.Count = 4
>> oCommand.Parameters.Item(0).ParameterName = "@client_id"
>> oCommand.Parameters.Item(0).Value = "123456"
>> oCommand.Parameters.Item(1).ParameterName = "@ip"
>> oCommand.Parameters.Item(1).Value = "127.0.0.1"
>> oCommand.Parameters.Item(2).ParameterName = "@page"
>> oCommand.Parameters.Item(2).Value = "default.aspx"
>> oCommand.Parameters.Item(3).ParameterName = "@vars"
>> oCommand.Parameters.Item(3).Value = Nothing
Это ошибка, которую я получаю:
"The parameterized query '(@ip nvarchar(9),@client_id nvarchar(4000),@page nvarchar(12),@v' expects the parameter '@client_id', which was not supplied."
А вот функции:
Public Shared Function insertIntoHitTable(ByVal oData As gsTrack) As Boolean
Dim oObj As New List(Of Object())
oObj.Add(New Object() {"@client_id", cV(oData.ClientID)})
oObj.Add(New Object() {"@ip", cV(oData.IP)})
oObj.Add(New Object() {"@page", cV(oData.Page)})
oObj.Add(New Object() {"@vars", oData.Vars})
Dim oCommand As SqlCommand = InsertIntoHitTableSQL(oObj)
oCommand.Connection.Open()
oCommand.ExecuteNonQuery()
oCommand.Connection.Close()
End Function
Public Shared Function createSQLCommand(ByVal oCmdTxt As String, ByVal oParams As List(Of Object())) As SqlCommand
Dim oCommand As SqlCommand = Nothing
Dim oBuilder As New StringBuilder
Dim oParam As SqlParameter
oCommand = New SqlCommand(oCmdTxt, New SqlConnection(csString))
Try
For i As Integer = 0 To oParams.Count - 1
oParam = New SqlParameter
oParam.ParameterName = oParams(i)(0)
oParam.Value = oParams(i)(1)
oCommand.Parameters.Add(oParam)
oParam = Nothing
Next
Return oCommand
Catch ex As Exception
Return Nothing
End Try
End Function
Любые указатели на то, как устранить эту ошибку параметризованного запроса? Благодарность!
Я должен отметить, что cV () просто функция очистки, она проверяет, не является ли переданная переменная ничем.





В функции CV вы проверяете, является ли значение нулевым? В одном из места я вижу документы, в которых нужно передать значение DBNull.value вместо null.
Я считаю, что количество параметров и индекс немного смещаются, поскольку вы указываете @@ IDENTIDY в операторе вставки. Обычно я использую следующий синтаксис при выполнении параметризованного запроса:
oCommand = New SqlCommand("INSERT INTO hits (id,client_id,client_ip,page,vars) VALUES (@@IDENTITY,@client_id,@ip,@page,@vars)", CONNECTION OBJECT)
oCommand.CommandType = CommandType.StoredProcedure
oCommand.Parameters.Add("@client_id", SqlDbType.Integer, 10)
oCommand.Parameters("@client_id").Direction = ParameterDirection.Input
oCommand.Parameters("@client_id").Value = cV(oData.ClientID)
oCommand.Parameters.Add("@ip", SqlDbType.VarChar, 15)
oCommand.Parameters("@ip").Direction = ParameterDirection.Input
oCommand.Parameters("@ip").Value = cV(oData.IP)
oCommand.Connection.Open()
oCommand.ExecuteNonQuery()
oCommand.Connection.Close()
... и вы можете увидеть, как остальные будут следовать для остальных ваших параметров.
НИКОГДА не используйте @@ identity. Если столбец является идентификатором, просто не указывайте его в списке значений. Если вы используете его где угодно, чтобы получить только что вставленное значение, используйте вместо него scope_identity (), если вам не нравятся проблемы с целостностью данных.
Я думаю, что это была комбинация ваших сообщений и сообщений Дилли, которые позаботились об этом, я создал новую функцию CV, которая возвращает DBNull.Value, если это ничего. Еще я добавил параметр direction от dillie, теперь он работает. Спасибо, парни!