我是C#中的新手,我正在从事一个项目,您可以从ASP.NET C#中的SQL数据库中调用存储过程。在我的表中," 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:
来自错误的错误,表格Members
中的列MBID
是类型int
,您正在尝试将其与VARCHAR
进行比较。修改您的存储过程以接收int
类型的参数,而不是VARCHAR
,例如:
ALTER PROCEDURE [dbo].[GetMemberDetailsByID] (
@MBID INT (20) --HERE it should be INT
)
并且用于通过C#发送参数,请使用addWithValue方法:
cmd.Parameters.AddWithValue("@MBID", int.Parse(txtSearch.Text.Trim()));
更新(作者对int太大的评论之后)。
正如您指出的,对于INT32而言,该值太大。如果MBID只是一个"代码",而您不需要该值的数值含义,那么您可以在SQL Server中使用VARCHAR和C#中的字符串作为MBID的数据类型。
您的存储过程和SQLParameter创建已经使用字符串,因此您只需要更改表上的数据类型即可为VARCHAR(20)(相应地调整大小)。
这是修改您的表的SQL:
(我确定您不会,但只是为了确保 - 在测试其他地方之前不要在生产中运行它):
alter table dbo.Members alter column MBID varchar(20)
您可以在上面的查询中添加其他关键字,以使列不可nullable,创建约束等。
另外,如果要坚持使用数字类型,则可以使用小数(它都存在于SQL和C#中)。
旧答案:
错误来自您存储的过程,而不是来自.NET。
一个可能的原因是:您的MBID参数为Varchar(20),但成员中的MBID列为INT。将参数更改为int,看看是否解决了问题。
您还需要在C#中更改此行:
cmd.Parameters.Add("@MBID", SqlDbType.VarChar).Value = (txtSearch.Text.Trim());
to
cmd.Parameters.Add("@MBID", SqlDbType.Int).Value = Convert.ToInt32(txtSearch.Text.Trim());
谢谢大家的帮助。真正感谢。我将MBID数据类型更改为Varchar(20)。
ALTER PROCEDURE [dbo].[GetMemberDetailsByID] (
@MBID VARCHAR (20)
)
然后对C#
中的代码进行了更改cmd.Parameters.Add("@MBID", SqlDbType.VarChar).Value = txtSearch.Text.Trim();
并得到结果。再次感谢您。