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

时间:2016-10-26 23:20:41

标签: 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 (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'作为字符串会获取结果。

是什么原因以及如何解决这个问题。

感谢。

2 个答案:

答案 0 :(得分:3)

这是两种不同类型的比较,字符串和整数:

where Cell = 1233453411

SQL Server必须决定使用哪种类型。它决定了更具限制性的类型,即数字。因此,字符串将转换为数字。

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

道德:在进行比较时总是使用相似的类型。

编辑:

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

如果可以做一个快速和脏,并在参数的值周围放单引号。但是,你应该真正做的是改变你的SQL代码以使用带有字符串类型的参数。将值(特别是用户输入)填充到查询字符串中是不好的编程。

答案 1 :(得分:0)

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

private void button1_Click(object sender,EventArgs 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 + "' ";

由于