MadMyche
Прежде всего это то, что ваш запрос таков: Уязвим для SQL-инъекций. Никогда не создавайте запрос, объединяющий строки вместе.
Хотя это действие контроллера принимает только целое число в качестве входного значения, и у вас есть некоторая защита, это плохая привычка. Этой уязвимости уже более 20 лет, и апатичный код, подобный этому, по сей день удерживает эту уязвимость в топ-10 проблем безопасности.
ORMs (например, EntityFramework) и LINQ стали передними и центральными, чтобы защитить вас от этих типов ошибок.
Правильный способ добавить переменную в запрос-это Command.Parameter
коллекция.
string query = "SELECT * FROM Table WHERE TableNDX = @Value";
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@Value", value);
В вашем случае это выглядит так, как будто вы используете какой-то простой класс доступа к данным под названием
obj_fun с собой
getAll_Records метод. Возможно, вы захотите изучить этот метод, чтобы увидеть, есть ли у него перегрузка, доступная для принятия параметров, а если нет, то создайте ее и используйте.
Что возвращает ваш запрос, если вы запустите его в Sql-клиенте, таком как SSMS?
Пока вы находитесь там; я бы рекомендовал обрезать ваш запрос вниз с помощью
псевдонимы Это намного легче читать
SELECT a.DiningSysSeq, a.DiningCode, a.DiningName, a.Floor
, t.TableCode, t.TableName, t.NOofSeat
FROM dbo.DiningArea as A
INNER JOIN dbo.DiningTables as T
ON a.DiningSysSeq = t.DiningSysSeq
AND a.DiningSysSeq = @Value
Вы также можете рассмотреть возможность создания представления в своей базе данных, как только вы получите точную настройку запроса, чтобы сделать его более чистым вызовом.
Наконец, запустите это в
ОТЛАЖИВАТЬ режим и шаг через это действие шаг за шагом, чтобы увидеть, какие значения находятся там, где внутри него. Это будет лучший способ проверить все.
Samps Pro
моя проблема не в этом query.my проблема заключается в том, что контроллер является новым в mvc.
моя проблема заключается в том, что я не получаю представления о том, как отправить мастер-деталь обе модели сразу в поле зрения контроллера, делая страницу детализации, чтобы показать запись таблицы мастер-деталей без использования entity framwork
MadMyche
Ну а в MVC, который будет отображать детали, вам нужно передать модель в представление; обычно это делается с помощью return View(model);
.
Как правило, представление "подробно" возвращает модель, представляющую один экземпляр объекта; а представление "список" возвращает коллекцию одного типа модели.
Samps Pro
спасибо за ваш ответ, но я путаю, как отправить один экземпляр модели и представление списка как из controlerr в модель.
не могли бы вы помочь мне в написании actionRessult detail в контроллере, который возвращает как master, так и detail без out entityframwork.my мастер - класс размещен выше, а подробный класс-ниже
публичный класс ClsDiningTable
{
public Int32 DiningSysSeq { get; set; }
public string TableCode { get; set; }
public string TableName { get; set; }
public double NoofSeat { get; set; }
public virtual ClsDiningArea DiningArea { get; set; }
}
запрос для мастера:: выберите * от обеденная зона, где DiningSysSeq= идентификатор
запрос для получения подробной информации::выберите * из diningtables, где DiningSysSeq =id
Samps Pro
я попробую вот это
public ActionResult Details(int id)
{
List<clsdiningtable> clsTable = новый список<clsdiningtable>();
DataTable dtblUser = новый DataTable();
строку стр="выбрать * из-обеденная зона, где DiningSysSeq =" + ИД;
ClsDiningArea clsDining=новый ClsDiningArea();
dtblUser = obj_Fun.getAll_Records(str);
если (dtblUser.Строк.Count > 0)
{
клсдининг.DiningSysSeq = Конвертировать.ToInt32(dtblUser.Rows[0][0]);
клсдининг.DiningCode = dtblUser.Rows[0][1].Метод toString();
клсдининг.DiningName = dtblUser.Rows[0][2].Метод toString();
клсдининг.Floor = dtblUser.Rows[0][3].Метод toString();
}
if (clsDining.DiningSysSeq > 0)
{
строка sql = "Select * from DiningTables where DiningSysSeq =" + id;
SqlDataReader myreader = null;
myreader = obj_Fun.GetRecordByQuery(sql);
if (myreader.HasRows)
{
пока (myreader.Читать())
{
клстейбл.Добавить(новый ClsDiningTable
{
DiningSysSeq = Конвертировать.ToInt32(myreader["DiningSysSeq"]),
TableCode = myreader["табличный код"].Метод toString(),
TableName = myreader["имя таблицы"].Метод toString(),
NoofSeat = Конвертировать.ToInt16(myreader["NoofSeat"])
});
}
}
}
еще
{
Видовой мешок.Сообщение = "IDataRecord не найден";
}
обратный вид(clsTable);
}