Недопустимое имя столбца при использовании C# для SQL Server

Это мой код на С#. Я просто пытаюсь добавить данные в свою таблицу в базе данных. Тем не менее, у меня была эта проблема только в возрасте. В нем говорится:

неверное имя столбца.

База данных Fotograf — единственная база данных, которая у меня есть, а таблица ODEV1 — единственная таблица, которую я создал. Когда я редактирую данные через SQL Server, проблем нет, но когда я пытаюсь это сделать с помощью Visual Studio C#, у меня возникают проблемы.

Любая помощь приветствуется, спасибо!

Вот изображение таблицы, которую я создал

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace SQL_ORNEK2
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection baglanti = new SqlConnection();
            baglanti.ConnectionString = "Server=LAPTOP-K3JLTUR0; database=Fotograf; integrated security=True";
            SqlCommand komut = new SqlCommand();
            komut.Connection = baglanti;

            string name;
            name = Console.ReadLine().ToString();
            string surname;
            surname = Console.ReadLine().ToString();
            int age;
            age = Convert.ToInt32(Console.ReadLine());
            string job;
            job = Console.ReadLine().ToString();
            komut.CommandText = "INSERT INTO dbo.ODEV1 VALUES('name', 'surname', age, 'job')";
            baglanti.Open();

            int sonuc = komut.ExecuteNonQuery();
            Console.WriteLine(sonuc);

            Console.ReadKey();
            baglanti.Close();
        }
    }
}

person Nikola    schedule 23.01.2021    source источник
comment
Отвечает ли это на ваш вопрос? Рекомендации по подключению данных C#?   -  person Charlieface    schedule 24.01.2021


Ответы (2)


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

insert into dbo.ODEV1 (name, surname, age, job) values ('Harold', 'Green', 25, 'nerd')

Чтобы вставить фактические данные из переменных, которые вы читаете из пользовательского ввода, вам нужно использовать параметры SQL:

komut.Parameters.AddWithValue("@name", name);
komut.Parameters.AddWithValue("@surname", surname);
komut.Parameters.AddWithValue("@age", age);
komut.Parameters.AddWithValue("@job", job);
komut.CommandText = "insert into dbo.ODEV1 (name, surname, age, job) values (@name, @surname, @age, @job)";
person ekolis    schedule 23.01.2021
comment
Благодарю вас! Но я не уверен, что полностью понимаю. Какую часть моего кода нужно изменить на то, что вы написали? - person Nikola; 24.01.2021
comment
@DanGuzman говорит: AddWithValue — зло - person Charlieface; 24.01.2021
comment
@Nikola Замените строку, в которой вы установили komut.CommandText, на то, что я написал. - person ekolis; 28.01.2021

Если вы используете SSMS (бесплатную SQL-Server Management Studio), чтобы создать оператор INSERT INTO, щелкнув правой кнопкой мыши нужную таблицу, выберите таблицу сценария как, выберите INSERT To в новом окне запроса, которое мы получим (используя таблицу с именем Customers) .

INSERT INTO [dbo].[Customer]
           ([FirstName]
           ,[LastName]
           ,[Address]
           ,[City]
           ,[State]
           ,[ZipCode]
           ,[AccountNumber]
           ,[JoinDate])
     VALUES
           (<FirstName, nvarchar(max),>
           ,<LastName, nvarchar(max),>
           ,<Address, nvarchar(max),>
           ,<City, nvarchar(max),>
           ,<State, nvarchar(max),>
           ,<ZipCode, nvarchar(max),>
           ,<AccountNumber, nvarchar(max),>
           ,<JoinDate, datetime2(7),>)

Теперь измените раздел VALUES, используя DECLARE для каждого значения.

DECLARE @FirstName nvarchar(max)
DECLARE @LastName nvarchar(max)
DECLARE @Address nvarchar(max)
DECLARE @City nvarchar(max)
DECLARE @State nvarchar(max)
DECLARE @ZipCode nvarchar(max)

INSERT INTO Customer (FirstName,LastName,[Address],City,[State],ZipCode) VALUES (@FirstName,@LastName,@Address,@City,@State,@ZipCode)

Затем создайте класс, а не помещайте операции с данными в Program.cs с методом, специфичным для добавления новой записи (в следующем примере по-прежнему используется таблица Customers).

