2013-02-27 3 views
0

Я пытаюсь «захватить» поле идентификатора (PK) из базы данных после ввода данных в нее. Как только я получу идентификатор, я хочу ввести его в другую таблицу (для отношений). Однако мои попытки не увенчались успехом.Invalid Cat Exception

Это то, что я сейчас делаю:

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

+0

вопрос с этим названием уже существует –

+0

Создайте блок try-catch вокруг вашего кода и взгляните на объект exception. – Tomtom

ответ

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

Я изменил это; спасибо за этот совет. Я все равно получаю ту же ошибку. Спасибо за вашу помощь. –

+0

@ user2117049: Еще одна вещь, которую следует учитывать, заключается в том, что вы выполняете операцию вставки, которая представляет собой «Нестандартный», а не «Скаляр». Может быть полезно, если вы переключитесь на 'cmd.ExecuteNonQuery()'. –

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.) Является ли он уникальным? Это было бы брошено в Guid, а не в int.

+0

Конец запроса: 'SELECT SCOPE_IDENTITY()', который будет int, а не GUID. – Servy

+0

Достаточно справедливо ... но, по крайней мере, в T-SQL, тип ответа SCOPE_IDENTITY является числовым (38,0), который не может быть привязан к int. http://msdn.microsoft.com/en-us/library/ms190315.aspx –

+0

Скотт, спасибо за ответ. Первый столбец - «ID». Я устанавливаю его как PK и int. –

Смежные вопросы