我正在使用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'
作为字符串会获取结果。
是什么原因以及如何解决这个问题。
感谢。
答案 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 + "' ";
由于