将数据类型varchar转换为int时出错(存储过程C#ASP.NET)

时间:2014-02-03 13:46:26

标签: c# asp.net tsql .net-4.5

我是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: 

3 个答案:

答案 0 :(得分:3)

根据错误,表MBID中的列Members的类型为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()));

答案 1 :(得分:0)

UPDATE(在作者关于int太大的评论之后)。

如您所述,Int32的值太大了。如果MBID只是一个“代码”,并且您不需要该值的数字含义,那么您可以在SQL Server中使用varchar,在C#中使用字符串作为MBID的数据类型。

您的存储过程和SqlParameter创建已经使用了字符串,因此您只需要将表上的数据类型更改为varchar(20)(相应地调整大小)。

以下是修改表格的SQL:

(我相信你不会,但只是为了确保 - 在测试之前不要在生产中运行它):

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

您可以在上面的查询中添加其他关键字,使列不可为空,创建约束等。

或者,如果你想坚持使用数字类型,你可以使用十进制(它存在于SQL和C#中)。

旧回答:

错误来自您的存储过程,而不是来自.Net。

一个可能的原因:您的MBID参数是varchar(20),但Members中的MBID列是int。将参数更改为int并查看它是否解决了问题。

您还需要在C#中更改此行:

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

cmd.Parameters.Add("@MBID", SqlDbType.Int).Value = Convert.ToInt32(txtSearch.Text.Trim());

答案 2 :(得分:0)

谢谢你们的帮助。真的很感激。 我将MBID数据类型更改回varchar(20)。

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

然后对c#

中的代码进行了更改
cmd.Parameters.Add("@MBID", SqlDbType.VarChar).Value = txtSearch.Text.Trim();

得到了结果。 再一次,谢谢你。