繁体   English   中英

ASP.NET SqlDataReader附近的语法不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM