Ошибка преобразования типа данных varchar в int (хранимая процедура С# ASP.NET)

Вопрос: Я новичок в С#, и я работаю над проектом, где вы вызываете хранимые процедуры из базы данных sql в asp.net С#. В моей таблице "ID" использует тип данных varchar. когда когда-либо я набираю ID в текстовом поле и нажимаю кнопку поиска, он генерирует ошибку System.Data.SqlClient.SqlException: ошибка преобразования типа данных varchar в int. * Я

Вопрос:

Я новичок в С#, и я работаю над проектом, где вы вызываете хранимые процедуры из базы данных sql в asp.net С#. В моей таблице “ID” использует тип данных varchar. когда когда-либо я набираю ID в текстовом поле и нажимаю кнопку поиска, он генерирует ошибку

  • System.Data.SqlClient.SqlException: ошибка преобразования типа данных varchar в int. *

Я прошел код снова и снова, но я не вижу ошибки. Любезно помочь. Спасибо.

MYCODE

string connString2 = «Data Source=EFTSRV4;Initial Catalog=PaySwitch;Integrated Security=True»; SqlConnection con = new SqlConnection(connString2); con.Open(); SqlCommand cmd = new SqlCommand(«GetMemberDetailsByID», con); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = «GetMemberDetailsByID»; SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = cmd; DataSet ds = new DataSet(); cmd.Parameters.Add(«@MBID», SqlDbType.VarChar).Value = (txtSearch.Text.Trim()); cmd.ExecuteNonQuery(); cmd.Connection = con; //da.Fill(ds, «Members»); //(SqlDbType.Int).Parse(da.RowUpdated[0][«@MBID»]); // Mobileno = Convert.ToInt32(txmobileno.Text); //cmd.Parameters.Add(«@MBID», SqlDbType.Int).Value = (txtSearch.Text.Trim()); try { dg_Data.EmptyDataText = «No Records Found»; dg_Data.DataSource = cmd.ExecuteReader(); dg_Data.DataBind(); } catch (Exception ex) { throw ex; } finally { con.Close(); con.Dispose(); }

MYSTOREDPROCEDURE

USE [PaySwitch] GO /****** Object: StoredProcedure [dbo].[GetMemberDetailsByID] Script Date: 03/02/2014 15:19:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[GetMemberDetailsByID] ( @MBID VARCHAR (20) ) AS BEGIN SELECT MBCompanyName, MBContactAddress1, MBContactCity,MBContactCountry, MBContactPostCode, MBContactPhone,MBContactEmailAdmin,MInstitutions FROM [dbo].[Members] WHERE MBID=@MBID END

MYERROR

Exception Details: System.Data.SqlClient.SqlException: Error converting data type varchar to int. Source Error: Line 38: DataSet ds = new DataSet(); Line 39: cmd.Parameters.Add(«@MBID», SqlDbType.VarChar).Value = (txtSearch.Text.Trim()); Line 40: cmd.ExecuteNonQuery(); Line 41: cmd.Connection = con; Line 42: Лучший ответ:

Из ошибки видно, что ваш MBID столбца в вашей таблице Members имеет тип int и вы пытаетесь сравнить его с VARCHAR. Измените хранимую процедуру для получения параметра типа int вместо VARCHAR например:

ALTER PROCEDURE [dbo].[GetMemberDetailsByID] ( @MBID INT (20) —HERE it should be INT )

и для отправки параметров через С# используйте метод AddWithValue, например:

cmd.Parameters.AddWithValue(«@MBID», int.Parse(txtSearch.Text.Trim())); Ответ №1

UPDATE (после комментария автора о том, что int слишком велико).

Как вы отметили, значение слишком велико для Int32. Если MBID – это всего лишь “код”, и вам не нужно числовое значение значения, вы можете использовать varchar в SQL Server и строку на С# в качестве типа данных для MBID.

Ваша хранимая процедура и создание SqlParameter уже используют строки, поэтому вам просто нужно изменить тип данных в таблице на varchar (20) (соответственно отрегулируйте размер).

Вот SQL, чтобы внести изменения в таблицу:

(Я уверен, что вы этого не сделаете, но просто для того, чтобы убедиться – не запускайте его в производстве до тестирования где-то еще):

alter table dbo.Members alter column MBID varchar(20)

вы можете добавить другие ключевые слова в запрос выше, чтобы сделать столбец недействительным, создать ограничения и т.д.

Кроме того, если вы хотите придерживаться числового типа, вы можете использовать десятичную (она существует как в SQL, так и в С#).

Старый ответ:

Ошибка исходит из хранимой процедуры, а не из.Net.

Одна из возможных причин: ваш MBID-параметр – varchar (20), но столбец MBID в членах – int. Измените параметр int и посмотрите, исправляет ли он проблему.

Вам также потребуется изменить эту строку в С#:

cmd.Parameters.Add(«@MBID», SqlDbType.VarChar).Value = (txtSearch.Text.Trim());

в

cmd.Parameters.Add(«@MBID», SqlDbType.Int).Value = Convert.ToInt32(txtSearch.Text.Trim()); Ответ №2

Спасибо, ребята, за вашу помощь. по-настоящему ценится. Я изменил тип данных MBID на varchar (20).

ALTER PROCEDURE [dbo].[GetMemberDetailsByID] ( @MBID VARCHAR (20) )

Затем внесены изменения в код в С#

cmd.Parameters.Add(«@MBID», SqlDbType.VarChar).Value = txtSearch.Text.Trim();

И получил результаты. Еще раз спасибо.

Оцените статью
Добавить комментарий