C# 无效的Cat异常

C# 无效的Cat异常,c#,C#,我试图在数据输入数据库后从数据库中“抓取”ID字段(PK)。获得ID后,我想将其输入到另一个表中(用于关系目的)。然而,我的尝试没有成功 这就是我目前正在做的: int CompanyID; SqlConnection con = new SqlConnection("Data Source=******;Initial Catalog= ********"); SqlCommand cmd = con.CreateCommand(); con.Open(); cmd.CommandT

我试图在数据输入数据库后从数据库中“抓取”ID字段(PK)。获得ID后,我想将其输入到另一个表中(用于关系目的)。然而,我的尝试没有成功

这就是我目前正在做的:

int CompanyID;  

SqlConnection con = new SqlConnection("Data Source=******;Initial Catalog= ********");
SqlCommand cmd = con.CreateCommand();

con.Open();

cmd.CommandText = "insert into [Company Information] (Expo_Year, Partnership, Company_Name_Pub, Address_Pub, City_Pub, State_Pub, Zip_Pub, Phone_Pub, Fax_Pub, Email_Pub, Contact_Pub, Company_Name_Ex, Address_Ex, City_Ex, State_Ex, Zip_Ex, Phone_Ex, Fax_Ex, Email_Ex, Contact_Ex) VALUES (@Year, @Partnership,@PubCompanyName,@PubAddress,@PubCity,@PubState,@PubZip,@PubPhone,@PubFax,@PubEmail,@PubContact,@ExCompanyName,@ExAddress,@ExCity,@ExState,@ExZip,@ExPhone,@ExFax,@ExEmail,@ExContact) SELECT SCOPE_IDENTITY();";

SqlParameter param = new SqlParameter();
param.ParameterName = "@PubCompanyName";
param.Value = CompanyNmTxt.Text;

cmd.Parameters.Add("@Year", System.Data.SqlDbType.VarChar, 50).Value = Year.Text;
cmd.Parameters.Add("@Partnership", System.Data.SqlDbType.VarChar, 50).Value = DropDownList1.Text;
cmd.Parameters.Add("@PubCompanyName", System.Data.SqlDbType.VarChar,50).Value = CompanyNmTxt.Text;
cmd.Parameters.Add("@PubAddress", System.Data.SqlDbType.VarChar,50).Value = CompanyAddTxt.Text;
cmd.Parameters.Add("@PubCity", System.Data.SqlDbType.VarChar,50).Value = CompanyCtyTxt.Text;
cmd.Parameters.Add("@PubState", System.Data.SqlDbType.Char,2).Value = StateDD.Text;
cmd.Parameters.Add("@PubZip", System.Data.SqlDbType.Int,8).Value = CompanyZipTxt.Text;
cmd.Parameters.Add("@PubPhone", System.Data.SqlDbType.VarChar,50).Value = CompanyPhoneTxt.Text;
cmd.Parameters.Add("@PubFax", System.Data.SqlDbType.VarChar,50).Value = CompanyFaxTxt.Text;
cmd.Parameters.Add("@PubEmail", System.Data.SqlDbType.VarChar,50).Value = CompanyEmailTxt.Text;
cmd.Parameters.Add("@PubContact", System.Data.SqlDbType.VarChar,50).Value = CompanyContactTxt.Text;

cmd.Parameters.Add("@ExCompanyName", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyNmTxt0.Text;
cmd.Parameters.Add("@ExAddress", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyAddTxt0.Text;
cmd.Parameters.Add("@ExCity", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyCtyTxt0.Text;
cmd.Parameters.Add("@ExState", System.Data.SqlDbType.Char, 2).Value = ExStateDD.Text;
cmd.Parameters.Add("@ExZip", System.Data.SqlDbType.Int, 8).Value = ExCompanyZipTxt0.Text;
cmd.Parameters.Add("@ExPhone", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyPhoneTxt0.Text;
cmd.Parameters.Add("@ExFax", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyFaxTxt0.Text;
cmd.Parameters.Add("@ExEmail", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyEmailTxt0.Text;
cmd.Parameters.Add("@ExContact", System.Data.SqlDbType.VarChar, 50).Value = ExCompanyContactTxt0.Text;

CompanyID = (int)cmd.ExecuteScalar(); 
con.Close();
我得到一个错误:

用户代码未处理InvalidCastException;指定的强制转换无效


对我来说最明显的是你把邮政编码存储为整数。它们实际上应该是字符串(因为前导零是有效的)。这条线可能是罪魁祸首:

cmd.Parameters.Add("@PubZip", System.Data.SqlDbType.Int,8).Value = CompanyZipTxt.Text;
您可能想尝试以下内容:

int companyZip;
Int32.TryParse(CompanyZipTxt.Text, out companyZip);

cmd.Parameters.Add("@PubZip", System.Data.SqlDbType.Int, 8).Value = companyZip;
您还有几行类似的问题。

来自:

返回值类型:System.Object中第一行的第一列 如果 结果集为空。返回最多2033个字符


你表格的第一列是什么?(大概是你的公司ID栏)它是唯一的ID吗?这将强制转换为Guid,而不是int。

我想知道,猫有什么原因使它无效?似乎应该有一个合适的LOLcat来解决这个问题,但我不知道。一个标题为的问题已经存在了围绕代码构建一个try-catch块并查看exception-object。错误在哪一行?Barmar,错误在CompanyID=(int)cmd.ExecuteScalar()上;部分。查询的结尾是
SELECT SCOPE\u IDENTITY()
,它将是一个int,而不是一个GUID。很公平。。。但至少在T-SQL中,SCOPE_标识的响应类型是numeric(38,0),这不能转换为int.Scott,感谢您的回复。第一列是“ID”。我已经将其设置为PK和int。然后我可以推荐的最好方法是使用
var temp=cmd.ExecuteScalar()获取结果,在该行上设置断点,然后查看返回的类型。在某些地方,有些东西没有显示为int。此外,无论您以何种方式与SQL交互,请确保如果您手动输入行,您将得到预期的结果;谢谢你的提示。不过我还是犯了同样的错误。谢谢你的帮助。@ USE2117049:另一个需要考虑的是,你正在执行一个插入操作,它是一个<代码>非查询< /代码>,而不是<代码>标量< /代码>。如果切换到
cmd.ExecuteNonQuery()
,可能会有所帮助。