Я работаю с ASP.NET и использую C# для создания проекта веб-сайта. У меня проблема с подключением к базе данных (вставка) / базе данных SQL при создании формы регистрации и входа.
Я привожу свой код ниже:
Форма регистрации:
<div id = "Sign_Up_Form" style = "display: none">
<form class = "modal-content animate" method = "post" action = "">
<div class = "input">
<div>
<div>Name</div>
<asp:TextBox CssClass = "signUp_input" ID = "First_Name" runat = "server" placeholder = "First Name" style = "height: 20px; padding-left: 1px;"></asp:TextBox>
<asp:TextBox CssClass = "signUp_input" ID = "Last_Name" runat = "server" placeholder = "Last Name" style = "height: 20px; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Email</div>
<asp:TextBox CssClass = "signUp_input" ID = "Regi_Email" runat = "server" placeholder = "Your email here" style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Password</div>
<asp:TextBox CssClass = "signUp_input" ID = "Regi_Password" type = "password" runat = "server" placeholder = "**********" style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Confirm Password</div>
<asp:TextBox CssClass = "signUp_input" ID = "Confirm_Regi_Password" type = "password" runat = "server" placeholder = "**********" style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Age</div>
<asp:TextBox CssClass = "signUp_input" ID = "Age" type = "number" runat = "server" placeholder = "e.g. 21" style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Gender:</div>
<asp:RadioButtonList CssClass = "radio" ID = "Gender" runat = "server">
<asp:ListItem Value = "1">Male</asp:ListItem>
<asp:ListItem Value = "2">Female</asp:ListItem>
<asp:ListItem Value = "3">Other</asp:ListItem>
</asp:RadioButtonList>
</br>
</div>
</div>
<asp:Button ID = "Register_Button" runat = "server" value = "Join" OnClick = "userRegister" CssClass = "button_join" Text = "Join" />
</form>
Я не уверен, следует ли мне указывать метод публикации здесь, в тегах формы.
Метод userRegister (отредактированный после того, как я получил предложения):
protected void userRegister(object sender, EventArgs e)
{
string constr = ConfigurationManager.ConnectionStrings["Khulna_website"].ConnectionString;
SqlConnection con = new SqlConnection(constr);
con.Open();
string insertQuery = "insert into dbo.users(user_f_name,user_l_name,user_password,user_email,user_age, user_gender) values (@First_Name, @Last_Name, @Regi_Password, @Regi_Email, @Age, @Gender);";
SqlCommand com = con.CreateCommand();
com.CommandText= insertQuery;
com.Parameters.AddWithValue("@First_Name", First_Name.Text);
com.Parameters.AddWithValue("@Last_Name", Last_Name.Text);
com.Parameters.AddWithValue("@Regi_Password", Regi_Password.Text);
com.Parameters.AddWithValue("@Regi_Email", Regi_Email.Text);
com.Parameters.AddWithValue("@Age", Age.Text);
com.Parameters.AddWithValue("@Gender", First_Name.Text);
com.ExecuteNonQuery();
con.Close();
Response.Write("Registration is Successful!");
}
Код моей таблицы базы данных:
CREATE TABLE [dbo].[users] (
[user_id] INT IDENTITY (1, 1) NOT NULL,
[user_f_name] VARCHAR (15) NOT NULL,
[user_l_name] VARCHAR (15) NOT NULL,
[user_password] VARCHAR (20) NOT NULL,
[user_email] VARCHAR (30) NOT NULL,
[user_age] INT NOT NULL,
[user_gender] INT NOT NULL,
[user_profession] VARCHAR (20) NULL,
[user_about] VARCHAR (200) NULL,
PRIMARY KEY CLUSTERED ([user_email] ASC)
);
Факт №1 Я создал базу данных с добавлением нового элемента-> База данных SQL. Он создается под AppData. Затем я снова вставил строку подключения в файл Web.config. Когда я заполняю форму и отправляю ее, я вижу, что зеленый цвет соединения рядом с моей базой данных (с именем dabase.mdf) исчез, а он красный, и мне нужно обновить его, чтобы он снова стал зеленым.
Факт №2 Я попытался написать код response.write () в самом начале в самом начале. Но изменений не было.
Проблема: данные не вставляются. Причина в каком-либо из фактов? Или здесь есть какая-то другая проблема, которую я упускаю?
P.S. Я совершенно новичок в этой теме, и любая помощь приветствуется.
edit: На самом деле у меня есть одна проблема с двумя фактами ... Я узнал факты, когда пытался увидеть корень проблемы.
Вы не выполняете созданную команду sql.
Спасибо за комментарий, на самом деле у меня только одна проблема, данные не были вставлены. Я обнаружил два факта, которые, как я предполагаю, могут стать причиной этой проблемы. Я редактировал, как вы предложили :)
@TZHX Внутри метода? Я знал только так. Должен ли я выполнить это явно снова? Или это проблема, которую я не совершал?
Вам нужно что-то вроде com.ExecuteNonQuery() в конце метода, чтобы фактически отправить команду в базу данных.
Я только что добавил .. Все еще не работает.
Вы не назначили соединение команде. Вы должны получить исключение, и это обычно указывается в вашем вопросе.
Я не понял .. Как я уже сказал, я новичок в этом. Вы хотите сказать, что у меня будет исключение и я должен добавить блок try / catch? Как назначить соединение команде?
я должен использовать using ()?
Да, вы должны избавиться от ресурсов, но код дает сбой не из-за этого. Мне нравится использовать этот синтаксис (это не единственный способ) SqlCommand com = con.CreateCommand();, а затем установить свойство CommandText команды.
Вы должны использовать блоки вокруг ваших объектов IDisposable, но это не причина вашей проблемы. Проблема в том, что вы не назначили соединение команде. Проверьте другие перегрузки конструктора SqlCommand, некоторые из них принимают SqlConnection в качестве параметра. Воспользуйтесь одним из них. Вы также должны выяснить, почему вы на самом деле не видели исключения.
@JigJagJoe, если вы хотите, чтобы кто-то знал, что вы с ним разговариваете, вы должны обращаться к ним с именем пользователя @ +.
@Crowcoder Хорошо, я пойду. И здесь ли текст типа команды? Я не использую здесь хранимую процедуру.
@mason Я изменил его и использовал using .. Я все еще не получаю блок исключений, и данные еще не вставлены
Я отредактировал соответствующим образом и отредактировал отредактированный код в фактическом сообщении
@JigJagJoe CommandType - это Text по умолчанию. Привыкайте к чтение документации, чтобы увидеть, какие свойства и методы доступны.
@JigJagJoe Имена параметров чувствительны к регистру. First_name отличается от First_Name. Опять должно быть исключение.
@Crowcoder Спасибо, документацию прочитал, процедура мне понятнее. И я добавил это соответственно. Хотя до сих пор не работает. Я не понимаю объекты IDisposable. Я погуглил, и, насколько я понял, это для неуправляемых ресурсов. Но меня все это смущает.





