Ошибка субд недопустимое имя столбца partno

Добрый день!
После перехода на MS SQL 2016 столкнулись со следующей ошибкой при работе пользователей через веб браузер и через тонкого клиента с подключением через http:

Платформа: 1С:Предприятие 8.3 (8.3.11.2867 )

Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: Недопустимое имя столбца «PartNo».
HRESULT=80040E14, SQLSrvr: SQLSTATE=42S22, state=1, Severity=10, native=207, line=1

Ошибка спонтанная, возникает как на типовых конфигурациях, так и на самописных простеньких конфигурациях с отключенным режимом совместимости.
При работе в толстом клиенте ошибка не возникала ни когда.

Веб сервер Апач. Пробовались разные версии — 2.2, 2.4. Использовались как отдельные Линукс сервера, так и устанавливался апач на сервер 1с предприятия.

Сервер 1С и SQl установлены на одном сервере. Используется шаред мемори. Отключение шаред мемори не помогло.

Версия SQL:
Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119) — 13.0.4466.4 (X64)

Уровень совместимости базы данных менялся от 100 до 130.

Первоначально проблема возникла на версии 1С 8.3.10.2667, обновление на 8.3.11.2867 — не помогло.

Стандартные «пляски» — выгрузка загрузка через DT, удаление базы из сервера 1с и создание заново, удаление и создание базы sql, очистка всевозможных кешей — ничего не помогло.

Подскажите, какие процедуры можно провести для поиска и решения проблемы?

I am trying to enter data into my database, but it is giving me the following error:

Invalid column name

Here’s my code

string connectionString = "Persist Security Info=False;User ID=sa;Password=123;Initial Catalog=AddressBook;Server=Bilal-PC";

using (SqlConnection connection = new SqlConnection(connectionString))
{
  SqlCommand cmd = new SqlCommand();

  cmd.CommandText = "INSERT INTO Data (Name,PhoneNo,Address) VALUES (" + txtName.Text + "," + txtPhone.Text + "," + txtAddress.Text + ");";
  cmd.CommandType = CommandType.Text;
  cmd.Connection = connection;

  connection.Open();
  cmd.ExecuteNonQuery();
}

tom redfern's user avatar

tom redfern

30k13 gold badges94 silver badges124 bronze badges

asked Dec 5, 2011 at 18:09

Snake's user avatar

4

You probably need quotes around those string fields, but, you should be using parameterized queries!

cmd.CommandText = "INSERT INTO Data ([Name],PhoneNo,Address) VALUES (@name, @phone, @address)";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@name", txtName.Text);
cmd.Parameters.AddWithValue("@phone", txtPhone.Text);
cmd.Parameters.AddWithValue("@address", txtAddress.Text);
cmd.Connection = connection;

Incidentally, your original query could have been fixed like this (note the single quotes):

"VALUES ('" + txtName.Text + "','" + txtPhone.Text + "','" + txtAddress.Text + "');";

but this would have made it vulnerable to SQL Injection attacks since a user could type in

'; drop table users; -- 

into one of your textboxes. Or, more mundanely, poor Daniel O’Reilly would break your query every time.

answered Dec 5, 2011 at 18:11

Adam Rackis's user avatar

Adam RackisAdam Rackis

81.8k55 gold badges266 silver badges392 bronze badges

7

Always try to use parametrized sql query to keep safe from malicious occurrence, so you could rearrange you code as below:

Also make sure that your table has column name matches to Name, PhoneNo ,Address.

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand cmd = new SqlCommand("INSERT INTO Data (Name, PhoneNo, Address) VALUES (@Name, @PhoneNo, @Address)");
    cmd.CommandType = CommandType.Text;
    cmd.Connection = connection;
    cmd.Parameters.AddWithValue("@Name", txtName.Text);
    cmd.Parameters.AddWithValue("@PhoneNo", txtPhone.Text);
    cmd.Parameters.AddWithValue("@Address", txtAddress.Text);
    connection.Open();
    cmd.ExecuteNonQuery();
}

answered Dec 5, 2011 at 18:55

Elias Hossain's user avatar

Elias HossainElias Hossain

4,3601 gold badge19 silver badges33 bronze badges

3

Change this line:

cmd.CommandText = "INSERT INTO Data (Name,PhoneNo,Address) VALUES (" + txtName.Text + "," + txtPhone.Text + "," + txtAddress.Text + ");";

to this:

cmd.CommandText = "INSERT INTO Data (Name,PhoneNo,Address) VALUES ('" + txtName.Text + "','" + txtPhone.Text + "','" + txtAddress.Text + "');";

Your insert command is expecting text, and you need single quotes (‘) between the actual value so SQL can understand it as text.

EDIT: For those of you who aren’t happy with this answer, I would like to point out that there is an issue with this code in regards to SQL Injection. When I answered this question I only considered the question in point which was the missing single-quote on his code and I pointed out how to fix it. A much better answer has been posted by Adam (and I voted for it), where he explains the issues with injection and shows a way to prevent. Now relax and be happy guys.

answered Dec 5, 2011 at 18:12

MilkyWayJoe's user avatar

MilkyWayJoeMilkyWayJoe

9,0822 gold badges38 silver badges53 bronze badges

4

You problem is that your string are unquoted. Which mean that they are interpreted by your database engine as a column name.

You need to create parameters in order to pass your value to the query.

 cmd.CommandText = "INSERT INTO Data (Name, PhoneNo, Address) VALUES (@Name, @PhoneNo, @Address);";
 cmd.Parameters.AddWithValue("@Name", txtName.Text);
 cmd.Parameters.AddWithValue("@PhoneNo", txtPhone.Text);
 cmd.Parameters.AddWithValue("@Address", txtAddress.Text);

