2013-02-27 105 views
0

我試圖在數據輸入到數據庫後'抓取'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 was unhandeled by user code; Specified cast is not valid.

+12

什麼是一隻貓,使它無效我想知道?似乎應該有一個合適的LOLcat,但我知道沒有。 – Servy 2013-02-27 20:37:49

+0

帶有該標題的問題已經存在 – 2013-02-27 20:40:44

+0

圍繞代碼構建try-catch-block並查看異常對象。 – Tomtom 2013-02-27 20:41:01

回答

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; 

你也有一對夫婦的其他線路有類似的問題。

+0

我改變了;感謝您的提示。儘管如此,我仍然遇到同樣的錯誤。謝謝你的幫助。 – 2013-02-28 18:29:17

+0

@ user2117049:另一個要考慮的問題是你正在執行一個插入操作,它是一個'Nonquery'而不是'Scalar'。如果切換到'cmd.ExecuteNonQuery()',可能會有所幫助。 – 2013-02-28 18:33:56

0

documentation for ExecuteScalar

Return Value Type: System.Object The first column of the first row in the result set, or a null reference (Nothing in Visual Basic) if the result set is empty. Returns a maximum of 2033 characters.

是什麼在你的表的第一列? (據推測,這是你的CompanyId專欄。)它是一個uniqueId嗎?那會投給一個Guid,而不是一個整數。

+0

查詢的結尾是'SELECT SCOPE_IDENTITY()',它將是一個int,而不是一個GUID。 – Servy 2013-02-27 20:57:14

+0

足夠公平......但至少在T-SQL中,SCOPE_IDENTITY的響應類型是數字(38,0),不會將其轉換爲int。 http://msdn.microsoft.com/en-us/library/ms190315.aspx – 2013-02-27 21:07:47

+0

斯科特,感謝您的答覆。第一列是「ID」。我把它設置爲PK和int。 – 2013-02-27 21:10:10