Subhoj Kumar Ответов: 2

Как мне избавиться от этой ошибки и успешно сохранить данные в моей базе данных


Строка 18: строка checkuser = " select (*) from Table where [UserName] = '"+TextBoxUsername.Текст+ "'";
Строка 19: SqlCommand com = new SqlCommand(checkuser, conn);
Строка 20: int temp = Convert.ToInt32 (com. ExecuteScalar ().Метод toString());
Строка 21: if (temp == 1)
Строка 22: {

Здравствуйте, ребята, я столкнулся с этой ошибкой, которая говорит: "исключение типа" System. Data.SqlClient. SqlException " произошло в System.Data.dll но не был обработан в пользовательском коде

Дополнительная информация: неправильный синтаксис рядом с'*'. " и его указание на строку 20.

Я новичок, пытаюсь учиться Asp.net. Пожалуйста, помогите мне, если у кого-то есть решение.
P. S: Я также видел, что у другого парня такая же ошибка,и я попытался изменить код, но все равно у меня та же проблема. Заранее спасибо

Что я уже пробовал:

использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
использование системы.Сеть;
используя системы.Веб.ИП;
используя системы.Веб.Пользовательского интерфейса.WebControls;
используя системы.Данных.Поставщики sqlclient;
использование системы.Конфигурация;

общественные частичное оформление класса : системы.Веб.Пользовательского интерфейса.Страницы
{
protected void Page_Load(отправитель объекта, EventArgs e)
{

if (IsPostBack){
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings ["RegistrationConnectionString"].Параметр connectionString);
Коннектикут.Открыть();
строка checkuser = " select (*) from Table where [UserName] = '"+TextBoxUsername.Текст+ "'";
SqlCommand com = new SqlCommand(checkuser, conn);
int temp = преобразовать.ToInt32 (com. ExecuteScalar ().Метод toString());
если (temp == 1)
{
Ответ.Write ("пользователь уже существует");
}

Коннектикут.Закрывать();
}
}
охраняемых недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
пробовать{


SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings ["RegistrationConnectionString"].Параметр connectionString);
Коннектикут.Открыть();
string insertQuery = " вставить в таблицу (имя пользователя,адрес электронной почты,пароль,страна) значения (@Uname,@email,@password,@country)";
SqlCommand com = new SqlCommand(insertQuery, conn);
ком.Параметры.AddWithValue ("@Uname", TextBoxUsername.Текст);
ком.Параметры.AddWithValue ("@email", TextBoxEmailid. Text);
ком.Параметры.AddWithValue ("@password", TextBoxpassword. Text);
ком.Параметры.AddWithValue ("@country", DropDownListCountries.Элемент.Метод toString());
ком.Метод executenonquery();
Ответ.Перенаправление ("Manager. aspx");
Ответ.Напишите ("регистрация прошла успешно");

Коннектикут.Закрывать();
}
поймать(исключение бывший){
Ответ.Write ("Error :" +ex.Метод toString());
}
}
}

Afzaal Ahmad Zeeshan

Вы все еще не фокусируетесь на написании SQL-запросов, вы все еще используете Table как имя таблицы. Подумайте о том, чтобы научиться писать SQL-запросы.

Subhoj Kumar

Как ты думаешь, в этом-то и проблема?

2 Ответов

Рейтинг:
8

Michael_Davies

Попробовать это:

строка checkuser = " select COUNT (*) from [Table] where [UserName] = '"+TextBoxUsername.Текст+ "'";

SqlCommand com = new SqlCommand(checkuser, conn);