answered Dec 5, 2011 at 18:15

Pierre-Alain Vigeant's user avatar

You should never write code that concatenates SQL and parameters as string — this opens up your code to SQL injection which is a really serious security problem.

Use bind params — for a nice howto see here…

answered Dec 5, 2011 at 18:16

Yahia's user avatar

YahiaYahia

69k9 gold badges113 silver badges143 bronze badges

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            SqlConnection conn = new SqlConnection(@"Data Source=WKS09SQLEXPRESS;Initial Catalog = StudentManagementSystem;Integrated Security=True");
            SqlCommand insert = new SqlCommand("insert into dbo.StudentRegistration(ID, Name,Age,DateOfBirth,Email,Comment) values(@ID, @Name,@Age,@DateOfBirth,@mail,@comment)", conn);
            insert.Parameters.AddWithValue("@ID", textBox1.Text);
            insert.Parameters.AddWithValue("@Name", textBox2.Text);
            insert.Parameters.AddWithValue("@Age", textBox3.Text);
            insert.Parameters.AddWithValue("@DateOfBirth", textBox4.Text);
            insert.Parameters.AddWithValue("@mail", textBox5.Text);
            insert.Parameters.AddWithValue("@comment", textBox6.Text);

            if (textBox1.Text == string.Empty)
            {
                MessageBox.Show("ID Cannot be Null");
                return;
            }
            else if (textBox2.Text == string.Empty)
            {
                MessageBox.Show("Name Cannot be Null");
                return;
            }


            try
            {
                conn.Open();
                insert.ExecuteNonQuery();
                MessageBox.Show("Register done !");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error" + ex.Message);
                conn.Close();
            }
        }

        private void btnRetrive_Click(object sender, RoutedEventArgs e)
        {
            bool temp = false;
            SqlConnection con = new SqlConnection("server=WKS09SQLEXPRESS;database=StudentManagementSystem;Trusted_Connection=True");
            con.Open();
            SqlCommand cmd = new SqlCommand("select * from dbo.StudentRegistration where ID = '" + textBox1.Text.Trim() + "'", con);
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                textBox2.Text = dr.GetString(1);
                textBox3.Text = dr.GetInt32(2).ToString(); 
                textBox4.Text = dr.GetDateTime(3).ToString();
                textBox5.Text = dr.GetString(4);
                textBox6.Text = dr.GetString(5);
                temp = true;
            }
            if (temp == false)
                MessageBox.Show("not found");
            con.Close();
        }

        private void btnClear_Click(object sender, RoutedEventArgs e)
        {
            SqlConnection connection = new SqlConnection("Data Source=WKS09SQLEXPRESS;Initial Catalog = StudentManagementSystem;Integrated Security=True");
            string sqlStatement = "DELETE FROM dbo.StudentRegistration WHERE ID = @ID";
            try
            {
                connection.Open();
                SqlCommand cmd = new SqlCommand(sqlStatement, connection);
                cmd.Parameters.AddWithValue("@ID", textBox1.Text);
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
                MessageBox.Show("Done");
            }
            finally
            {
                Clear();
                connection.Close();
            }
        }

        public void Clear()
        {
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
        }
    }
}

answered Jul 5, 2016 at 12:04

pavithra madhuwanthi's user avatar

Code To insert Data in Access Db using c#

Code:-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace access_db_csharp
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
   public SqlConnection con = new SqlConnection(@"Place Your connection string");
            
           private void Savebutton_Click(object sender, EventArgs e)
    {
         SqlCommand cmd = new SqlCommand("insert into  Data (Name,PhoneNo,Address) values(@parameter1,@parameter2,@parameter3)",con);
                cmd.Parameters.AddWithValue("@parameter1", (textBox1.Text));
                cmd.Parameters.AddWithValue("@parameter2", textBox2.Text);
                cmd.Parameters.AddWithValue("@parameter3", (textBox4.Text));
                cmd.ExecuteNonQuery();

                }

    private void Form1_Load(object sender, EventArgs e)
    {
        con.ConnectionString = connectionstring;
        con.Open();
    }
}
}

answered Apr 18, 2014 at 18:56

Heemanshu Bhalla's user avatar

Heemanshu BhallaHeemanshu Bhalla

3,5051 gold badge26 silver badges52 bronze badges

You have to use '"+texbox1.Text+"','"+texbox2.Text+"','"+texbox3.Text+"'

Instead of "+texbox1.Text+","+texbox2.Text+","+texbox3.Text+"

Notice the extra single quotes.

Dima Tisnek's user avatar

Dima Tisnek

11k4 gold badges63 silver badges120 bronze badges

answered Feb 22, 2017 at 7:46

user7603356's user avatar

Your issue seems to be the Name keyword. Rather use FullName or firstName and lastName, always try and remember to use CamelCase too.

answered Apr 11, 2016 at 13:17

Jonathan Yaniv Ben Avraham's user avatar

1

first create database name «School»
than create table «students» with following columns
1. id
2. name
3. address

now open visual studio and create connection:

namespace school
{
    public partial class Form1 : Form
    {
        SqlConnection scon;


        public Form1()
        {

            InitializeComponent();

            scon = new SqlConnection("Data Source = ABC-PC; trusted_connection = yes; Database = school; connection timeout = 30");
        }

//create command

SqlCommand scom = new SqlCommand("insert into students (id,name,address) values(@id,@name,@address)", scon);

//pass parameters

scom.Parameters.Add("id", SqlDbType.Int);
scom.Parameters["id"].Value = textBox1.Text;

