[英]ASP.NET SqlDataReader Incorrect syntax near
我有一个ASP.NET页面,该页面已经工作了很长时间,直到最近。 该页面包含一个文本框( TextBox1
)和一个提交按钮。 当您在字段中输入(或扫描)数字并提交时,如果该记录存在于数据库中并且之前从未提交过,它将在另一列中添加日期/时间戳,并向用户提供已记录该记录的反馈。 如果该记录存在并且已经具有日期/时间戳记,则它不会进行任何更改,但会向用户提供已输入或扫描了该记录的反馈。 如果该记录不存在,则会向用户反馈说没有这样的记录。
当我输入数值时,一切都很好。 现在,数字值已更改为字母数字,并且出现错误。 每当我输入字母数字值时,都会得到一个
'x'附近的语法不正确
涉及第35行的错误:
using(SqlDataReader reader = command.ExecuteReader())
我的aspx.cs文件中的整个代码如下。 任何建议,不胜感激!
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
private string GetConnectionString()
{
return ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
}
protected void Button1_Click(object sender, EventArgs e)
{
using (SqlConnection connection = new SqlConnection(GetConnectionString()))
{
try
{
connection.Open();
string sql = @"SELECT PRODUCT_ID from PRODUCTS where PRODUCT_ID = " + TextBox1.Text + " and DATE is null";
using(SqlCommand command = new SqlCommand(sql, connection))
{
using(SqlDataReader reader = command.ExecuteReader())
{
if(reader.HasRows)
{
string sql2 = @"UPDATE [products] SET date=@Value2 where PRODUCT_ID=@Value1";
using (SqlCommand command2 = new SqlCommand(sql2, connection))
{
command2.Parameters.AddWithValue("@Value1", TextBox1.Text);
command2.Parameters.AddWithValue("@Value2", DateTime.Now);
command2.ExecuteNonQuery();
}
pageBody.Attributes.Add("bgcolor", "#9aff8e");
Label1.Text = "Item " + TextBox1.Text + " Recorded!";
TextBox1.Text = "";
}
else
{
reader.Close();
string sql3 = @"SELECT PRODUCT_ID from PRODUCTS where PRODUCT_ID = " + TextBox1.Text + "";
using(SqlCommand command3 = new SqlCommand(sql3, connection))
{
using(SqlDataReader reader2 = command3.ExecuteReader())
{
if (reader2.HasRows)
{
pageBody.Attributes.Add("bgcolor", "#fbff8e");
Label1.Text = "Item " + TextBox1.Text + " Already Shipped!";
TextBox1.Text = "";
}
else
{
pageBody.Attributes.Add("bgcolor", "#ff8e8e");
Label1.Text = "Item " + TextBox1.Text + " Not Found!";
TextBox1.Text = "";
}
}
}
}
}
}
}
finally
{
if(connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
}
}
}
首先: 永远不要使用用户输入对SQL进行字符串连接。 它增加了可能导致破坏数据库的Sql Injection风险。
该错误是由于PRODUCT_ID
数据类型从数字更改为字符串引起的。 添加'修复错误。
string sql = @"SELECT PRODUCT_ID from PRODUCTS where PRODUCT_ID = '@Value1' and DATE is null";
using(SqlCommand command = new SqlCommand(sql, connection))
{
command.Parameters.AddWithValue("@Value1", TextBox1.Text);
...
}
希望由于您正在输入字母数字字段,所以必须使用。 (请注意文本框文本旁边的引号)
string sql = @"SELECT PRODUCT_ID from PRODUCTS where PRODUCT_ID = '" + TextBox1.Text + "' and DATE is null";
当您说它的字母数字字段时,您必须通过将product_id括起来作为字符串来进行搜索。
(假设表中PRODUCT_ID的数据类型为varchar。如果您的数据类型不是VARCHAR,您可能仍然会看到错误)
是的,正如@Faruq所述,请确保更新代码以使用命令参数来避免SQL注入。
更改:
PRODUCT_ID = " + TextBox1.Text + "
至:
PRODUCT_ID = '" + TextBox1.Text + "'
您需要用引号引起来,因此在进入数据库时,abc应该为“ abc”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.