Добавление / Доступ к базе данных в ASP.Net в C # - PullRequest
1 голос
/ 24 апреля 2011

Я работал над этим школьным заданием и дошел до того, что застрял на несколько дней. Моя веб-страница ASP.net должна позволять пользователю создавать учетные записи и входить в систему. Однако, независимо от того, сколько раз я заполняю форму «Создать учетную запись», она не добавляется в базу данных.

Вот мой класс User, который содержит метод createAccount

public class Userr
    {




        //Constructor for the Account Creation method(createAccount)
        public string createAccount(string strFname, string strLname, string strUname, string address, string city, string state, string phone, string zip, string email,string password)
        {
            string i="";
            string storedProcText = ("INSERT INTO User Values('@ID," +strUname +"','"+strFname +"','"+ strLname +"','"+address +"','"+city +"','"+state+"','"+zip+"','"+phone+"','"+ email +"','"+ password );

                ArrayList parms = null;
            DataAccess dataAccess = new DataAccess();
            int result = dataAccess.insertUpdateData(parms,storedProcText );

           i  =result.ToString();
            return i;

        }

        public string Login(string strUsername, string strPassword)
        {
            DataAccess objDA = new DataAccess();
            int result = objDA.LoginUser(strUsername, strPassword);
        }

    }

Вот мой метод обновления (хранится в объекте / классе dataAccess

 //Constructor for the update method
        public int insertUpdateData(ArrayList items, String strProcedureName)
        {
            int i = 0;

            string strConn = WebConfigurationManager.ConnectionStrings["TicketsConnectionString"].ConnectionString;
            SqlConnection myConnection = new SqlConnection(strConn);

            string sqlText = strProcedureName;
            SqlCommand myCommand = new SqlCommand(sqlText);
            myCommand.Connection = myConnection;
            myCommand.CommandType = CommandType.StoredProcedure;

            try
            {
                    using (myConnection)
                {
                    myConnection.Open();
                    i = myCommand.ExecuteNonQuery();

                    //grdData.DataSource = myReader;
                   // grdData.DataBind();
                }

            } 
            catch (Exception err)
            {



            } 

            return i;
        }

Таблица пользователей содержит следующие поля в следующем порядке: идентификатор, идентификатор пользователя, имя, фамилия, адрес, город, штат, почтовый индекс, телефон, адрес электронной почты, пароль

Мой SQL-оператор неверен или как? Я нахожусь в конце моей веревки здесь.

Ответы [ 6 ]

1 голос
/ 24 апреля 2011

Шаги для выполнения этой работы: 1) Не ловите и не глотайте каждое исключение.Исключение скажет вам, что вы делаете неправильно здесь.2) Как указывает Каспар Кляйне, вам нужно поставить пароль в кавычки.3) Как я отмечаю, вам нужно добавить круглые скобки.4) Вы также должны использовать параметризованные SQL-запросы. 5) Вы, вероятно, не должны передавать идентификатор,

Вот исправленная строка SQL для # 2 и # 3:

string storedProcText = ("INSERT INTO User Values('@ID," 
                         +strUname +"','"+strFname +"','"
                         + strLname +"','"+address +"','"
                         +city +"','"+state+"','"
                         +zip+"','"+phone+"','"
                         + email +"','"+ password 
                         +"')" );

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

1 голос
/ 24 апреля 2011

Итак, со временем я вижу несколько проблем:

  1. Вы установили myCommand.CommandType = CommandType.StoredProcedure, но предоставленный вами синтаксис не является сохраненным процессом. Хранимая процедура будет принимать список значений имен params, который в вашем случае равен нулю.

  2. Допустим, вы не хотели использовать хранимые процедуры, и в этом случае ваш синтаксис sql неверен. Вам не нужен параметр @ID, если вы не передаете его (в этом случае вы его не устанавливали). Это должно быть что-то вроде этого (без знания структуры вашей таблицы):

