Ошибка при получении в источнике данных при попытке вставить команду - PullRequest
0 голосов
/ 19 октября 2018

Я получаю следующее сообщение об ошибке при попытке вставить команду ввода источника данных:

Процедура или функция 'student_insert' ожидает параметр '@password', который не был предоставлен.

У меня большинство параметров, заданных на странице ASCX, за исключением «пароля», так как мне нужно сделать некоторые манипуляции с ним перед сохранением в БД:

<InsertParameters>
        <asp:Parameter Name="email" Type="String" />
        <asp:Parameter Name="first_name" Type="String" />
        <asp:Parameter Name="last_name" Type="String" />
        <asp:Parameter Name="university" Type="String" />
        <asp:Parameter Name="program" Type="String" />
        <asp:Parameter Name="student_number" Type="String" />
        <asp:ControlParameter Name="graduation_date" Type="DateTime" ControlID="ctl00$ContentPlaceHolder$ctl01$frmStudents$txtGradDate" PropertyName="Text" />
        <asp:ControlParameter Name="student_card_image_name" Type="String" ControlID="ctl00$ContentPlaceHolder$ctl01$frmStudents$FUStudent" PropertyName="FileName" />
        <asp:ControlParameter Name="id_card_image_name" Type="String" ControlID="ctl00$ContentPlaceHolder$ctl01$frmStudents$FUID" PropertyName="FileName" />
    </InsertParameters>

C #:

protected void datasource_Inserting(object sender, SqlDataSourceCommandEventArgs e) {
            ASCIIEncoding encoding = new ASCIIEncoding();
            ControlParameter cp = new ControlParameter("@password", DbType.Binary, "ctl00$ContentPlaceHolder$ctl01$frmStudents$txtPassword", "Text");
            FormView frmStudents = (FormView)FindControl("frmStudents");
            TextBox txtPassword = (TextBox)(frmStudents.FindControl("txtPassword"));

            datasource.InsertParameters.Add("password", DbType.Binary, encoding.GetBytes(Cryptogrpahy.Encrypt(txtPassword.Text, basepage.crypt_password)).ToString());
        }

Когда я прохожу метод с отладчиком, я вижу все мои параметры InsertParameters со значениями ...

Screenshot of debugger

Кроме того, отметим, что это не будет успешно выполнено из-за типа DB, поскольку я обычно использую VarBinary в обычном SQLParamater.

1 Ответ

0 голосов
/ 19 октября 2018

Я не могу найти документацию по нему, но я подозреваю, что происходит то, что объект SqlCommand, который создается во время события Insert, получает свои параметры из состояния объекта SqlDataSource.InsertParameters ДО выполнения кода вашего обработчика событий.Вы добавляете параметр в SqlDataSource, но поскольку SqlCommand был создан и получил его параметры от экземпляра SqlDataSource до того, как вы добавили параметр в экземпляр SqlDataSource, SqlCommand никогда не получит параметр пароля.

Чтобы обойтипопробуйте добавить параметр пароля в e.Command.Parameters в вашем обработчике событий вместо datasource.

protected void datasource_Inserting(object sender, SqlDataSourceCommandEventArgs e) {
            ASCIIEncoding encoding = new ASCIIEncoding();
            ControlParameter cp = new ControlParameter("@password", DbType.Binary, "ctl00$ContentPlaceHolder$ctl01$frmStudents$txtPassword", "Text");
            FormView frmStudents = (FormView)FindControl("frmStudents");
            TextBox txtPassword = (TextBox)(frmStudents.FindControl("txtPassword"));

            e.Command.Parameters.Add("password", DbType.Binary, encoding.GetBytes(Cryptogrpahy.Encrypt(txtPassword.Text, basepage.crypt_password)).ToString());
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...