#sql #vb.net #stored-procedures #ado.net #parameters
#sql #vb.net #хранимые процедуры #ado.net #параметры
Вопрос:
Я получаю сообщение об ошибке при выполнении ‘insertcommand’, сообщающее мне, что мне не хватает параметров для хранимой процедуры. Нужно ли мне помещать имена параметров в инструкцию Sql после процедуры, как если бы я вызывал ее в SQL? Я видел онлайн-пример, в котором просто добавлены параметры, подобные приведенным здесь, но это не работает? Я также поместил состояние sql для хранимой процедуры под ‘AddRepair Sub’
Public Shared Sub AddRepair(ByVal repair As ClubRepair)
Dim conn As SqlConnection = ClubRentalsDB.getconnection
Dim insertcommand As New SqlCommand("AddRepair", conn)
insertcommand.Parameters.AddWithValue("@Name", repair.Name)
insertcommand.Parameters.AddWithValue("@ID", repair.MemberID)
insertcommand.Parameters.AddWithValue("@Phone", repair.PhoneNumber)
insertcommand.Parameters.AddWithValue("@Email", repair.Email)
insertcommand.Parameters.AddWithValue("@Work", repair.WorkToBeDone)
insertcommand.Parameters.AddWithValue("@Specification", repair.Specification)
insertcommand.Parameters.AddWithValue("@SoonestDate", repair.SoonestCompletion)
insertcommand.Parameters.AddWithValue("@PromisedDate", repair.DatePromised)
insertcommand.Parameters.AddWithValue("@ClubType", repair.TypeOfClub)
insertcommand.Parameters.AddWithValue("@GripType", repair.TypeOfGrip)
insertcommand.Parameters.AddWithValue("@NumOfClubs", repair.NumOfClubs)
insertcommand.Parameters.AddWithValue("@SpecialInstructions", repair.SpecialInstructions)
Try
conn.Open()
insertcommand.ExecuteReader()
Catch ex As Exception
MessageBox.Show(messageBad amp; ex.ToString)
Finally
conn.Close()
End Try
End Sub
USE [ClubRentals]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[AddRepair] (@Name Varchar(50), @ID varchar(20),
@Phone varchar(50),@Email varchar(50), @Work varchar(20),@Specification varchar(MAX),
@SoonestDate date, @PromisedDate Date, @ClubType varchar(50), @Griptype varchar(50),
@NumOfClubs int, @SpecialInstructions varchar(MAX)) as
Insert into ClubRepair(Member_Name,Member_ID,Phone,Email,WorkToBeDone,Specification,
SoonestPossibleCompletion,DatePromised,TypeOfClub, TypeOfGrips ,NumOfClubs,
SpecialInstructions)
values(@Name, @ID, @Phone, @Email, @Work, @Specification,
@SoonestDate, @PromisedDate, @ClubType, @GripType,
@NumOfClubs,@SpecialInstructions)
GO
Ответ №1:
Убедитесь, что каждое значение параметра, которое вы устанавливаете, не равно нулю. Параметры, не имеющие значения, могут вызвать ошибку «Отсутствует параметр». Существует версия If() с двумя аргументами, которая помогает:
insertcommand.Parameters.AddWithValue("@Specification", If(repair.Specification, ""))
это вернет восстановление.Спецификация, если это не ничто, и «» в противном случае.
кроме того, вам следует рассмотреть возможность использования Parameters.Add().Value() вместо .AddWithValue() , вот так:
insertcommand.Parameters.Add("@ClubType", SqlDbType.VarChar, 50).Value = If(repair.TypeOfClub, "")
Это действительно полезно, когда вы работаете с типами, отличными от string.
Комментарии:
1. Джефф Полсен благодарит. Однако я использовал окно locals во время отладки, чтобы убедиться, что свойства имеют значение. В чем разница между .add и .addwithvalue?
2. .add позволяет указать sql-тип параметра и его длину.
3. Нужно ли мне указывать длину и тип, даже если они уже определены в хранимой процедуре?
4. ДА. Это ХОРОШАЯ вещь. Две причины — во-первых, .AddWithValue всегда передает строки как NVARCHAR вместо VARCHAR , что может привести к проблемам с преобразованием в Юникод в будущем. Во-вторых, .AddWithValue использует длину входной строки в качестве длины параметра, а не ту, что указана в сохраненной процедуре — это почти всегда предотвращает повторное использование плана выполнения запроса.
Ответ №2:
Попробуйте установить для sqlcommand commandtype значение storedprocedure.
Ответ №3:
убедитесь, что учитывается регистр, например
insertcommand.Parameters.AddWithValue("@GripType", repair.TypeOfGrip)
неверно
insertcommand.Parameters.AddWithValue("@Griptype", repair.TypeOfGrip)
правильно
Комментарии:
1. Фреду, я ценю твой вклад. Но VB не является языком, чувствительным к регистру,
2. @Мэтт Стюарт, да, но SQL server может быть, в зависимости от конфигурации базы данных
3. Извините, я понимаю, о чем вы говорите. Эта конфигурация SQL также не является.