Как исправить «System.Data.SqlClient.SqlException:« Имя столбца или количество предоставленных значений не соответствует определению таблицы. »» В asp.net - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь подключить свой SQL Server к ASP.NET, и когда я запускаю функцию вставки, появляется сообщение об ошибке.

SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Insert into Table1 values('"+firstname.Text+"','"+lastname.Text+"','"+city.Text+"')";
cmd.ExecuteNonQuery();

firstname.Text = "";
lastname.Text = "";
city.Text = "";

Я ожидаю показать вставленные значения, но отображается эта ошибка:

System.Data.SqlClient.SqlException: 'Имя столбца или количество предоставленных значений не соответствуют определению таблицы.'

Где Id автоматически увеличивается.

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Вам необходимо срочно исследовать внедрение SQL и ОСТАНОВИТЬ ИСПОЛЬЗОВАТЬ конкатенацию строк для построения оператора вставки SQL ПРЯМО СЕЙЧАС .

Вынеобходимо использовать правильную технику - параметризованные запросы - всегда - NO исключения!

А также, это общепринятая лучшая практика для перечисления столбцов в вашем INSERT, чтобы избежать проблем, когда таблицы изменяют свои столбцы (подробнее об этом здесь: Вредные привычки: использовать SELECT * / опустить список столбцов ).

Используйте этот код какобразец / шаблон:

string insertQuery = @"INSERT INTO dbo.Table1 (FirstName, LastName, City)
                       VALUES (@FirstName, @LastName, @City);";

using (SqlCommand cmd = new SqlCommmand(insertQuery, con))
{
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = firstname.Text;
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 50).Value = lastname.Text;
    cmd.Parameters.Add("@City", SqlDbType.VarChar, 50).Value = city.Text;

    con.Open();
    cmd.ExecuteNonQuery();
    con.Close()
}
0 голосов
/ 18 мая 2019

Вы должны указать имена столбцов.Например:

cmd.CommandText = $"Insert into Table1 ({ColumnName of firstname}, { ColumnName of lastname}, { ColumnName of city}) 
                    values({firstname.Text}, {lastname.Text}, {city.Text})";

Вы можете лучше использовать хранимую процедуру - что-то вроде этого:

cmd.CommandText = "your SP name";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = firstName.Text;
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = lastName.Text;
etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...