• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Динамические параметры в Sqldatasource

  • Автор темы Red Wind
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Red Wind

Доброго времени суток. Пытаюсь динамически передать UpdateCommand в SqlDataSource, но из этого ничего не выходит. В событии Page_Load выполняю этот код:
Код:
	private void CreatingCommands()
{
SqlConnection conn = new SqlConnection(ConnectionString);
SqlDataAdapter adapter = new SqlDataAdapter(DynamicSqlDataSource.SelectCommand, conn);
SqlCommandBuilder sqb = new SqlCommandBuilder(adapter);
adapter.UpdateCommand = sqb.GetUpdateCommand(true);
DynamicSqlDataSource.UpdateCommand = adapter.UpdateCommand.CommandText;

//проблема в том, что тип параметров adapter не совпадает с типом SqlDataSource
for (int i = 0; i <= adapter.UpdateCommand.Parameters.Count - 1; i++)
{
Parameter param = new Parameter();
if (adapter.UpdateCommand.Parameters[i].DbType == DbType.Int32)
param.Type = TypeCode.Int32;
if (adapter.UpdateCommand.Parameters[i].DbType == DbType.StringFixedLength)
param.Type = TypeCode.String;
param.Name = adapter.UpdateCommand.Parameters[i].ParameterName;
DynamicSqlDataSource.UpdateParameters.Add(param);
}
}
Вроде бы всё ок, UpdateCommand передаётся, параметры создаются. Но когда происходит Update, то в окне браузера выскакивает такая ошибка:
Server Error in '/WebSite3' Application.
--------------------------------------------------------------------------------

Must declare the scalar variable "@Original_ID".
Description: An unhandled exception occurred during the execution of the current web request.
Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Must declare the scalar variable "@Original_ID".

Source Error:

An unhandled exception was generated during the execution of the current web request.
Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Самое неприятное, то что @Original_ID существует в DynamicSqlDataSource.UpdateParameters. Собственно вопрос, как мне корректно предать UpdateParameters в SqlDataSource?
 
P

Pasha

Ты копируешь параметры с исправлением типа, но забываешь задать их значения.
допиши строчку
param.Value = adapter.UpdateCommand.Parameters.Value;

ЗЫ. И вынеси adapter.UpdateCommand.Parameters в переменную внутри цикла.
 
R

Red Wind

Да, я конечно облопошился, забыл передать значение:). Но не всё так просто:(. Такой штуки как param.Value вообще не существует, есть только param.DefaultValue, и это свойство в любом случае типа string. Пробывал делать так:
Код:
if (adapter.UpdateCommand.Parameters[i].Value != null)
param.DefaultValue = adapter.UpdateCommand.Parameters[i].Value.ToString();
Но это ничего не изменило.
 
P

Pasha

Извини, торможу. Не сразу понял что такое DynamicSqlDataSource :)

Дело в том, что sqb.GetUpdateCommand генерирует запрос, в который надо передать старые значения параметров. Пропиши у DynamicSqlDataSource.OldValuesParameterFormatString="Original_{0}", у контрола, который к нему привязан - DataKeyNames="ID". И не надо будет вообще ничего добавалять в DynamicSqlDataSource.UpdateParameters. Датасорс сам соберет нужные значения. В крайнем случае - подебагай DynamicSqlDataSource_Updating, проверь что имено он передает как параметры.
 
R

Red Wind

Я так сделал, но это не сильно помогло. Вместо ошибки Must declare the scalar variable "@Original_ID". Вылазит Must declare the scalar variable "@IsNull_Name".
Кстати, вот моя табличка:
Код:
CREATE TABLE TestTable(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!