varchar值的转换'5566778891'溢出整型列
本文关键字:溢出 整型 5566778891 varchar 转换 | 更新日期: 2023-09-27 18:15:13
我使用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。它变成了91755555555这样的数这超过了最大整数的值。因此,您将得到转换溢出。
寓意:做比较时一定要使用相似的类型。
编辑:你该怎么做?不要将电话号码存储为号码;它们应该以字符串的形式存储(例如,前导零可能很重要)。
它可以做一个简单的操作,在参数的值周围加上单引号。但是,您真正应该做的是更改SQL代码以使用字符串类型的参数。将值(特别是用户输入)直接放入查询字符串是糟糕的编程。
您的代码在SQL Server 2008 R2中工作良好。(下面是测试代码)
private void button1_Click(对象发送者,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 + "' ";
谢谢