если (преобразовать.ToInt32(com. ExecuteScalar ()) = = 1)
{...


Subhoj Kumar

Ошибка 1 оператор '= = 'не может быть применен к операндам типа 'object' и 'int' C:\Users\LENOVO\Documents\Visual Studio 2013\WebSites\LoginPage\Registration.aspx. cs 22 16 LoginPage
это ошибка, когда я попробовал это сделать

Michael_Davies

Обновленное решение.

Subhoj Kumar

Ошибка: System.Data.SqlClient.SqlException (0x80131904): невозможно вставить значение NULL в столбец «ID», таблица «C: \ USERS \ LENOVO \ DOCUMENTS \ VISUAL STUDIO 2013 \ WEBSITES \ LOGINPAGE \ APP_DATA \ REGISTRATION.MDF.dbo» .Данные пользователя'; столбец не допускает значений NULL. INSERT не работает. Заявление было прекращено. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, Action`1 wrapCloseInAction) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, Boolean breakConnection, Action`1 wrapClloseInAction) .TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean, Boolean callerHasConnectionLock asyncClose) в System.Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в System.Data.SqlClient. SqlCommand. .Data.SqlClient.SqlCommand.RunExecuteReader (C ommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String метод, завершение TaskCompletionSource`1, тайм-аут Int32, Task & task, Boolean asyncWrite) в System.Data.SqlClient.SqlCommand.InternalExecuteNonpletionSqlCommand. , Boolean asyncWrite) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в Registration.Button1_Click (отправитель объекта, EventArgs e) в c: \ Users \ LENOVO \ Documents \ Visual Studio 2013 \ WebSites \ LoginPage \ Registration.aspx.cs : строка 43 ClientConnectionId: f92c5277-f1ec-4b86-9045-bd4dddc1de3a

даже несмотря на то, что я сохранил возможность не допускать нулей в своей колонке "ID", это все равно показывает

Michael_Davies

Я так понимаю, что это вставка, которая следует за проверкой на существование.

У вас есть и поле ID и он автоматически пронумерованы, если это так попробуйте положить умолчанию в положении для автомобильной сфере:

string insertQuery = " вставить в таблицу (ID,имя пользователя,адрес электронной почты,пароль,страна) значения (по умолчанию,@Uname,@email,@password,@country)";

Для получения дополнительной справки покажите схему таблицы.

Subhoj Kumar

Создайте таблицу [dbo].[Пользовательские данные] (
[ID] INT NOT NULL,
[Имя пользователя] NCHAR (40) NULL,
[Электронная почта] NCHAR (40) NULL,
[Пароль] NCHAR (20) NULL,
[Страна] NCHAR (20) NULL
);

Michael_Davies

Как вы можете видеть, ID определяется как NOT NULL, поэтому вы должны указать значение, обычно вы делаете это поле как IDENTITY, а затем база данных увеличивает число и заполняет его для вас.

Создайте таблицу [dbo].[Пользовательские данные] (
ID int IDENTITY(1,1) первичный ключ,
и т.д...

Subhoj Kumar

о, так должен ли я просто сохранить идентичность как истинную и увеличить ее до 1?

Michael_Davies

Сделайте это идентичностью, тогда работа будет сделана за вас.

Для MS SQL это должно быть:

ID int IDENTITY(1,1) первичный ключ,

Subhoj Kumar

все та же ошибка, Я попробую создать другую таблицу и посмотрю, как это сработает. Ценю вашу помощь и терпение

Michael_Davies

Покажите схему таблицы в ее нынешнем виде и измененный код.

Subhoj Kumar

Спасибо за помощь, я понял, что пошло не так, я удалил свою старую таблицу и создал новую, проблема существовала там, где я не обновил свое соединение Gridview с новой таблицей. Я снова создал новый gridview и добавил к нему свою новую таблицу.Тогда это сработало просто отлично. Еще раз спасибо за терпение. :)

Рейтинг:
20

OriginalGriff

Возможно, это имя вашей таблицы базы данных: TABLE это зарезервированное слово SQL, и это, вероятно, сбивает с толку синтаксический анализатор команд SQL.
Лучшее решение: не называйте свою таблицу "таблицей", так как это не описательное имя для того, что она содержит. Назовите это "студенты", или "клиенты", или "пользователи".
Самое худшее решение: окружите зарезервированное слово квадратными скобками: SELECT * FROM [Table] вместо SELECT * FROM Table

Но... Дон;т сделать это, как это! Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы. Это абсолютно важно, когда вы просматриваете страницы регистрации или входа в систему, поскольку конкатенация позволяет пользователям, не вошедшим в систему, полностью контролировать вашу базу данных ...


Subhoj Kumar

я обновил таблицу данных. Теперь появилась новая ошибка "ссылка на объект не установлена на экземпляр объекта", указывающая на эту строку
"int temp = преобразовать.ToInt32 (com. ExecuteScalar ().Метод toString()); "

Michael_Davies

Вы выбираете все из строки, идентифицированной пользователем, executescalar ожидает, что вернется только один элемент, измените * на поле, которое вы хотите получить из строки.

Кроме того, если возвращаемое поле является целым числом, зачем преобразовывать его в строку, чтобы преобразовать обратно в целое число?

Возможно, вы хотели использовать COUNT(*) при проверке возврата значения 1.