Member 13851020 Ответов: 4

Как я могу решить требуемую ошибку ссылки на объект csharp?


Здравствуйте, я пытаюсь создать список, который отображает простой список с сотрудниками (медеверкеры), однако я получаю ошибку:

CS0120 ссылка на объект требуется для нестатического поля, метода или свойства 'Verzamel.GetAllMedewerkers(строка)'

<public void LoadMedewerkers()
        {
           
           lblMedewerkers.Items.Clear();

          
            string filter = "";
            List<medewerkers> medewerkers = Verzamel.GetAllMedewerkers(filter);

            
            foreach (Medewerkers s in medewerkers)
            {
                lblMedewerkers.Items.Add(s);
            }
        }


Верзамель.GetAllMedewerkers ссылается на этот класс:

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

namespace TimeReg
{
    class Verzamel
    {

        private static string connectionString = ConfigurationManager.ConnectionStrings["TimeReg.Properties.Settings.TimeRegConnectionString"].ConnectionString;
        private SqlConnection conn = new SqlConnection(connectionString);

        
        List<medewerkers> medewerkers = new List<medewerkers>();
                

       public List<medewerkers> GetAllMedewerkers(string filter)
        {

            medewerkers = new List<medewerkers>();


            string query = "SELECT M.* FROM Medewerkers M";
                       
            if (filter != "")
            {
                query += " WHERE Voornaam LIKE '%" + filter + "%' OR Achternaam LIKE '%" + filter + "%'";
            }

 
            conn.Open();
            SqlCommand cmd = new SqlCommand(query, conn);


            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {

                    Medewerkers Medewerker = new Medewerkers();

              
                    Medewerker.Personeelsnummer = reader.GetInt32(0);
                    Medewerker.LoginID = reader.GetInt32(1);
                    Medewerker.Voornaam = reader.GetString(2);
                    Medewerker.Tussenvoegsel = reader.GetString(3);
                    Medewerker.Achternaam = reader.GetString(4);

                   
                    medewerkers.Add(Medewerker);
                }
            }

            conn.Close();
            return medewerkers;
        }
    }
}


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

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

Что мне нужно сделать?

Любая помощь будет оценена.

Заранее спасибо.

4 Ответов

Рейтинг:
8

Member 13851020

Я должен был прийти пораньше

Теперь я получаю ошибку:

System.NullReferenceException
  HResult=0x80004003
  Message=De objectverwijzing is niet op een exemplaar van een object ingesteld.
  Source=TimeReg
  StackTrace:
   at TimeReg.Medewerker.LoadMedewerkers() in 
\source\repos\TimeReg\Medewerker.cs:line 33
   at TimeReg.Medewerker..ctor() in 
\source\repos\TimeReg\Medewerker.cs:line 22
   at TimeReg.Form1.button3_Click(Object sender, EventArgs e) in \source\repos\TimeReg\Form1.cs:line 201
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at TimeReg.Program.Main() in 


Это ошибка, которая говорит, что objectreference не находится на объекте, я получаю это на

List<medewerkers> medewerkers = Verzamel.GetAllMedewerkers(filter);


Jinto Jacob

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

Рейтинг:
1

OriginalGriff

Цитата:
Это ошибка, которая говорит, что objectreference не находится на объекте, я получаю это на

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!


Рейтинг:
0

Jochen Arndt

Функция Verzamel.GetAllMedewerkers(string filter) это не статическая функция. Таким образом, вам нужен экземпляр Verzamel класс для вызова этой функции:

// Create an instance of the Verzamel class 
//  (or use an already existing instance)
//Verzamel verz;
Verzamel verz = new Verzamel();
// Use the instance to call a member function
List<medewerkers> medewerkers = verz.GetAllMedewerkers(filter);
В качестве альтернативы сделайте функцию static Тогда вы можете называть его как раньше.
[РЕДАКТИРОВАТЬ]
public static List<medewerkers> GetAllMedewerkers(string filter)
{
    // Must use a local variable instead of the class member when
    //  this method is static and the member variable is not static
    List<medewerkers> medewerkers = new List<medewerkers>();

    // Similar for conn but not for connectionString which is static
    SqlConnection conn = new SqlConnection(connectionString);

    // ...
    return medewerkers;
}
[/РЕДАКТИРОВАТЬ]
[EDIT2]
Ваша функция также всегда возвращает пустой список, потому что вы создаете новый список внутри цикла и добавляете в него данные. В конце каждой итерации цикла этот локальный список выходит за пределы области видимости и удаляется. В результате переменная-член по-прежнему пуста:
while (reader.Read())
{
    // DELETE THIS!
    //Medewerkers Medewerker = new Medewerkers();
                  
    // ...
    
    medewerkers.Add(Medewerker);
}
[/EDIT2]


Richard Deeming

"... вы создаете новый список внутри цикла и добавляете в него данные ..."

Вы в этом уверены? :)

Jochen Arndt

Вы правы.

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

Это была просто попытка ответить на его проблемы, опубликованные как решенные решения.

Надо было придерживаться ответа на первоначальный вопрос.

Рейтинг:
0

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость в вашем коде.

Если вы хотите вызвать метод, используя имя класса, а не экземпляр класса, то метод должен быть static.

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

Так как все в классе теперь есть static, вы можете пометить сам класс как static Это предотвратит случайное добавление в него членов экземпляра.

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

static class Verzamel
{
    private static readonly string connectionString = ConfigurationManager.ConnectionStrings["TimeReg.Properties.Settings.TimeRegConnectionString"].ConnectionString;
    
    public static List<Medewerkers> GetAllMedewerkers(string filter)
    {
        List<Medewerkers> medewerkers = new List<Medewerkers>();
        
        using (SqlConnection conn = new SqlConnection(connectionString))
        using (SqlCommand cmd = new SqlCommand("", conn))
        {
            string query = "SELECT M.Personeelsnummer, M.LoginID, M.Voornaam, M.Tussenvoegsel, M.Achternaam FROM Medewerkers M";
            
            if (!string.IsNullOrEmpty(filter))
            {
                query += " WHERE M.Voornaam LIKE @filter OR M.Achternaam LIKE @filter";
                cmd.Parameters.AddWithValue("@filter", "%" + filter + "%");
            }
            
            cmd.CommandText = query;
            
            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    medewerkers.Add(new Medewerkers
                    {
                        Personeelsnummer = reader.GetInt32(0),
                        LoginID = reader.GetInt32(1),
                        Voornaam = reader.GetString(2),
                        Tussenvoegsel = reader.GetString(3),
                        Achternaam = reader.GetString(4),
                    });
                }
            }
        }
        
        return medewerkers;
    }
}


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]