           scom.Parameters.Add("name", SqlDbType.VarChar);
            scom.Parameters["name"].Value = this.textBox2.Text;

            scom.Parameters.Add("address", SqlDbType.VarChar);
            scom.Parameters["address"].Value = this.textBox6.Text;


            scon.Open();
            scom.ExecuteNonQuery();
            scon.Close();
            reset();

        }

also check solution here: http://solutions.musanitech.com/?p=6

answered Sep 9, 2015 at 1:08

Hani Mehdi's user avatar

Hani MehdiHani Mehdi

1874 silver badges9 bronze badges

con = new SqlConnection(@"Data Source=.SQLEXPRESS;AttachDbFilename=C:UsersYna Maningding-DulaDocumentsVisual Studio 2010ProjectsLuxuryHotelLuxuryHotelClientsRecords.mdf;Integrated Security=True;User Instance=True");
        con.Open();
        cmd = new SqlCommand("INSERT INTO ClientData ([Last Name], [First Name], [Middle Name], Address, [Email Address], [Contact Number], Nationality, [Arrival Date], [Check-out Date], [Room Type], [Daily Rate], [No of Guests], [No of Rooms]) VALUES (@[Last Name], @[First Name], @[Middle Name], @Address, @[Email Address], @[Contact Number], @Nationality, @[Arrival Date], @[Check-out Date], @[Room Type], @[Daily Rate], @[No of Guests], @[No of Rooms]", con);
        cmd.Parameters.Add("@[Last Name]", txtLName.Text);
        cmd.Parameters.Add("@[First Name]", txtFName.Text);
        cmd.Parameters.Add("@[Middle Name]", txtMName.Text);
        cmd.Parameters.Add("@Address", txtAdd.Text);
        cmd.Parameters.Add("@[Email Address]", txtEmail.Text);
        cmd.Parameters.Add("@[Contact Number]", txtNumber.Text);
        cmd.Parameters.Add("@Nationality", txtNational.Text);
        cmd.Parameters.Add("@[Arrival Date]", txtArrive.Text);
        cmd.Parameters.Add("@[Check-out Date]", txtOut.Text);
        cmd.Parameters.Add("@[Room Type]", txtType.Text);
        cmd.Parameters.Add("@[Daily Rate]", txtRate.Text);
        cmd.Parameters.Add("@[No of Guests]", txtGuest.Text);
        cmd.Parameters.Add("@[No of Rooms]", txtRoom.Text);
        cmd.ExecuteNonQuery();

answered Sep 17, 2016 at 15:40

Yna's user avatar

0

I suspect that you have two tables with the same name. One is owned by the schema ‘dbo’ (dbo.PerfDiag), and the other is owned by the default schema of the account used to connect to SQL Server (something like userid.PerfDiag).

When you have an unqualified reference to a schema object (such as a table) — one not qualified by schema name — the object reference must be resolved. Name resolution occurs by searching in the following sequence for an object of the appropriate type (table) with the specified name. The name resolves to the first match:

  • Under the default schema of the user.
  • Under the schema ‘dbo’.

The unqualified reference is bound to the first match in the above sequence.

As a general recommended practice, one should always qualify references to schema objects, for performance reasons:

  • An unqualified reference may invalidate a cached execution plan for the stored procedure or query, since the schema to which the reference was bound may change depending on the credentials executing the stored procedure or query. This results in recompilation of the query/stored procedure, a performance hit. Recompilations cause compile locks to be taken out, blocking others from accessing the needed resource(s).

  • Name resolution slows down query execution as two probes must be made to resolve to the likely version of the object (that owned by ‘dbo’). This is the usual case. The only time a single probe will resolve the name is if the current user owns an object of the specified name and type.

[Edited to further note]

The other possibilities are (in no particular order):

  • You aren’t connected to the database you think you are.
  • You aren’t connected to the SQL Server instance you think you are.

Double check your connect strings and ensure that they explicitly specify the SQL Server instance name and the database name.

I suspect that you have two tables with the same name. One is owned by the schema ‘dbo’ (dbo.PerfDiag), and the other is owned by the default schema of the account used to connect to SQL Server (something like userid.PerfDiag).

When you have an unqualified reference to a schema object (such as a table) — one not qualified by schema name — the object reference must be resolved. Name resolution occurs by searching in the following sequence for an object of the appropriate type (table) with the specified name. The name resolves to the first match:

  • Under the default schema of the user.
  • Under the schema ‘dbo’.

The unqualified reference is bound to the first match in the above sequence.

As a general recommended practice, one should always qualify references to schema objects, for performance reasons:

  • An unqualified reference may invalidate a cached execution plan for the stored procedure or query, since the schema to which the reference was bound may change depending on the credentials executing the stored procedure or query. This results in recompilation of the query/stored procedure, a performance hit. Recompilations cause compile locks to be taken out, blocking others from accessing the needed resource(s).

  • Name resolution slows down query execution as two probes must be made to resolve to the likely version of the object (that owned by ‘dbo’). This is the usual case. The only time a single probe will resolve the name is if the current user owns an object of the specified name and type.

[Edited to further note]

The other possibilities are (in no particular order):

