【问题标题】:Invalid Cat Exception无效的猫异常
【发布时间】:2013-02-28 04:55:46
【问题描述】:

我正在尝试在输入数据后从数据库中“获取”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 未被用户代码处理;指定的演员表无效。

【问题讨论】:

  • 我想知道一只猫使它无效的原因是什么?似乎应该有一个合适的LOLcat,但我不知道。
  • 已存在具有该标题的问题
  • 围绕您的代码构建一个 try-catch-block 并查看异常对象。
  • 错误在哪一行?
  • Barmar,错误出现在 CompanyID = (int)cmd.ExecuteScalar();部分。

标签: c#


【解决方案1】:

让我印象深刻的显而易见的事情是您将邮政编码存储为整数。它们确实应该是字符串(因为前导零是有效的)。这行可能是罪魁祸首:

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;

您还有其他几行存在类似问题。

【讨论】:

  • 我改了;谢谢你的提示。我仍然遇到同样的错误。感谢您的帮助。
  • @user2117049:要考虑的另一件事是您正在执行插入操作,该操作是Nonquery 而不是Scalar。如果您切换到 cmd.ExecuteNonQuery() 可能会有所帮助。
【解决方案2】:

来自documentation for ExecuteScalar

返回值类型:System.Object 中第一行的第一列 结果集或空引用(Visual Basic 中为 Nothing),如果 结果集为空。返回最多 2033 个字符。

表格的第一列是什么? (大概是您的 CompanyId 列。)它是 uniqueId 吗?这将转换为 Guid,而不是 int。

【讨论】:

  • 查询的结尾是 SELECT SCOPE_IDENTITY(),它将是一个 int,而不是一个 GUID。
  • 很公平......但至少在 T-SQL 中,SCOPE_IDENTITY 的响应类型是 numeric(38,0),它不能转换为 int。 msdn.microsoft.com/en-us/library/ms190315.aspx
  • 斯科特,感谢您的回复。第一列是“ID”。我将其设置为 PK 和 int。
  • 那么我可以推荐的最好的方法是您只需使用var temp = cmd.ExecuteScalar(); 获取结果,在该行设置一个断点,然后查看返回的类型。在某处,某些东西不会以 int 形式出现。
  • 另外,无论您以何种方式与 SQL 交互,请确保如果您手动输入该行,您将获得预期的结果。
猜你喜欢
  • 2018-10-28
  • 2017-06-28
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多