Reputation: 4158
I am trying to run a stored procedure and for some reason it keeps telling me "Specified cast is not valid"
. the "hidSelectedExpenseIDs
" is a hidden field that gets populated with a javascript array of id's.
Example: the "hidSelectedExpenseIDs.Value"
would look like "123,124,125,126". Hence why I have the .Split(',')
in there.
Here is my code:
public void hasExhistingExpenseInvoice()
{
string[] Expenses = hidSelectedExpenseIDs.Value.Split(',');
//check if there is an existing invoice. Then report back to the user so the
//user knows if he/she has to check overwrite option.
bool invoiceExists = false;
foreach (var expense in Expenses)
{
var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["OSCIDConnectionString"].ToString());
var command = new SqlCommand("p_CaseFiles_Expenses_InvoiceExhists", connection);
command.Parameters.Add(new SqlParameter("@ExpenseID", SqlDbType.Int));
command.Parameters["@ExpenseID"].Value = Convert.ToInt32(expense);
command.CommandType = CommandType.StoredProcedure;
try
{
connection.Open();
invoiceExists = (bool)command.ExecuteScalar();
if (invoiceExists)
{
//previous invoice exhists
Warning1.Visible = true;
Warning1.Text = "There is an exhisting Invoice.";
}
}
catch (SqlException sql)
{
lblStatus.Text = "Couldn't connect to the Database - Error";
lblStatus.ForeColor = System.Drawing.Color.Red;
}
catch (Exception ex)//catches exception here
{
lblStatus.Text = "An error occured";
lblStatus.ForeColor = System.Drawing.Color.Red;
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
}
}
}
this is my stored procedure:
ALTER PROCEDURE dbo.[InvoiceExhists]
@ExpenseID int
AS
BEGIN
SELECT InvNumber FROM dbo.Expenses from ExpID = @ExpenseID
END
Upvotes: 2
Views: 1535
Reputation: 4897
The logic is faulty.
Your Query returns a number, and you are trying to cast it directly to a Boolean, this can't be done in C#.
Some languages will interpret any non-zero as true, it is not the case for C# and it will throw an exception.
You will need to compare the returned value.
In this case, you should just check if there is a value, because NULL will be returned if the invoice does not exist.
This would look like this :
invoiceExists = command.ExecuteScalar() != null ;
Also I recommend reading this thread and consider using UDF instead of scalar Stored Procedures.
Upvotes: 4
Reputation: 2399
change your stored procedure .This fits your requirement
ALTER PROCEDURE [dbo].[InvoiceExhists]
@ExpenseID int
AS
BEGIN
if exists(select * Expenses where ExpID = @ExpenseID)
select 1
else
select 0
END
Upvotes: 2
Reputation: 2551
The exception is likely caused by invoiceExists = (bool)command.ExecuteScalar();
considering its the only casting that happens within the try statement. You need to look at the return result of ExecuteScalar()
to solve your problem.
Upvotes: 1