  • You aren’t connected to the database you think you are.
  • You aren’t connected to the SQL Server instance you think you are.

Double check your connect strings and ensure that they explicitly specify the SQL Server instance name and the database name.



Я работаю над изменением существующей хранимой процедуры SQL Server. Я добавил два новых столбца в таблицу и также изменил хранимую процедуру, чтобы выбрать эти два столбца. Хотя столбцы доступны в таблице SQL Server продолжает давать эту ошибку:

недопустимое имя столбца ‘INCL_GSTAMOUNT’

enter image description here

может кто-нибудь пожалуйста, скажите мне, что тут не так?


1430  


9  

9 ответов:

всякий раз, когда это происходит со мной, я нажимаю Ctrl+ Shift+R обновления intellisense, закройте окно запроса (сохранить при необходимости), а затем запустите новый сеанс, который обычно работает довольно хорошо.

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

Intellisense не обновляется автоматически, и вы не должны полностью полагаться на это

эта ошибка также может возникать в инкапсулированных инструкциях SQL, например

объявить @tableName nvarchar (20) SET @tableName = ‘GROC’

объявить @updtStmt nvarchar (4000)

SET @updtStmt = ‘Update tbProductMaster_’ [email protected] + ‘ SET
department_str = ‘ + @tableName exec sp_executesql @updtStmt

только чтобы обнаружить, что отсутствуют цитаты для инкапсуляции параметра «@tableName » далее, как следующее:

SET @updtStmt = ‘Update tbProductMaster_’ [email protected] + ‘ SET
department_str = «‘ + @tableName+»»

спасибо

я получаю ту же ошибку при создании представления.

представьте себе запрос select, который выполняется без проблем:

select id
from products

попытка создать представление из того же запроса приведет к ошибке:

create view app.foobar as
select id
from products

Msg 207, Уровень 16, состояние 1, процедура foobar, строка 2
Недопустимое имя столбца «id».

для меня это оказалось проблемой области видимости; обратите внимание, что представление создается в другой схеме. Указание схема из products таблица решила проблему. То есть.. используя просто products.

с обновить таблицу или закрыть и открыть sql server эта работа

У меня была похожая проблема.

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

следующая процедура помогла мне решить эту проблему, но я не знаю, почему.

  1. вырезать код, о котором идет речь, заданный строками в сообщении
  2. сохраните запрос (например, в файл)
  3. вставьте код туда, где он был раньше
  4. снова сохраните запрос

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

Я просто попробовал.
Если вы выполните инструкцию для создания локальной таблицы, инструмент примет, что это имя столбца существует.
Просто отметьте оператор генерации таблицы в окне редактора и нажмите кнопку Выполнить.

YFKoenigsegg

1 / 1 / 0

Регистрация: 06.10.2018

Сообщений: 160

1

Недопустимое имя столбца

19.02.2020, 14:48. Показов 8949. Ответов 8

Метки нет (Все метки)


Добрый день. Использую Entity Framework при сохранении пользователя в БД:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
      private void picSignUp_Click(object sender, EventArgs e)
        {
            using (var db = new DB())
            {
                var user = new UserClient()
                {
                    Name = fldName.Text,
                    Surname = fldSurname.Text,
                    PassportNumber = fldPassportNumber.Text,
                    UserLogin = fldLoginUp.Text,
                    Password = fldPasswordUp.Text,
                    Email = fldEmail.Text,
                    RegistrationDate = DateTime.Now.ToString()
                };
                db.UserClients.Add(user);
                db.SaveChanges();
 
 
            }
        }

Но вот в строке

C#
1
db.SaveChanges();

выбрасывается исключение, которое гласит, что «Недопустимое имя столбца Id». Подскажите пожалуйста, как пофиксить.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

bite

3264 / 2852 / 659

Регистрация: 13.04.2015

Сообщений: 6,732

19.02.2020, 14:58

2

Цитата
Сообщение от YFKoenigsegg
Посмотреть сообщение

Подскажите пожалуйста, как пофиксить.

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

0

602 / 369 / 132

Регистрация: 06.03.2017

Сообщений: 1,364

19.02.2020, 15:01

3

Было бы неплохо глянуть на саму бд. А так только гадать. Ну и не видно, где передается парамет для Id

0

YFKoenigsegg

1 / 1 / 0

Регистрация: 06.10.2018

Сообщений: 160

19.02.2020, 16:00

 [ТС]

4

А параметр Id я не передаю, тк он используется в качестве автоинкремента при добавлении новой записи в БД.
Вот таблица:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
USE [ClientsDB]
GO
 
CREATE TABLE [dbo].[UserClients](
    [UserLogin] [VARCHAR](25) NOT NULL,
    [Password] [VARCHAR](25) NOT NULL,
    [PassportNumber] [VARCHAR](9) NOT NULL,
    [Name] [nvarchar](20) NOT NULL,
    [Surname] [nvarchar](25) NOT NULL,
    [Email] [VARCHAR](40) NOT NULL,
    [RegistrationDate] [VARCHAR](20) NOT NULL,
    UserId INT IDENTITY(1,1)
)
GO
 
ALTER TABLE [dbo].[UserClients] ADD  CONSTRAINT [DF_UserClients_RegistrationDate]  DEFAULT (getdate()) FOR [RegistrationDate]
GO
 
ALTER TABLE UserClients
ADD CONSTRAINT DF_UserClients_UserLogin_Unique UNIQUE (UserLogin)
GO
 
ALTER TABLE UserClients
ADD CONSTRAINT DF_UserClients_Email_Unique UNIQUE (Email)
GO
 
ALTER TABLE UserClients
ADD CONSTRAINT DF_UserClients_UserId PRIMARY KEY CLUSTERED (UserId)
GO

0

796 / 579 / 207

Регистрация: 21.02.2019

Сообщений: 2,095

19.02.2020, 16:35

5

YFKoenigsegg,
а в самом классе UserClient поле Id присутствует?

0

YFKoenigsegg

1 / 1 / 0

Регистрация: 06.10.2018

Сообщений: 160

19.02.2020, 18:54