В web.config ваша строка подключения должна быть примерно такой:
<connectionStrings>
<add name = "Khulna_website" connectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|Database1.mdf;Integrated Security=True"/>
</connectionStrings>
Веб-форма:
<form id = "form1" runat = "server">
<div class = "input">
<div>
<div>Name</div>
<asp:TextBox CssClass = "signUp_input" ID = "First_Name" runat = "server" placeholder = "First Name" Style = "height: 20px; padding-left: 1px;"></asp:TextBox>
<asp:TextBox CssClass = "signUp_input" ID = "Last_Name" runat = "server" placeholder = "Last Name" Style = "height: 20px; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Email</div>
<asp:TextBox CssClass = "signUp_input" ID = "Regi_Email" runat = "server" placeholder = "Your email here" Style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Password</div>
<asp:TextBox CssClass = "signUp_input" ID = "Regi_Password" type = "password" runat = "server" placeholder = "**********" Style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Confirm Password</div>
<asp:TextBox CssClass = "signUp_input" ID = "Confirm_Regi_Password" type = "password" runat = "server" placeholder = "**********" Style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Age</div>
<asp:TextBox CssClass = "signUp_input" ID = "Age" type = "number" runat = "server" placeholder = "e.g. 21" Style = "height: 20px; width: 70%; padding-left: 1px;"></asp:TextBox>
</div>
<div>
<div>Gender:</div>
<asp:RadioButtonList CssClass = "radio" ID = "Gender" runat = "server">
<asp:ListItem Value = "1">Male</asp:ListItem>
<asp:ListItem Value = "2">Female</asp:ListItem>
<asp:ListItem Value = "3">Other</asp:ListItem>
</asp:RadioButtonList>
<br/>
</div>
</div>
<asp:Button ID = "Register_Button" runat = "server" value = "Join" OnClick = "userRegister" CssClass = "button_join" Text = "Join" />
</form>
Код программной части:
protected void userRegister(object sender, EventArgs e)
{
string constr = ConfigurationManager.ConnectionStrings["Khulna_website"].ConnectionString;
using (SqlConnection connection = new SqlConnection(constr))
{
string insertQuery = "insert into dbo.users(user_f_name,user_l_name,user_password,user_email,user_age, user_gender) values (@First_Name, @Last_Name, @Regi_Password, @Regi_Email, @Age, @Gender);";
SqlCommand com = new SqlCommand(insertQuery, connection);
connection.Open();
com.Parameters.AddWithValue("@First_Name", First_Name.Text);
com.Parameters.AddWithValue("@Last_Name", Last_Name.Text);
com.Parameters.AddWithValue("@Regi_Password", Regi_Password.Text);
com.Parameters.AddWithValue("@Regi_Email", Regi_Email.Text);
com.Parameters.AddWithValue("@Age", Age.Text);
com.Parameters.AddWithValue("@Gender", Gender.SelectedValue);
com.ExecuteNonQuery();
}
}
Он должен работать.
мой файл web.config - <connectionStrings> <add name = "Khulna_website" connectionString = "Server = (localDB) \\ v11.0; Integrated Security = SSPI; Database = Database.mdf;" providerName = "System.Data.SqlClient" /> </connectionStrings>
Если я дам runat: server в форме, он говорит, что он не может запускать runat в той же форме
Я даже сомневаюсь, что он вообще входит в метод. Если бы это было так, по крайней мере, он ответил бы "Регистрация прошла успешно".
@JigJagJoe Замените "Database = Database.mdf" на "AttachDBFilename = | DataDirectory | \ Database.mdf" в строке подключения (без кавычек). Пожалуйста, добавьте новую веб-форму в свой проект, скопируйте и вставьте код из моего ответа. Запустите, а затем откройте таблицу базы данных, чтобы убедиться, что данные были вставлены. Если все работает нормально, вернитесь к исходной WebForm и убедитесь, что у вас есть только один тег формы с «runat = server» и у вас есть код, который я предоставил в обработчике события кнопки «userRegister». Делайте ОДИН шаг за раз, чтобы исключить ошибки.
Я должен изменить прикрепить db имя файла написать? database1 будет базой данных, это то, что я знаю, следует ли мне также изменить каталог данных?
@JigJagJoe Если имя файла .mdf в папке App_Data - «database1.mdf», тогда ваша строка подключения localdb должна содержать: «AttachDBFilename = | DataDirectory | database1.mdf». | DataDirectory | - это специальный синтаксис, указывающий на папку App_Data вашего проекта.
Я не знаю, что происходит ... Это дает следующую ошибку: CS1061: «ASP.default2_aspx» не содержит определения для «userRegister», и метод расширения «userRegister», принимающий первый аргумент типа «ASP.default2_aspx», может быть найдено (вам не хватает директивы using или ссылки на сборку?)
@JigJagJoe убедитесь, что имя события По щелчку в веб-форме совпадает с именем метода обработчика событий в коде.
Я сделал, теперь проблема в com.Parameters.AddWithValue ("@ First_Name", First_Name.Text); com.Parameters.AddWithValue ("@ Last_Name", Last_Name.Text); com.Parameters.AddWithValue ("@ Regi_Password", Regi_Password.Text); com.Parameters.AddWithValue ("@ Regi_Email", Regi_Email.Text); com.Parameters.AddWithValue ("@ Возраст", Age.Text); com.Parameters.AddWithValue ("@ Gender", Gender.SelectedValue); ...
может дело в самом софте ошибка?
@JigJagJoe Пожалуйста, уточняйте ошибки и сообщения об ошибках. По крайней мере, сообщите точное сообщение об ошибке.
Наконец, я смог запустить его, и он сказал: «Произошла ошибка, связанная с сетью или конкретным экземпляром, при установлении соединения с SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра правильное и что SQL Server настроен на разрешение удаленных подключений. (поставщик: Сетевые интерфейсы SQL, ошибка: 50 - Произошла ошибка времени выполнения локальной базы данных. Указанный экземпляр LocalDB не существует.)
@JigJagJoe Проверьте, какие экземпляры localdb существуют в вашей системе, открыв командную строку и введя команду sqllocaldb я. Затем проверьте, какой экземпляр запущен, введя команду sqllocaldb я v11.0 или sqllocaldb и MSSQLLocalDB.
Имя экземпляра канала: np: \\. \ Pipe \ LOCALDB # B83F9492 \ tsql \ query. Вы спрашиваете эту информацию?
@JigJagJoe, это название канала. каково имя экземпляра (см. первую строку)?
Имя: v11.0 Версия: 11.0.2100.60 Общее имя: Автосоздание: Да Состояние: Выполняется Время последнего запуска: 21 апреля 18 22:10:02 Имя экземпляра канала: np: \\. \ Pipe \ LOCALDB # B83F9492 \ tsql \ запрос
@JigJagJoe Верно. В зависимости от вашей строки подключения он должен работать. Я считаю, что это будет, когда вы исправите проблему с подключением. Пожалуйста, прочтите: docs.microsoft.com/en-us/sql/database-engine/configure-windo ws /…
@JigJagJoe Почему бы вам не изменить строку подключения с AttachDBFilename = ... на База данных = ... (как было изначально) и не попробовать? Возможно, мое предложение строки подключения не подходит для вашей настройки (какая версия Visual Studio у вас установлена?)
Думаю, проблема была в том, что когда я изменил строку подключения, я все изменил. То есть я изменил (localdb) v11.0 на (localdb) MSSqlLocalDB ... теперь взял исходный. Это чувствительно к регистру, что это должно быть localdb, но я дал LocalDB .. Изменить это сложно для свойств
@JigJagJoe Ваш экземпляр localdb - v11.0, а не MSSQLLocalDB. Как только у вас будет правильная строка подключения, все остальное, несомненно, будет работать. Это все, ребята.
Большое спасибо за ваше время и терпение .. Я сообщу, когда решу проблему
Это работает .. проблема была: это будет (LocalDB not localDB): D
Обратите внимание, что при переполнении стека вы должны задавать только один вопрос для каждого вопроса. Тот, кто знает ответ на одну часть, может не знать ответа на другую. Тогда они могут не ответить или не получить должного за свое время и хлопоты за то, что они действительно отвечают. Вы можете использовать ссылку редактировать, чтобы исправить свой вопрос, чтобы это была только одна тема и была ясна. Вы можете задать второй вопрос для другой вашей проблемы.