Я новичок в С#, и я работаю над проектом, где вы вызываете хранимые процедуры из базы данных 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()));
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());
Спасибо, ребята, за вашу помощь. по-настоящему ценится. Я изменил тип данных MBID на varchar (20).
ALTER PROCEDURE [dbo].[GetMemberDetailsByID] (
@MBID VARCHAR (20)
)
Затем внесены изменения в код в С#
cmd.Parameters.Add("@MBID", SqlDbType.VarChar).Value = txtSearch.Text.Trim();
И получил результаты. Еще раз спасибо.