 [ТС]

6

Да, в этом классе это поле есть(его там я поставил с той целью, чтобы потом получить Id из базы данных — а надо ли создавать прямо целое поля для этого или надо без него?), а если я убираю
это получается другая совсем ошибка которая также мне не известна:

C#
1
2
BankService.UserClient: : EntityType 'UserClient' has no key defined. Define the key for this EntityType.
UserClients: EntityType: EntitySet 'UserClients' is based on type 'UserClient' that has no keys defined.

Код класса UserClient:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 class UserClient
    {
        //public int Id { get; set; }
        public string UserLogin { get; set; }
        public string Password
        {
            set { }
        }
        public string PassportNumber { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public string Email{ get; set; }
        public string RegistrationDate { get; set; }
    }

Добавлено через 1 час 30 минут
Решил проблему.Добавил следующее:

C#
1
2
 [Key]
        public string UserLogin { get; set; }

и подключил:

C#
1
using System.ComponentModel.DataAnnotations;

и убрал вовсе полe Id

0

Эксперт .NET

11045 / 7601 / 1176

Регистрация: 21.01.2016

Сообщений: 28,582

20.02.2020, 06:53

7

Цитата
Сообщение от YFKoenigsegg
Посмотреть сообщение

Решил проблему.Добавил следующее:

Это дичь. Для ключа нужно использовать отдельное поле с INT или GUID. UserId INT IDENTITY(1,1) PRIMARY KEY — самое правильное решение во всех смыслах.

3

YFKoenigsegg

1 / 1 / 0

Регистрация: 06.10.2018

Сообщений: 160

20.02.2020, 19:33

 [ТС]

8

Всё, переделал.
Поле Id должно называться так же, как и имя столбца(то есть UserId):

C#
1
public int UserId { get; set; }

0

Эксперт .NET

11045 / 7601 / 1176

Регистрация: 21.01.2016

Сообщений: 28,582

21.02.2020, 01:54

9

Цитата
Сообщение от YFKoenigsegg
Посмотреть сообщение

Поле Id должно называться так же, как и имя столбца(то есть UserId):

Не обязательно. Этот момент настраивается.

0

Добрый день!
После перехода на MS SQL 2016 столкнулись со следующей ошибкой при работе пользователей через веб браузер и через тонкого клиента с подключением через http:

Платформа: 1С:Предприятие 8.3 (8.3.11.2867 )

Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: Недопустимое имя столбца «PartNo».
HRESULT=80040E14, SQLSrvr: SQLSTATE=42S22, state=1, Severity=10, native=207, line=1

Ошибка спонтанная, возникает как на типовых конфигурациях, так и на самописных простеньких конфигурациях с отключенным режимом совместимости.
При работе в толстом клиенте ошибка не возникала ни когда.

Веб сервер Апач. Пробовались разные версии — 2.2, 2.4. Использовались как отдельные Линукс сервера, так и устанавливался апач на сервер 1с предприятия.

Сервер 1С и SQl установлены на одном сервере. Используется шаред мемори. Отключение шаред мемори не помогло.

Версия SQL:
Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119) — 13.0.4466.4 (X64)

Уровень совместимости базы данных менялся от 100 до 130.

Первоначально проблема возникла на версии 1С 8.3.10.2667, обновление на 8.3.11.2867 — не помогло.

Стандартные «пляски» — выгрузка загрузка через DT, удаление базы из сервера 1с и создание заново, удаление и создание базы sql, очистка всевозможных кешей — ничего не помогло.

Подскажите, какие процедуры можно провести для поиска и решения проблемы?

Всякий раз, когда я отправляю свою форму, он дает мне код ошибки:

«Недопустимое имя столбца» для всех событийспециалиста, телефона, телефона2 и т.д. и @SPECIALIST, @CUST_PHONE, @CUST_PHONE2 и т.д.

Вот мой код ниже, возможно, я не правильно пишу инструкцию SQL или параметры? Те, у которых @infront, есть то, что в моей базе данных, а другие строчные — мои текстовые поля. Я относительно новичок в этом типе кодирования.

Изменить: Изменено мое выражение INSERT INTO на то, что было предложено. Ошибка все еще сохраняется, но сводится к минимуму до

«Недопустимое имя столбца eventpecialist, Недопустимое имя столбца телефона, Недопустимое имя столбца phone2 и т.д.»

private void execution(string eventspecialist, string phone, string phone2, string firstname, string lastname, string besttime, string companyname, string nonprofit, string requesteddate, string requestedtime, string attendance, string eventtype, string other, string leadsource, string notes, string catering, string bar, string damagedeposit, string dancefloor, string griddate, string gridnotes, string comments)
{
    SqlConnection conn = new SqlConnection(GetConnectionString());

    string sql = "INSERT INTO tblcontacts (@SPECIALIST, @CUST_PHONE1, @CUST_PHONE2, @CUST_FNAME, @CUST_LNAME, @BEST_TIME, @COMPANY_NAME, @NONPROFIT, @REQ_DATE, @REQ_TIME, @ATTENDANCE, @EVENT_TYPE, @OTHER_DESC, @LEAD_SOURCE, @NOTES, @CATERING, @BAR, @DAMAGE_DEPOSIT, @DANCE_FLOOR) VALUES (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor)";
    string sql2 = "INSERT INTO tblnotes (@NOTEDATE, @NOTEBY, @COMMENTS) VALUES (griddate, gridnotes, comments)";

    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);

