Параметризованные процедуры магазина в VB.net - PullRequest
0 голосов
/ 25 мая 2011

Я получаю сообщение об ошибке при выполнении команды insertcom, сообщающей, что мне не хватает параметров для хранимой процедуры. Нужно ли указывать имена параметров в операторе 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 & 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

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Убедитесь, что каждое значение параметра, которое вы устанавливаете, не равно Nothing. Параметры без значения могут вызвать ошибку отсутствующего параметра. Существует версия If () с двумя аргументами, которая помогает:

insertcommand.Parameters.AddWithValue("@Specification", If(repair.Specification, ""))

это вернет repair.Specification, если это не Nothing, и "" в противном случае.

также вам следует рассмотреть возможность использования Parameters.Add (). Value () вместо .AddWithValue (), например:

insertcommand.Parameters.Add("@ClubType", SqlDbType.VarChar, 50).Value = If(repair.TypeOfClub, "")

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

1 голос
/ 25 мая 2011

Попробуйте установить тип команды sqlcommand для хранимой процедуры.

0 голосов
/ 25 мая 2011

убедитесь, что учитываете чувствительность к регистру, например

    insertcommand.Parameters.AddWithValue("@GripType", repair.TypeOfGrip)

неправильно

     insertcommand.Parameters.AddWithValue("@Griptype", repair.TypeOfGrip)

верно

...