【发布时间】:2012-10-22 14:28:19
【问题描述】:
我正在尝试运行一个存储过程,但由于某种原因它一直告诉我"Specified cast is not valid"。 “hidSelectedExpenseIDs”是一个隐藏字段,填充了一个 id 的 javascript 数组。
示例:"hidSelectedExpenseIDs.Value" 看起来像“123,124,125,126”。这就是为什么我在里面有.Split(',')。
这是我的代码:
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();
}
}
}
这是我的存储过程:
ALTER PROCEDURE dbo.[InvoiceExhists]
@ExpenseID int
AS
BEGIN
SELECT InvNumber FROM dbo.Expenses from ExpID = @ExpenseID
END
【问题讨论】:
-
听起来像
hidSelectedExpenseIDs并不总是包含您认为它包含的内容。失败时它的价值是什么? -
使用断点进行调试,看看变量费用的值是多少
-
您确定您的
hidSelectedExpenseIDs.Value末尾没有“,”吗? -
当我通过调试器运行它时,值是“295”作为字符串因此转换。它只是让我有点困惑,因为我让它在我的代码的其他部分做同样的事情并且它有效。它必须是 (bool)cmd.ExecuteScalar() 之类的 ramhound 建议
-
提示 1: 不要在循环语句中创建连接。您正在为每次迭代打开一个连接。 提示 2: 使用
using语句来处理连接和命令对象。
标签: c# sql-server tsql stored-procedures exception-handling