        cmd.Parameters.Add("@SPECIALIST", SqlDbType.NVarChar, 50).Value = eventspecialist;
        cmd.Parameters.Add("@CUST_PHONE1", SqlDbType.NVarChar, 50).Value = phone;
        cmd.Parameters.Add("@CUST_PHONE2", SqlDbType.NVarChar, 50).Value = phone2;
        cmd.Parameters.Add("@CUST_FNAME", SqlDbType.NVarChar, 50).Value = firstname;
        cmd.Parameters.Add("@CUST_LNAME", SqlDbType.NVarChar, 50).Value = lastname;
        cmd.Parameters.Add("@BEST_TIME", SqlDbType.NVarChar, 50).Value = besttime;
        cmd.Parameters.Add("@COMPANY_NAME", SqlDbType.NVarChar, 225).Value = companyname;
        cmd.Parameters.Add("@NONPROFIT", SqlDbType.NVarChar, 10).Value = nonprofit;
        cmd.Parameters.Add("@REQ_DATE", SqlDbType.Date, 20).Value = requesteddate;
        cmd.Parameters.Add("@REQ_TIME", SqlDbType.Time, 20).Value = requestedtime;
        cmd.Parameters.Add("@ATTENDANCE", SqlDbType.Int, 50).Value = attendance;
        cmd.Parameters.Add("@EVENT_TYPE", SqlDbType.NVarChar, 50).Value = eventtype;
        cmd.Parameters.Add("@OTHER_DESC", SqlDbType.NVarChar, 225).Value = other;
        cmd.Parameters.Add("@LEAD_SOURCE", SqlDbType.NVarChar, 50).Value = leadsource;
        cmd.Parameters.Add("@NOTES", SqlDbType.NVarChar, 225).Value = notes;
        cmd.Parameters.Add("@CATERING", SqlDbType.NVarChar, 1).Value = catering;
        cmd.Parameters.Add("@BAR", SqlDbType.NVarChar, 1).Value = bar;
        cmd.Parameters.Add("@DAMAGE_DEPOSIT", SqlDbType.NVarChar, 19).Value = damagedeposit;
        cmd.Parameters.Add("@DANCE_FLOOR", SqlDbType.Money).Value = Decimal.Parse(dancefloor);


        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex_msg)
    {
        string msg = "Error occured while inserting";
        msg += ex_msg.Message;
        throw new Exception(msg);
    }
    finally
    {

        conn.Close();
    }
    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql2, conn);

        cmd.Parameters.Add("@NOTEDATE", SqlDbType.Date, 50).Value = griddate;
        cmd.Parameters.Add("@NOTEBY", SqlDbType.NVarChar, 50).Value = gridnotes;
        cmd.Parameters.Add("@COMMENTS", SqlDbType.NVarChar, 50).Value = comments;

        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex_msg)
    {
        string msg = "Error occured while inserting";
        msg += ex_msg.Message;
        throw new Exception(msg);
    }
    finally
    {

        conn.Close();
    }

}
protected void Page_Load(object sender, EventArgs e)
{
    griddate.Text = DateTime.Now.ToString("yyyy/MM/dd");
}
protected void submit_Click(object sender, EventArgs e)
{
    if (requesteddate.Text == "")
    {
        Finish.Text = "Please complete the form!";
    }
    else if (requestedtime.Text == "")
    {
        Finish.Text = "Please complete the form!";
    }
    else if (attendance.Text == "")
    {
        Finish.Text = "Please complete the form!";
    }
    else
    {
        execution(eventspecialist.Text, phone.Text, phone2.Text, firstname.Text, lastname.Text, besttime.SelectedItem.Text, companyname.Text, nonprofit.Text, requesteddate.Text, requestedtime.Text, attendance.Text, eventtype.SelectedItem.Text, other.Text, leadsource.SelectedItem.Text, notes.Text, catering.Text, bar.Text, damagedeposit.Text, dancefloor.SelectedItem.Text, griddate.Text, gridnotes.SelectedItem.Text, comments.Text);
        Finish.Visible = false;
        conform.Visible = true;
    }
}

Если я попытаюсь выполнить следующий код, я получу сообщение об ошибке

Сообщение 207, уровень 16, состояние 1, строка 3 Недопустимое имя столбца «Другой». Сообщение 207, уровень 16, состояние 1, строка 4 Недопустимое имя столбца «Другой».

хотя предикат для обоих IF утверждения всегда оцениваются как ложные.

CREATE TABLE #Foo (Bar INT)
GO
IF (1=0)
BEGIN
    SELECT Another FROM #Foo
END
GO
IF (1=0)
BEGIN
    ALTER TABLE #Foo ADD Another INT
    SELECT Another FROM #Foo 
END
GO
DROP TABLE #Foo

Это, вероятно, слишком упрощено для примера; на самом деле мне нужно выбрать значения из столбца, но только если столбец существует. Если его не существует, меня это не волнует. В проблеме, которая заставила меня задать этот вопрос, мой предикат был примерно таким: EXISTS (SELECT * FROM sys.columns WHERE object_id = @ID AND name = @Name). Есть ли способ добиться этого, не прибегая к моему заклятому врагу Dynamic SQL? Я понимаю, что мой SQL всегда должен быть правильно сформирован (т.е. соответствовать грамматике) — даже в блоке, который никогда не выполняется, — но я ошеломлен тем, что меня также заставляют сделать его семантически правильным!

EDIT:
Хотя я не уверен, что приведенный ниже код сильно добавляет к приведенному выше коду, это еще один пример проблемы. В этом сценарии я хочу установить только значение Определенно (которое определенно существует как столбец) со значением из Может (которое, возможно, существует как столбец), если Может быть.

IF EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.TableName', 'U') AND name = 'Maybe')
BEGIN
    UPDATE dbo.TableName SET Definitely = Maybe
