我想从数据库表返回最近插入的记录的最后一列。我一直收到这个错误:
SchoolManagement.exe
中出现'System.InvalidCastException'类型的第一次机会异常其他信息:指定的演员表无效。
如果存在此异常的处理程序,则可以安全地继续该程序
代码:
public int A()
{
string _connection = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
string stmt = "SELECT TOP 1 RegistrationNumber FROM tblStudentBiodata ORDER BY RegistrationNumber DESC";
int count = 0;
using (SqlConnection thisConnection = new SqlConnection(_connection))
{
using(SqlCommand cmdCount = new SqlCommand(stmt, thisConnection))
{
thisConnection.Open();
count = (int)cmdCount.ExecuteScalar();
}
}
return count;
}
答案 0 :(得分:0)
你对int的强制转换是抛出异常:
count = (int)cmdCount.ExecuteScalar();
您的转换不安全,并且您肯定没有从ExecuteScalar方法返回一个整数。实际上,ExecuteScalar方法会将包装(装箱)的结果返回到Object
,因此请注意该对象可以包含任何类型(例如float,decimal,int等)。
还要确保您没有从空值转换,因为如果表中没有记录,则会返回该值。因此,在尝试强制转换之前,请确保在对象为null时添加一个检查。
根据我的解释,检查SQL Server中RegistrationNumber
列的类型,并确保在C#代码中强制转换为正确的类型。
以下是SQL Server和C#之间的类型映射列表:
http://msdn.microsoft.com/en-us/library/cc716729%28v=vs.110%29.aspx
答案 1 :(得分:0)
正如另一个答案中已经指出的那样,下面的行导致异常,并确保RegistrationNumber
列不是INT
类型。我怀疑它是SQL CHAR
还是VARCHAR
列。
count = (int)cmdCount.ExecuteScalar();
在这种情况下,请尝试使用AS
运算符间接投射,而不是直接投射,并将count
变量声明为nullable Int
,如
int? count = 0;
count = cmdCount.ExecuteScalar() as int?;
然后检查并使用它
if (count != null)
{
//Do something with it
}