Member 14186984 Ответов: 1

Столбец "PDTID" не принадлежит таблице


Привет, друзья, у меня проблема. Моя страница AddToCart работала гладко без входа в систему. Но недавно я добавил страницу входа в систему. После этого он показывает мне столбец исключений "PDTID", который не принадлежит таблице .Что же делать?

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

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

public partial class AddToCart : System.Web.UI.Page
{
    static Boolean availabledesignid = false;
    static Boolean orderconfirm;
    static int quantityavailable;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["username"] == null)   // It was working properly, before adding this login part
        {
            Response.Redirect("~/Login/Login.aspx");
        }
        if (Session["addproduct"].ToString() == "true")
        {
            DataTable dt = new DataTable();
            DataRow dr;
            dt.Columns.Add("sno");
            dt.Columns.Add("PDTID");
            dt.Columns.Add("PDTNAME");
            dt.Columns.Add("IMAGE");
            dt.Columns.Add("PRICE");
            dt.Columns.Add("QUANTITY");
            dt.Columns.Add("totalprice");

            if (Request.QueryString["id"] != null)
            {
                if (Session["Buyitems"] == null)
                {

                    dr = dt.NewRow();
                    String mycon = @"Provider=Microsoft.Ace.OLEDB.12.0;Data Source=C:\Users\computer\Documents\Visual Studio 2010\WebSites\WebSite3\Shop.accdb";
                    OleDbConnection scon = new OleDbConnection(mycon);
                    String myquery = "select * from Products where PDTID=" + Request.QueryString["id"];      
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.CommandText = myquery;
                    cmd.Connection = scon;
                    OleDbDataAdapter da = new OleDbDataAdapter();
                    da.SelectCommand = cmd;
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    dr["sno"] = 1;
                    dr["PDTID"] = ds.Tables[0].Rows[0]["PDTID"].ToString();   //here its showing that exception
                    dr["PDTNAME"] = ds.Tables[0].Rows[0]["PDTNAME"].ToString();
                    dr["IMAGE"] = ds.Tables[0].Rows[0]["IMAGE"].ToString();
                    dr["QUANTITY"] = Request.QueryString["QUANTITY"];
                    dr["QUANTITY"] = Request.QueryString["QUANTITY"];
                    dr["PRICE"] = ds.Tables[0].Rows[0]["PRICE"].ToString();
                    Int64 price = Convert.ToInt64(ds.Tables[0].Rows[0]["PRICE"].ToString());
                    Int64 quantity = Convert.ToInt64(Request.QueryString["QUANTITY"].ToString());
                    Int64 totalprice = price * quantity;
                    dr["totalprice"] = totalprice;
                    savecartdetail(1, ds.Tables[0].Rows[0]["PDTID"].ToString(), ds.Tables[0].Rows[0]["PDTNAME"].ToString(), ds.Tables[0].Rows[0]["IMAGE"].ToString(), "1", ds.Tables[0].Rows[0]["PRICE"].ToString(), totalprice.ToString());
                    dt.Rows.Add(dr);
                    GridView1.DataSource = dt;
                    GridView1.DataBind();

                    Session["buyitems"] = dt;
                    GridView1.FooterRow.Cells[5].Text = "Total Amount";
                    GridView1.FooterRow.Cells[6].Text = grandtotal().ToString();
                    Response.Redirect("AddToCart.aspx");

                }

Gerry Schmitz

В какой момент он жалуется? Таблица доступа может быть проблемой для всех, кого мы знаем.

Maciej Los

Вы уверены, что в базе данных Access есть столбец PDTID?
Я бы все изменил:

SELECT * from Products where PDTID=?

к:
SELECT * from Products AS P where P.PDTID=?

Вы должны быть предупреждены о SqlInjection Итак, я бы использовал OleDbCommand с paramteres!

CHill60

Похоже, это решение для меня

Maciej Los

Я последовал твоему совету, Кэролайн. ;)

Member 14186984

Система.ArgumentException был необработан пользовательским кодом
Сообщение=столбец "PDTID" не принадлежит таблице .
Источник=System.Data
Трассировка стека:
в System.Data.DataRow.GetDataColumn(строка, столбец columnname)
at System.Data.DataRow.set_Item(строковое имя столбца, значение объекта)
в AddToCart.Page_Load(отправитель объекта, EventArgs e) в c:\Users\computer\Documents\Visual Studio 2010\WebSites\WebSite3\AddToCart.aspx.cs:строка 103
в System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
в System.Web.Util.CalliEventHandlerDelegateProxy.Обратного вызова(объект отправителя, EventArgs в электронной)
в системе.Веб.Пользовательского интерфейса.Контроль.OnLoad(EventArgs e)
в системе.Веб.Пользовательского интерфейса.Контроль.LoadRecursive()
в системе.Веб.Пользовательского интерфейса.Страницы.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Свойство innerexception:

1 Ответов

Рейтинг:
12

Maciej Los

Вы уверены, что база данных Access действительно имеет PDTID колонна?

Я бы все изменил:

SELECT * from Products where PDTID=?

к:
SELECT * from Products AS P where P.PDTID=?

Вы должны быть предупреждены о SqlInjection Итак, я бы использовал Объект oledbcommand[^] с параметрами!

[РЕДАКТИРОВАТЬ]
Я бы упростил ваш код до этого:
string sConn = @"Provider=Microsoft.Ace.OLEDB.12.0;Data Source=C:\Users\computer\Documents\Visual Studio 2010\WebSites\WebSite3\Shop.accdb;Persist Security Info =False;";
DataTable dt = new DataTable();

int pdtid = Request["id"]; //i'm not sure, but seems that conversion is needed here...
string sComm = "SELECT P.* FROM Products AS P WHERE P.PDTID=?;";

using (OleDbConnection oConn = new OleDbConnection(sConn))
    {
        oConn.Open();
        using (OleDbCommand oComm  = new OleDbCommand(sComm, oConn))
        {
            oComm.Parameters.Add(new OleDbParameter(){Value=pdtid});
            using (OleDbDataReader oRdr = oComm.ExecuteReader())
            {
                dt.Load(oRdr);
            }
        }
    }

if(dt.Rows.Count>0)
{
    DataColumn dc = new DataColumn("TotalPrice", typeof(double));
    dc.Expression = "PRICE * QUANTITY";
    dt.Columns.Add(dc);
    GridView1.DataSource = dt;
    //further instructions
}


Для получения более подробной информации, пожалуйста, смотрите:
объект DataColumn.Свойство Выражения (System.Data) | Microsoft Docs[^]


Member 14186984

Да, у меня есть PDTID в базе данных Access

Maciej Los

См. обновленный ответ. Это должно помочь вам избежать подобных ошибок.