END

Whenever I submit my form, it gives me an error code:

«invalid column name» for all of the eventspecialist, phone, phon2, etc. and @SPECIALIST, @CUST_PHONE, @CUST_PHONE2, etc.

Here is my code below, perhaps I’m not writing the SQL statement or parameters correctly? The ones with @ infront are what’s in my database, and the other lowercase ones are my textboxes. I’m relatively new to this type of coding.

Edit: Changed my INSERT INTO statement to what was suggested. The error still persists, but is only minimized to

«Invalid column name eventspecialist, Invalid column name phone, Invalid column name phone2, etc.»

private void execution(string eventspecialist, string phone, string phone2, string firstname, string lastname, string besttime, string companyname, string nonprofit, string requesteddate, string requestedtime, string attendance, string eventtype, string other, string leadsource, string notes, string catering, string bar, string damagedeposit, string dancefloor, string griddate, string gridnotes, string comments)
{
    SqlConnection conn = new SqlConnection(GetConnectionString());

    string sql = "INSERT INTO tblcontacts (@SPECIALIST, @CUST_PHONE1, @CUST_PHONE2, @CUST_FNAME, @CUST_LNAME, @BEST_TIME, @COMPANY_NAME, @NONPROFIT, @REQ_DATE, @REQ_TIME, @ATTENDANCE, @EVENT_TYPE, @OTHER_DESC, @LEAD_SOURCE, @NOTES, @CATERING, @BAR, @DAMAGE_DEPOSIT, @DANCE_FLOOR) VALUES (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor)";
    string sql2 = "INSERT INTO tblnotes (@NOTEDATE, @NOTEBY, @COMMENTS) VALUES (griddate, gridnotes, comments)";

    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);

        cmd.Parameters.Add("@SPECIALIST", SqlDbType.NVarChar, 50).Value = eventspecialist;
        cmd.Parameters.Add("@CUST_PHONE1", SqlDbType.NVarChar, 50).Value = phone;
        cmd.Parameters.Add("@CUST_PHONE2", SqlDbType.NVarChar, 50).Value = phone2;
        cmd.Parameters.Add("@CUST_FNAME", SqlDbType.NVarChar, 50).Value = firstname;
        cmd.Parameters.Add("@CUST_LNAME", SqlDbType.NVarChar, 50).Value = lastname;
        cmd.Parameters.Add("@BEST_TIME", SqlDbType.NVarChar, 50).Value = besttime;
        cmd.Parameters.Add("@COMPANY_NAME", SqlDbType.NVarChar, 225).Value = companyname;
        cmd.Parameters.Add("@NONPROFIT", SqlDbType.NVarChar, 10).Value = nonprofit;
        cmd.Parameters.Add("@REQ_DATE", SqlDbType.Date, 20).Value = requesteddate;
        cmd.Parameters.Add("@REQ_TIME", SqlDbType.Time, 20).Value = requestedtime;
        cmd.Parameters.Add("@ATTENDANCE", SqlDbType.Int, 50).Value = attendance;
        cmd.Parameters.Add("@EVENT_TYPE", SqlDbType.NVarChar, 50).Value = eventtype;
        cmd.Parameters.Add("@OTHER_DESC", SqlDbType.NVarChar, 225).Value = other;
        cmd.Parameters.Add("@LEAD_SOURCE", SqlDbType.NVarChar, 50).Value = leadsource;
        cmd.Parameters.Add("@NOTES", SqlDbType.NVarChar, 225).Value = notes;
        cmd.Parameters.Add("@CATERING", SqlDbType.NVarChar, 1).Value = catering;
        cmd.Parameters.Add("@BAR", SqlDbType.NVarChar, 1).Value = bar;
        cmd.Parameters.Add("@DAMAGE_DEPOSIT", SqlDbType.NVarChar, 19).Value = damagedeposit;
        cmd.Parameters.Add("@DANCE_FLOOR", SqlDbType.Money).Value = Decimal.Parse(dancefloor);


        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex_msg)
    {
        string msg = "Error occured while inserting";
        msg += ex_msg.Message;
        throw new Exception(msg);
    }
    finally
    {

        conn.Close();
    }
    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql2, conn);

        cmd.Parameters.Add("@NOTEDATE", SqlDbType.Date, 50).Value = griddate;
        cmd.Parameters.Add("@NOTEBY", SqlDbType.NVarChar, 50).Value = gridnotes;
        cmd.Parameters.Add("@COMMENTS", SqlDbType.NVarChar, 50).Value = comments;

        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.SqlClient.SqlException ex_msg)
    {
        string msg = "Error occured while inserting";
        msg += ex_msg.Message;
        throw new Exception(msg);
    }
    finally
    {

        conn.Close();
    }

}
protected void Page_Load(object sender, EventArgs e)
{
    griddate.Text = DateTime.Now.ToString("yyyy/MM/dd");
}
protected void submit_Click(object sender, EventArgs e)
{
    if (requesteddate.Text == "")
    {
        Finish.Text = "Please complete the form!";
    }
    else if (requestedtime.Text == "")
    {
        Finish.Text = "Please complete the form!";
    }
    else if (attendance.Text == "")
    {
        Finish.Text = "Please complete the form!";
    }
    else
    {
        execution(eventspecialist.Text, phone.Text, phone2.Text, firstname.Text, lastname.Text, besttime.SelectedItem.Text, companyname.Text, nonprofit.Text, requesteddate.Text, requestedtime.Text, attendance.Text, eventtype.SelectedItem.Text, other.Text, leadsource.SelectedItem.Text, notes.Text, catering.Text, bar.Text, damagedeposit.Text, dancefloor.SelectedItem.Text, griddate.Text, gridnotes.SelectedItem.Text, comments.Text);
        Finish.Visible = false;
        conform.Visible = true;
    }
}

