Member 13576953 Ответов: 1

Сведения об исключении: system.data.sqlclient.sqlexception: неверный синтаксис рядом с '='.


Здравствуйте, я получаю сообщение об ошибке при публикации моего кода. Пожалуйста, помогите мне определить, в чем может быть проблема. Спасибо

using System;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Cart : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<string> SKUS = Convert.ToString(Session["DataTable"]).Split(',').ToList<string>();

        Session["ItemsInCart"] = SKUS.Count;

        var MultiSelect = new SqlCommand();

        string cmdString1;

        cmdString1 = "Select Manufacture, SKU, Name, Price From Product WHERE SKU = " + Session["CartTable"];

        var connection = new SqlConnection("Data Source=Omisbi3.niunt.niu.edu;Initial Catalog=675_z1626585;User ID=OMIS675FA;Password=Omis.675!");

        SqlDataReader sdr;

        Decimal Total = 0;

        //Creating the table

        var DT = new DataTable("CartDisplay");

        var column1 = new DataColumn("SKU");

        column1.DataType = System.Type.GetType("System.Int32");

        var column2 = new DataColumn("Manufacture");

        column2.DataType = System.Type.GetType("System.String");

        var column3 = new DataColumn("Name");

        column3.DataType = System.Type.GetType("System.String");

        var column4 = new DataColumn("Price");

        column4.DataType = System.Type.GetType("System.Decimal");

        DT.Columns.Add(column1);

        DT.Columns.Add(column2);

        DT.Columns.Add(column3);

        DT.Columns.Add(column4);

        for (int i = 0; i <= SKUS.Count - 1; i++)

        {

            MultiSelect.CommandText = "Select SKU, Manufacture, Name, Price From Products WHERE SKU =" + SKUS[i];

            MultiSelect.Connection = connection;

            MultiSelect.Connection.Open();

            sdr = MultiSelect.ExecuteReader();

            while (sdr.Read())

            {

                DataRow Row1;

                Row1 = DT.NewRow();

                Total = Total + sdr.GetDecimal(3);

                Row1["SKU"] = sdr.GetInt32(0);

                Row1["Manufacture"] = sdr.GetString(1);

                Row1["Name"] = sdr.GetString(2);

                Row1["Price"] = sdr.GetDecimal(3);

                DT.Rows.Add(Row1);

            }

            MultiSelect.Connection.Close();

            lblResults.Text = "Your total is $" + Total;

        }

        GridView1.DataSource = DT;

        GridView1.DataBind();
    }
}


Что я уже пробовал:

Я попытался устранить эту ошибку, посмотрев, нужно ли мне добавить пробел в код.

PIEBALDconsult

Это, вероятно, здесь: где SKU =" + SKUS[i];
Что является большой причиной для использования параметризованного оператора вместо использования конкатенации строк.

Member 13576953

Я новичок в программировании. Как я могу это исправить?

1 Ответов

Рейтинг:
9

RossMW

Вместо

MultiSelect.CommandText = "Select SKU, Manufacture, Name, Price From Products WHERE SKU =" + SKUS[i];


пробовать

MultiSelect.CommandText = "Select SKU, Manufacture, Name, Price From Products WHERE SKU = @SKUS";
MultiSelect.Parameters.Clear();
MultiSelect.Parameters.AddWithValue("@SKUS", SKUS[i]);


Убедитесь, что SKUS[i] - это тот же тип объекта, что и поле SKU (например, числовое или строковое и т. д.).

Также переместите то, что не является необходимым из цикла. (open, commandtext одинаков для всех взаимодействий, и он будет открыт для второго цикла, поэтому в цикле есть только очистка/ настройка параметров и выполнение.


PIEBALDconsult

Лучше не очищать и повторно добавлять параметр; просто установите его значение в цикле.

RossMW

Хорошая точка. Я склонен немного лениться и просто использую простое решение. Если массив не слишком велик, он должен иметь только очень незначительный эффект.

PIEBALDconsult

Ленивое простое решение состоит в том, чтобы инкапсулировать его в метод, а не писать его снова и снова.

RossMW

И в зависимости от обстоятельств вкладывают его в сделку...