PeterErhard
asked on
Annoying error with Stored Procedure
Below is the code I'm using but on this line:
txt_Name.Text = cmd.Parameters("@Name").Va
I'm getting the following error 'Cast from type 'DBNULL' to type 'String' is not valid'. I know the Name field isn't NULL. What am I doing wrong?
**************************
Try
cnn.open
Dim cmd As SqlCommand = cnn.CreateCommand
cmd.CommandType = CommandType.StoredProcedur
cmd.CommandText = "procLoadNames"
'Input Parameter
cmd.Parameters.Add(New SqlParameter("@NameIDAuto"
cmd.Parameters("@ReferralS
'Output Parameters
cmd.Parameters.Add(New SqlParameter("@Name", SqlDbType.VarChar, 100))
cmd.Parameters("@Name").Di
cmd.Parameters.Add(New SqlParameter("@Address", SqlDbType.VarChar, 35))
cmd.Parameters("@Address")
cmd.Parameters.Add(New SqlParameter("@City", SqlDbType.VarChar, 35))
cmd.Parameters("@City").Di
cmd.Parameters.Add(New SqlParameter("@Phone", SqlDbType.VarChar, 30))
cmd.Parameters("@Phone").D
cmd.Parameters.Add(New SqlParameter("@EMail", SqlDbType.VarChar, 60))
cmd.Parameters("@EMail").D
cmd.Parameters.Add(New SqlParameter("@ContactPers
cmd.Parameters("@ContactPe
cmd.Parameters.Add(New SqlParameter("@Description
cmd.Parameters("@Descripti
GroupBox_Details.Enabled = True
cmd.ExecuteNonQuery()
txt_Name.Text = cmd.Parameters("@Name").Va
txt_Address.Text = cmd.Parameters("@Address")
txt_City.Text = cmd.Parameters("@City").Va
txt_Phone.Text = cmd.Parameters("@Phone").V
txt_Email.Text = cmd.Parameters("@EMail").V
txt_ContactPerson.Text = cmd.Parameters("@ContactPe
txt_OrganisationNotes.Text
Grid_SearchResult.Visible = False
Catch ex As Exception
MessageBox.Show("ERROR" & ex.ToString)
Finally
cnn.Close()
End Try
**************************
ASKER
No such luck - same error :(
Breakpoint on that line, debug, step and see if it is indeed not DbNull.
BTW. Don't you think there's something wrong here?
'Input Parameter
cmd.Parameters.Add(New SqlParameter("@NameIDAuto" , SqlDbType.Int))
cmd.Parameters("@ReferralS erviceProv iderIDAuto ").Value = m_NameIDAuto
Have fun...
BTW. Don't you think there's something wrong here?
'Input Parameter
cmd.Parameters.Add(New SqlParameter("@NameIDAuto"
cmd.Parameters("@ReferralS
Have fun...
Can u post the stored proc. Probably there is a mistake in declaring "@Name" in the stored proc. Also do test at runtime whether the stored proc is returning any value.
Apart from that the syntax looks fine.
Apart from that the syntax looks fine.
Hi PeterErhard,
Yea, look to see how you defined the @name parameter when you created it in VB... make sure you've defined it as Output or InputOutput... then, make sure that in your proc, you've got the parameter defined with the word Output after it (assuming SQL Server here). Then, make sure that you are SETting the value of the parameter in your proc, and not within a block of code that only executes conditionally... (cover all of your possible conditions to always set it as something). Finally, if you want to avoid the error, you can always do the assignment by appending an empty string to the end, which will prevent the Null error...
txt_Name.Text = cmd.Parameters("@Name").Va lue & ""
Cheers!
Yea, look to see how you defined the @name parameter when you created it in VB... make sure you've defined it as Output or InputOutput... then, make sure that in your proc, you've got the parameter defined with the word Output after it (assuming SQL Server here). Then, make sure that you are SETting the value of the parameter in your proc, and not within a block of code that only executes conditionally... (cover all of your possible conditions to always set it as something). Finally, if you want to avoid the error, you can always do the assignment by appending an empty string to the end, which will prevent the Null error...
txt_Name.Text = cmd.Parameters("@Name").Va
Cheers!
ASKER
Thanks for all your responses! Here's my re-done stored procedure and function but I'm still getting the same error. I know the Stored Procedure should be returning a value
**********************
Private m_ReferralServiceProviderI DAuto As Integer
Private Function LoadReferralServiceProvide r()
Try
'Check the status of the connection
CheckConnectionStatus()
Dim cmd As SqlCommand = cnn.CreateCommand
cmd.CommandType = CommandType.StoredProcedur e
cmd.CommandText = "procLoadReferralServicePr ovider"
'Input Parameter
cmd.Parameters.Add(New SqlParameter("@ReferralSer viceProvid erIDAuto", SqlDbType.Int))
cmd.Parameters("@ReferralS erviceProv iderIDAuto ").Value = m_ReferralServiceProviderI DAuto
'Output Parameters
cmd.Parameters.Add(New SqlParameter("@ProviderNam e", SqlDbType.VarChar, 100))
cmd.Parameters("@ProviderN ame").Dire ction = ParameterDirection.Output
cmd.Parameters.Add(New SqlParameter("@Address", SqlDbType.VarChar, 35))
cmd.Parameters("@Address") .Direction = ParameterDirection.Output
cmd.Parameters.Add(New SqlParameter("@City", SqlDbType.VarChar, 35))
cmd.Parameters("@City").Di rection = ParameterDirection.Output
cmd.Parameters.Add(New SqlParameter("@Phone", SqlDbType.VarChar, 30))
cmd.Parameters("@Phone").D irection = ParameterDirection.Output
cmd.Parameters.Add(New SqlParameter("@EMail", SqlDbType.VarChar, 60))
cmd.Parameters("@EMail").D irection = ParameterDirection.Output
cmd.Parameters.Add(New SqlParameter("@ContactPers on", SqlDbType.VarChar, 35))
cmd.Parameters("@ContactPe rson").Dir ection = ParameterDirection.Output
cmd.Parameters.Add(New SqlParameter("@Description ", SqlDbType.VarChar, 6000))
cmd.Parameters("@Descripti on").Direc tion = ParameterDirection.Output
GroupBox_Details.Enabled = True
cmd.ExecuteNonQuery()
txt_Name.Text = cmd.Parameters("@ProviderN ame").Valu e
txt_Address.Text = cmd.Parameters("@Address") .Value
txt_City.Text = cmd.Parameters("@City").Va lue
txt_Phone.Text = cmd.Parameters("@Phone").V alue
txt_Email.Text = cmd.Parameters("@EMail").V alue
txt_ContactPerson.Text = cmd.Parameters("@ContactPe rson").Val ue
txt_OrganisationNotes.Text = cmd.Parameters("@Descripti on").Value
Grid_SearchResult.Visible = False
Catch ex As Exception
MessageBox.Show("ERROR" & ex.ToString)
Finally
cnn.Close()
End Try
End Function
************************** ********** *****
CREATE PROCEDURE procLoadReferralServicePro vider
@ReferralServiceProviderID Auto int,
@ProviderName varchar(100) OUTPUT,
@Address varchar(35) OUTPUT,
@City varchar(35) OUTPUT,
@Phone varchar(30) OUTPUT,
@EMail varchar(60) OUTPUT,
@ContactPerson varchar(35) OUTPUT,
@Description varchar(6000) OUTPUT
AS
select @ProviderName, @Address, @City, @Phone, @EMail, @ContactPerson, @Description
from ReferralServiceProvider
where ReferralServiceProviderIDA uto = @ReferralServiceProviderID Auto
GO
************************** *********
**********************
Private m_ReferralServiceProviderI
Private Function LoadReferralServiceProvide
Try
'Check the status of the connection
CheckConnectionStatus()
Dim cmd As SqlCommand = cnn.CreateCommand
cmd.CommandType = CommandType.StoredProcedur
cmd.CommandText = "procLoadReferralServicePr
'Input Parameter
cmd.Parameters.Add(New SqlParameter("@ReferralSer
cmd.Parameters("@ReferralS
'Output Parameters
cmd.Parameters.Add(New SqlParameter("@ProviderNam
cmd.Parameters("@ProviderN
cmd.Parameters.Add(New SqlParameter("@Address", SqlDbType.VarChar, 35))
cmd.Parameters("@Address")
cmd.Parameters.Add(New SqlParameter("@City", SqlDbType.VarChar, 35))
cmd.Parameters("@City").Di
cmd.Parameters.Add(New SqlParameter("@Phone", SqlDbType.VarChar, 30))
cmd.Parameters("@Phone").D
cmd.Parameters.Add(New SqlParameter("@EMail", SqlDbType.VarChar, 60))
cmd.Parameters("@EMail").D
cmd.Parameters.Add(New SqlParameter("@ContactPers
cmd.Parameters("@ContactPe
cmd.Parameters.Add(New SqlParameter("@Description
cmd.Parameters("@Descripti
GroupBox_Details.Enabled = True
cmd.ExecuteNonQuery()
txt_Name.Text = cmd.Parameters("@ProviderN
txt_Address.Text = cmd.Parameters("@Address")
txt_City.Text = cmd.Parameters("@City").Va
txt_Phone.Text = cmd.Parameters("@Phone").V
txt_Email.Text = cmd.Parameters("@EMail").V
txt_ContactPerson.Text = cmd.Parameters("@ContactPe
txt_OrganisationNotes.Text
Grid_SearchResult.Visible = False
Catch ex As Exception
MessageBox.Show("ERROR" & ex.ToString)
Finally
cnn.Close()
End Try
End Function
**************************
CREATE PROCEDURE procLoadReferralServicePro
@ReferralServiceProviderID
@ProviderName varchar(100) OUTPUT,
@Address varchar(35) OUTPUT,
@City varchar(35) OUTPUT,
@Phone varchar(30) OUTPUT,
@EMail varchar(60) OUTPUT,
@ContactPerson varchar(35) OUTPUT,
@Description varchar(6000) OUTPUT
AS
select @ProviderName, @Address, @City, @Phone, @EMail, @ContactPerson, @Description
from ReferralServiceProvider
where ReferralServiceProviderIDA
GO
**************************
Your problem is that you're not really selecting columns from the database... you're only selecting the parameters... you need to change that to this:
select @ProviderName = ProviderName,
@Address = ReferralServiceProvider.Ad dress,
@City = ReferralServiceProvider.Ci ty,
@Phone = ReferralServiceProvider.Ph one,
@EMail = ReferralServiceProvider.EM ail,
@ContactPerson = ReferralServiceProvider.Co ntactPerso n,
@Description = ReferralServiceProvider.De scription
from ReferralServiceProvider
where ReferralServiceProviderIDA uto = @ReferralServiceProviderID Auto
Still, this is really dicey on a couple of scores... what happens if no record matches the @ReferralServiceProviderID Auto... what will be in the parameters? Also, what if a record is found, but has a null value in one of the columns? It's always best to pre-initialize the result values to something not null, but which will indicate an error:
set @ProviderName = '?'
set @Address = '?'
set @Phone = '?'
set @EMail = '?'
set @ContactPerson = '?'
set @Description = '?'
select @ProviderName = ProviderName,
@Address = ReferralServiceProvider.Ad dress,
@City = ReferralServiceProvider.Ci ty,
@Phone = ReferralServiceProvider.Ph one,
@EMail = ReferralServiceProvider.EM ail,
@ContactPerson = ReferralServiceProvider.Co ntactPerso n,
@Description = ReferralServiceProvider.De scription
from ReferralServiceProvider
where ReferralServiceProviderIDA uto = @ReferralServiceProviderID Auto
This ensures that no matter what, y ou will have a non null value in your output parameter
select @ProviderName = ProviderName,
@Address = ReferralServiceProvider.Ad
@City = ReferralServiceProvider.Ci
@Phone = ReferralServiceProvider.Ph
@EMail = ReferralServiceProvider.EM
@ContactPerson = ReferralServiceProvider.Co
@Description = ReferralServiceProvider.De
from ReferralServiceProvider
where ReferralServiceProviderIDA
Still, this is really dicey on a couple of scores... what happens if no record matches the @ReferralServiceProviderID
set @ProviderName = '?'
set @Address = '?'
set @Phone = '?'
set @EMail = '?'
set @ContactPerson = '?'
set @Description = '?'
select @ProviderName = ProviderName,
@Address = ReferralServiceProvider.Ad
@City = ReferralServiceProvider.Ci
@Phone = ReferralServiceProvider.Ph
@EMail = ReferralServiceProvider.EM
@ContactPerson = ReferralServiceProvider.Co
@Description = ReferralServiceProvider.De
from ReferralServiceProvider
where ReferralServiceProviderIDA
This ensures that no matter what, y ou will have a non null value in your output parameter
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
yep, I'd have to agree with etmendez, that's the way I'd do it.
ASKER
Thanks etmendz - all works except for one little thing:
Finally
reader.Close()
cnn.Close()
End Try
When I have reader.close() inside the FInally statement it says "name 'reader' is not declared"
Finally
reader.Close()
cnn.Close()
End Try
When I have reader.close() inside the FInally statement it says "name 'reader' is not declared"
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks for all your help guys :)
Try changing the parameter Name to sName
Dave