Member 13667386 Ответов: 2

Как исправить ошибку "в hrms возникло исключение типа 'system .nullreferenceexception'.dll, но не обрабатывается в пользовательском коде


мой код выглядит примерно так

 [HttpPost]
        public FileResult DownloadFile(int? fileId)
        {
            byte[] bytes;
            string fileName, contentType;
            string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = "SELECT Name, Data, ContentType FROM tblFiles WHERE Id=@Id";
                    cmd.Parameters.AddWithValue("@Id", fileId);
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        sdr.Read();
                        bytes = (byte[])sdr["Data"];
                        contentType = sdr["ContentType"].ToString();
                        fileName = sdr["Name"].ToString();
                    }
                    con.Close();
                }
            }

            return File(bytes, contentType, fileName);
        }

        private static List<FileModel> GetFiles()
        {
            List<FileModel> files = new List<FileModel>();
            string constr = ConfigurationManager.ConnectionStrings["Constring"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand("SELECT Id, Name FROM tblFiles"))
                {
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        while (sdr.Read())
                        {
                            files.Add(new FileModel
                            {
                                Id = Convert.ToInt32(sdr["Id"]),
                                Name = sdr["Name"].ToString()
                            });
                        }
                    }
                    con.Close();
                }
            }
            return files;
        }
    }
}


The error is on 
string constr=ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;

What I have tried:

<pre>my code looks like this

<pre> [HttpPost]
        public FileResult DownloadFile(int? fileId)
        {
            byte[] bytes;
            string fileName, contentType;
            string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = "SELECT Name, Data, ContentType FROM tblFiles WHERE Id=@Id";
                    cmd.Parameters.AddWithValue("@Id", fileId);
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        sdr.Read();
                        bytes = (byte[])sdr["Data"];
                        contentType = sdr["ContentType"].ToString();
                        fileName = sdr["Name"].ToString();
                    }
                    con.Close();
                }
            }

            return File(bytes, contentType, fileName);
        }

        private static List<FileModel> GetFiles()
        {
            List<FileModel> files = new List<FileModel>();
            string constr = ConfigurationManager.ConnectionStrings["Constring"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand("SELECT Id, Name FROM tblFiles"))
                {
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        while (sdr.Read())
                        {
                            files.Add(new FileModel
                            {
                                Id = Convert.ToInt32(sdr["Id"]),
                                Name = sdr["Name"].ToString()
                            });
                        }
                    }
                    con.Close();
                }
            }
            return files;
        }
    }
}


The error is on 
string constr=ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;

2 Ответов

Рейтинг:
20

OriginalGriff

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

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

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

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

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


Member 13667386

Мой контроллер выглядит следующим образом:
пространство имен HRMS.контроллеры
{
ссылку общественных класса : регулятор
{
// Получаю: файл
индекс общественного ActionResult ()
{
смотреть возвращение(заражен());
}

[HttpPost]
публичный индекс ActionResult(HttpPostedFileBase postedFile)
{
байт[] байт;
using (BinaryReader br = new BinaryReader(postedFile.Входной поток))
{
байты = br.ReadBytes(postedFile.ContentLength);
}
string constr = ConfigurationManager.ConnectionStrings["ConString"].Параметр connectionString;
using (SqlConnection con = new SqlConnection(constr))
{
string query = "вставить в tblFiles значения (@Name, @ContentType, @Data)";
используя (sqlcommand, который команду cmd = новый sqlcommand, который(запрос))
{
УМК.Подключение = кон;
cmd.параметры.AddWithValue ("@Name", Path.GetFileName(postedFile.имя файла));
cmd.параметры.AddWithValue ("@ContentType", postedFile.Значение contentType);
cmd.параметры.AddWithValue ("@Data", байты);
против.Открыть();
УМК.Метод executenonquery();
против.Закрывать();
}
}

смотреть возвращение(заражен());
}

[HttpPost]
public FileResult DownloadFile(int? идентификатор файла)
{
байт[] байт;
строковое имя файла, contentType;
string constr = ConfigurationManager.ConnectionStrings["ConString"].Параметр connectionString;
using (SqlConnection con = new SqlConnection(constr))
{
использование (SqlCommand cmd = new SqlCommand())
{
УМК.CommandText = "выберите имя, данные, ContentType из tblFiles, где Id=@Id";
cmd.параметры.AddWithValue("@Id", fileId);
УМК.Подключение = кон;
против.Открыть();
использование (SqlDataReader sdr = cmd.Метода executereader())
{
СДР.Читать();
байты = (байт[])sdr["данные"];
contentType = sdr["ContentType"].Метод toString();
fileName = sdr["имя"].Метод toString();
}
против.Закрывать();
}
}

возвращаемый файл(байты, contentType, fileName);
}

частный статический список<filemodel> GetFiles()
{
List<filemodel> files = новый список<filemodel>();
string constr = ConfigurationManager.ConnectionStrings["Constring"]!=null?Конфигурационный менеджер.ConnectionStrings["Constring"].Соединения:нуль;
using (SqlConnection con = new SqlConnection(constr))
{
используя (команда sqlcommand cmd и = новая команда sqlcommand("выбрать код, наименование из tblFiles"))
{
УМК.Подключение = кон;
против.Открыть();
использование (SqlDataReader sdr = cmd.Метода executereader())
{
в то время как (sdr.Read())
{
файлы.Добавить(новая файловая модель
{
Id = Конвертировать.ToInt32(sdr["Id"]),
Name = sdr["имя"].Метод toString()
});
}
}
против.Закрывать();
}
}
возврат файлов;
}
}
}

OriginalGriff

Мне все равно, как выглядит ваш контроллер - мы ничего не можем с ним сделать без ваших данных, к которым у нас нет доступа. Используйте отладчик и узнайте, что такое null, а затем начните искать почему.

Рейтинг:
1

jsc42

Вы говорите

The error is on 
string constr=ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;

Вы проверили, что ваш
ConfigurationManager.ConnectionStrings
имеет значение для Constring?

Кстати, в вашем ответе на @OriginalGriff у вас есть
string constr = ConfigurationManager.ConnectionStrings["Constring"]!=null?ConfigurationManager.ConnectionStrings["Constring"].ConnectionString:null;
что может быть упрощено до
string constr = ConfigurationManager.ConnectionStrings["Constring"]?.ConnectionString;
но строка не может быть обнулена, поэтому вы должны были бы
string constr = ConfigurationManager.ConnectionStrings["Constring"] == null ? "" : ConfigurationManager.ConnectionStrings["Constring"].ConnectionString;