Ошибка СУБД

Я
   gzd

26.05.10 — 05:51

При формирование отчета «Журнала учета выданных счет фактур» в БП8 на скуле вылетает ошибка СУБД:

Microsoft OLE DB Provider for SQL Server: недопустимое имя столбца «_Fld5097RRef».

HRESULT=80040E14,HRESULT=80040E14,HRESULT=80040E14 и т.д

В чем может быть причина?!

   LORD

1 — 26.05.10 — 07:07

места нет на диске, там где скульная база лежит, скорее всего..

   Шляпентох

2 — 26.05.10 — 07:20

(0) Сделайте бэкап и проведите «тестирование и исправление» в 1С. Судя по тексту ошибки проблема со структурой — 1С думает, что в какой-то таблице должно быть поле _Fld5097RRef, а SQL Server с ним категорически не согласен.

   gzd

3 — 26.05.10 — 07:22

хорошо попробую

   gzd

4 — 26.05.10 — 08:09

хм, эта ошибка субд только под пользователем у кого нету полных прав, конфа БП 2.0.12

   vde69

5 — 26.05.10 — 08:16

(4) значит или деМоническое обновление или в запросе нету слова РАЗРЕШЕННЫЕ

   gzd

6 — 26.05.10 — 08:24

(5) кэш почистил, РАЗРЕШЕННЫЕ в запросе есть, типовой ведь отчет

   gzd

7 — 26.05.10 — 08:25

+конечно используем RLS ограничение по организациям

   ARIST_A

8 — 26.05.10 — 08:39

(0) Если очистка кэша не помогает, значит это ошибка в генерации запроса платформой. Включите ТЖ и смотрите на каком запросе падает. И на линию консультаций 1С.

   gzd

9 — 26.05.10 — 10:43

собственно падает при получение в запросе поля ДокументыОснования документа СчетФактурыВыданные, по-моему проблема в кривой типовой роли — Бухгалтер =(

   shuhard

10 — 26.05.10 — 11:05

(9) отключи RLS и проверь

   gzd

11 — 26.05.10 — 11:18

(10) тоже самое, в настройках программы отключил, также падает с ошибкой СУБД при пользователи без полных прав =(

   Шляпентох

12 — 26.05.10 — 11:24

(11) ТИИ ошибок не нашло? ТЖ на сервере вы включали?

   gzd

13 — 26.05.10 — 11:43

пока еще нет, руки не доходили, сейчас разворачивается архивная копия на ней ТИИ запущу и ТЖ с ошибкой посмотрю

   gzd

14 — 26.05.10 — 12:14

после тестирования вылетает ошибка
Ошибка СУБД:
Ошибка SQL: Поле не найдено ‘_Fld5097RRef’
по причине:
Ошибка SQL: Поле не найдено ‘_Fld5097RRef’

   sapphire

15 — 26.05.10 — 12:26

Бекап обязательно.

Сохранить конфигурацию в файл — загрузить конфигурацию из файла.

   sapphire

16 — 26.05.10 — 12:26

речь о cf

  

gzd

17 — 26.05.10 — 12:31

(15) см (13)
Вообщем косяк найден, это платформа, верней режим совместимости стоял — не использовать, поставил — версия 8.1 и всё заработало

TurboConf — расширение возможностей Конфигуратора 1С

Имеется запрос:

SELECT ПК.КодП, ПК.КодК, ПК.Совм, Н.УчебныйГ, ПК.Ставок, 
    IIF((select ЗначениеЛогическое from НагПарамС where Код = 27) = 0, 0, 1) AS Коэф, 
    IIF(Коэф = 0, 
        SUM(ISNULL(Н.НагрузкаАуд, 0) + ISNULL(Н.НагрузкаДр, 0)) * Н.НормКоэф, 
        SUM(ISNULL(Н.НагрузкаАуд, 0)) + SUM(ISNULL(Н.НагрузкаДр, 0)) * Н.НормКоэф
       ) AS ЧасовЧ 
FROM dbo.ПреподКаф AS ПК INNER JOIN dbo.Нагрузка AS Н ON ПК.Код = Н.КодД 
WHERE Н.УчебныйГ = '2018-2019' AND Н.УчебныйГ = ПК.УчебныйГ AND (Н.КодК = '11') 
GROUP BY ПК.КодП, ПК.КодК, ПК.Совм, Н.УчебныйГ, ПК.Ставок 
HAVING(ЧасовЧ > ПК.Ставок * 900 ) 
ORDER BY ПК.КодК, Н.УчебныйГ, ЧасовЧ

При его выполнении возникает 2 ошибки:

Сообщение 207, уровень 16, состояние 1, строка 10
Недопустимое имя столбца "ЧасовЧ".
Сообщение 207, уровень 16, состояние 1, строка 3
Недопустимое имя столбца "Коэф".

В интернете видел примеры запросов, где таким же ключевым словом «as» объявлялся столбец и затем беспроблемно использовался в конструкции Having. Что исправить в запросе, чтобы и у меня работало? Использую SQL Server 18.

Понравилась статья? Поделить с друзьями:
  • Ошибка субд не удалось найти объект
  • Ошибка субд не удалось выделить место для объекта
  • Ошибка субд не удается получить ресурс lock
  • Ошибка субд не удается место для объекта
  • Ошибка субд компоненты ole db провайдера не найдены cocreateinstance