C# varchar值的转换';5566778891';溢出了一个int列

C# varchar值的转换';5566778891';溢出了一个int列,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我使用的是SQL Server数据库,其中有一列名为Cell(VARCHAR)数据类型。使用reader.Read()读取时,我得到了转换错误。谁能解释一下错误的原因吗 这是我的代码: string myConnection = dbController.connectionString; string query1 = "SELECT ID, Name from Manager Where Cell = " + managerNo.Text; using (va

我使用的是SQL Server数据库,其中有一列名为Cell(VARCHAR)数据类型。使用
reader.Read()
读取时,我得到了转换错误。谁能解释一下错误的原因吗

这是我的代码:

string myConnection = dbController.connectionString;
        string query1 = "SELECT ID, Name from Manager Where Cell = " + managerNo.Text;
        using (var conn = new SqlConnection(myConnection))
        using (var cmd = new SqlCommand(query1, conn))
        {
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                managerID = reader.GetString(0);
                mgrID.Text = managerID;
                managerNames.Text = reader.GetString(1);
            }
            conn.Close();
        }
我正在从文本框(managerNo)读取值。我也在SQL Server Management Studio上测试了该查询:

select Name, DOB
from Contact
where Cell = 1233453411
当我使用
Cell=1233453411
而不使用值作为字符串时,我会得到转换错误,但是使用
Cell='1233453411'
作为字符串时会得到结果

原因是什么?如何解决这个问题


谢谢。

这是两种不同类型(字符串和整数)之间的比较:

where Cell = 1233453411
SQL Server必须决定使用哪种类型。它决定更严格的类型,即数字。因此,字符串被转换为一个数字

比如说,你在纽约有一部手机,号码是:917-555-5555。这变成了一个像91755555的数字,它超过了最大整数的值。因此,您将得到一个转换溢出

寓意:在进行比较时,总是使用相似的类型

编辑:

你该怎么办?不要将电话号码存储为数字;它们应该存储为字符串(例如,前导零可能很重要)


If可以做一个快速的修改,并在参数的值周围加上单引号。但是,您真正应该做的是将SQL代码更改为使用字符串类型的参数。仅将值(尤其是用户输入)填充到查询字符串中是不好的编程方式。

这是两种不同类型(字符串和整数)之间的比较:

where Cell = 1233453411
SQL Server必须决定使用哪种类型。它决定更严格的类型,即数字。因此,字符串被转换为一个数字

比如说,你在纽约有一部手机,号码是:917-555-5555。这变成了一个像91755555的数字,它超过了最大整数的值。因此,您将得到一个转换溢出

寓意:在进行比较时,总是使用相似的类型

编辑:

你该怎么办?不要将电话号码存储为数字;它们应该存储为字符串(例如,前导零可能很重要)


If可以做一个快速的修改,并在参数的值周围加上单引号。但是,您真正应该做的是将SQL代码更改为使用字符串类型的参数。仅将值(尤其是用户输入)填充到查询字符串中是不好的编程。

您的代码在SQL Server 2008 R2中运行良好。(下面是测试代码)

私有无效按钮1\u单击(对象发送者,事件参数e) {

        string str = "Server=.\\SQL2008R2;Database=Practice;User ID=sa;Password=123;Trusted_Connection=True;Connection Timeout=0";

        string query1 = "SELECT * from tblTest Where Cell = " + textBox1.Text;
        using (var conn = new SqlConnection(str))
        using (var cmd = new SqlCommand(query1, conn))
        {
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {

                string aa = reader.GetString(0);
            }
            conn.Close();
        }
否则,可以使用以下格式更改查询

string query1 = "SELECT * from tblTest Where Cell = '" + textBox1.Text + "' ";

谢谢

您的代码在SQL Server 2008 R2中运行良好(下面是经过测试的代码)

私有无效按钮1\u单击(对象发送者,事件参数e) {

        string str = "Server=.\\SQL2008R2;Database=Practice;User ID=sa;Password=123;Trusted_Connection=True;Connection Timeout=0";

        string query1 = "SELECT * from tblTest Where Cell = " + textBox1.Text;
        using (var conn = new SqlConnection(str))
        using (var cmd = new SqlCommand(query1, conn))
        {
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {

                string aa = reader.GetString(0);
            }
            conn.Close();
        }
否则,可以使用以下格式更改查询

string query1 = "SELECT * from tblTest Where Cell = '" + textBox1.Text + "' ";

谢谢

Manager.Cell的数据类型是什么?@DourHighArch-its-varchar(max)您的查询需要在
managerNo.Text
周围添加引号-就像您手动运行查询时所做的那样。但是,您的代码非常容易受到SQL注入的影响,您应该对此进行调查。-您不应该将SQL语句串联在一起-使用参数化查询来避免SQL注入管理的数据类型是什么呃,细胞?@DourHighArch它的varchar(max)您的查询需要在
managerNo.Text
周围添加引号-就像您手动运行查询时所做的那样。但是,您的代码很容易受到SQL注入的影响,您应该对此进行调查。-您不应该将SQL语句串联在一起-使用参数化查询来避免SQL注入。因此,我应该更改数据,以避免SQL注入ype为int或bigint,对吗?@EL323…不,将类型更改为字符串,因为这是存储列的方式。因此,我应该将数据类型更改为int或bigint,对吗?@EL323…不,将类型更改为字符串,因为这是存储列的方式。