Полный исходный код, откуда взят следующий код.

  • Альтернативой cmd.Parameters.AddWithValue является cmd.Parameters.Add, которая обеспечивает точную настройку типа параметра.

  • Альтернативой получению нового первичного ключа, если это необходимо, является добавление точки с запятой в конец INSERT INTO и добавление SELECT CAST(scope_identity() AS int); затем используйте Convert.ToInt32(cmd.ExecuteScalar()) для получения нового ключа. Поэтому после тестирования с помощью SSMS просто вставьте запрос в строковую переменную, и если это не сработает, произойдет что-то еще.

    public bool AddCustomer(string FirstName, string LastName, string Address, string City, string State, string ZipCode, ref int NewPrimaryKeyValue) { bool success = false;

     using (var cn = new SqlConnection { ConnectionString = ConnectionString })
     {
         using (var cmd = new SqlCommand { Connection = cn })
         {
             cmd.CommandText = 
                 "INSERT INTO Customer (FirstName,LastName,[Address],City,[State],ZipCode) " + 
                 "VALUES (@FirstName,@LastName,@Address,@City,@State,@ZipCode)";
    
             try
             {
                 cmd.Parameters.AddWithValue("@FirstName", FirstName);
                 cmd.Parameters.AddWithValue("@LastName", LastName);
                 cmd.Parameters.AddWithValue("@Address", Address);
                 cmd.Parameters.AddWithValue("@City", City);
                 cmd.Parameters.AddWithValue("@State", State);
                 cmd.Parameters.AddWithValue("@ZipCode", ZipCode);
    
                 cn.Open();
    
                 int result = cmd.ExecuteNonQuery();
    
                 if (result == 1)
                 {
                     cmd.CommandText = "Select @@Identity";
                     NewPrimaryKeyValue = Convert.ToInt32(cmd.ExecuteScalar());
                     success = true;
                 }
             }
             catch (Exception ex)
             {
                 HasErrors = true;
                 ExceptionMessage = ex.Message;
                 NewPrimaryKeyValue = -1;
                 success = false;
             }
         }
     }
    
     return success;
    

    }

вызов вышеуказанного метода.

Вы также можете проверить имена столбцов, используя следующее (все еще сохраняя таблицу клиентов)

SELECT ORDINAL_POSITION, 
       COLUMN_NAME, 
       DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Customer'
      AND TABLE_SCHEMA = 'dbo';

Полученные результаты

1,id,int
2,FirstName,nvarchar
3,LastName,nvarchar
4,Address,nvarchar
5,City,nvarchar
6,State,nvarchar
7,ZipCode,nvarchar
8,AccountNumber,nvarchar
9,JoinDate,datetime2

Изменить

Другой вариант - создать класс, который представляет данные для вставки, например.

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string AccountNumber { get; set; }
    public DateTime? JoinDate { get; set; }

}

Затем здесь мы используем переданные значения. Обратите внимание, что в этой версии cmd.Parameters.AddWithValue заменяется на cmd.Parameters.Add, а запрос на получение нового первичного ключа добавляется после INSERT INTO, разделенных точкой с запятой.

Чтобы вызвать создание экземпляра класса Customer, заполните свойства и вызовите метод.

public bool AddCustomer(Customer customer)
{
    bool success = false;

    using (var cn = new SqlConnection { ConnectionString = ConnectionString })
    {
        using (var cmd = new SqlCommand { Connection = cn })
        {
            cmd.CommandText =
                "INSERT INTO Customer (FirstName,LastName,[Address],City,[State],ZipCode) " + // insert
                "VALUES (@FirstName,@LastName,@Address,@City,@State,@ZipCode);" +             // insert
                "SELECT CAST(scope_identity() AS int);";                                      // get new primary key

            try
            {
                cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar))
                    .Value = customer.FirstName;
                
                cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar))
                    .Value = customer.LastName;
                
                cmd.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar))
                    .Value = customer.Address;
                
                cmd.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar))
                    .Value = customer.City;
                
                cmd.Parameters.Add(new SqlParameter("@State", SqlDbType.NVarChar))
                    .Value = customer.State;
                
                cmd.Parameters.Add(new SqlParameter("@ZipCode", SqlDbType.NVarChar))
                    .Value = customer.ZipCode;

                cn.Open();

                customer.Id = Convert.ToInt32(cmd.ExecuteScalar());
                success = true;

            }
            catch (Exception ex)
            {
                HasErrors = true;
                ExceptionMessage = ex.Message;
                customer.Id = -1;
                success = false;
            }
        }
    }

    return success;
}
person Karen Payne    schedule 24.01.2021