string storedProcText = ("INSERT INTO User Values("'" +strUname +"','"+strFname +"','"+ strLname +"','" + address +"','"+city +"','"+state+"','"+zip+"','"+phone+"','"+ email +"','"+ password + "'");

Это означает, что вводимые вами значения точно соответствуют вашей таблице. Если нет, вам нужно будет также указать имена полей таблицы в вашем запросе, например:

string storedProcText = ("INSERT INTO User(username, firstName, lastName, field4, field5, field6) Values("'" +strUname +"','"+strFname +"','"+ strLname +"','" + address +"','"+city +"','"+state+"','"+zip+"','"+phone+"','"+ email +"','"+ password + "'");

Способ сделать это с помощью сохраненных процедур - это:


 SqlParameter[] parameters = { 
                new SqlParameter("@param1", SqlDbType.NVarChar, 50),
                new SqlParameter("@param2", SqlDbType.VarChar, 100),
                new SqlParameter("@param3", SqlDbType.VarChar, 100),
                new SqlParameter("@param4", SqlDbType.VarChar, 100),
                new SqlParameter("@param5", SqlDbType.VarChar, 100),
                new SqlParameter("@param6", SqlDbType.VarChar, 100)
            };
            parameters[0].Value = strFname;
            parameters[1].Value = strLname;
            .........
            .........
            [all the parameters you need]

Вам необходимо создать сохраненный процесс, также (очевидно)

И затем вы вызываете свой слой доступа к данным точно так же, как и вы.




1 голос
/ 24 апреля 2011

Итак, для начала вы прошли через этот код с помощью отладчика и определили, генерирует ли он исключение или возвращает измененные нулевые строки?

Самое неприятное - это вставка @IDколонка.Если это столбец Identity, вы не должны вставлять это значение.Если это не так, я не вижу, чтобы вы где-либо присваивали ему значение.

РЕДАКТИРОВАТЬ:

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

Я взял ваш код и бросил его в быстрый проект, и вот как выглядит ваше утверждение.

INSERT INTO User Values('@ID,UserName','FirstName','LastName','123 Some Street','SomeTown','State','54555','555-444-3333','email@email.com','ITS_A_SECRET!

Обратите внимание на конец запроса.Поле пароля не может быть закрыто при закрытии ', а список параметров не закрыт закрывающей скобкой.

QueryProblem

Вторая проблема заключается в том, что поле @Id.Является ли ваш столбец в базе данных полем идентификации?(Так и должно быть) Если это так, просто удалите это.

Теперь вот настоящий кикер.Ваше имя пользователя в таблице?Это зарезервированное слово в SQL-сервере, поэтому вы получите ошибки в своем запросе как есть.Отформатируйте запрос так, как показано ниже, и он будет работать.

string storedProcText = ("INSERT INTO [dbo].[User] Values('" + strUname + "','" + strFname + "','" + strLname + "','" + address + "','" + city + "','" + state + "','" + zip + "','" + phone + "','" + email + "','" + password + "')");

RightSQL

Другая проблема, как уже упоминалось, заключается в том, что тип команды установлен на «Хранимая процедура», когда вы этого не делаете.используя один.

Изменение типа вашей команды на текст:

myCommand.CommandType = CommandType.Text;

NoSProc

После того, как я внес эти изменения и запустил ваш код, я получил запись в базе данных.

Results

Самое важное, что нужно проверить прямо сейчас, это поле идентификатора.Это столбец идентификации?Убедитесь, что это так, а затем удалите его из своего заявления.

0 голосов
/ 18 мая 2018

Пожалуйста, закомментируйте это утверждение:

myCommand.CommandType = CommandType.StoredProcedure’;

Вы можете напрямую использовать скрипт sql.

0 голосов
/ 24 апреля 2011

Я не могу опубликовать все как комментарий, но вы можете сделать одну вещь ...

поставить точку останова и взять содержимое этой строки

string storedProcText = ("INSERT INTO User Values('@ID," +strUname +"','"+strFname +"','"+ strLname +"','"+address +"','"+city +"','"+state+"','"+zip+"','"+phone+"','"+ email +"','"+ password );

и вставить значениеstoreProcText непосредственно в базе данных и посмотрите, может ли он успешно работать и создать для вас запись.

Прерывание и отладка должны решить вашу проблему

0 голосов
/ 24 апреля 2011

В вставку вы пытаетесь вставить @ID, который, прежде всего, скорее всего, будет столбцом идентификаторов, и, если вы не установите IDENTITY_INSERT ON для этой таблицы, будет сгенерировано исключение, во-вторых, даже если это не столбец идентификаторов., вы не предоставляете определение параметра для параметра @ID команде.Попробуйте удалить @ID из оператора вставки и передать все остальное, кроме ID.В качестве примечания, ваш оператор SQL подвержен атакам SQL-инъекций, поскольку вы объединяете строку команды sql и значения, предоставленные пользователем, в одну строку.Я бы порекомендовал использовать параметры вместо фактических значений, а затем добавить параметры в команду sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...