Arhn - архитектура программирования

System.Data.SqlClient.SqlException: недопустимое имя столбца

Пытаясь создать набор записей, мне нужен только один столбец данных, но этот код выдает ошибку. Я новичок в ASP.NET, может ли кто-нибудь помочь?:

System.Data.SqlClient.SqlException: недопустимое имя столбца «CustomerName».

 using (SqlConnection con = new SqlConnection(DB.GetDBConn()))
 {
  con.Open();
  using (IDataReader dr = DB.GetRS("select CustomerName from Customer where CustomerID=" + Customer.CustomerID, con))
   {
       string CustomerName = "CustomerName";                    
   }
 }

 String EncCustomerName = Encrypt(CustomerName.Replace(".", "").Replace("-", ""),"1");

Вопрос № 2: Как привязать содержимое базы данных к строке CustomerName? Кажется, что он возвращает только «CustomerName» в качестве значения для строки CustomerName. Я хотел бы, чтобы он возвращал данные базы данных для строки CustomerName.. Помогите?

Предлагается использовать ExecuteScalar, поэтому я изменил запрос на этот

   using (var con = new SqlConnection(DB.GetDBConn()))
   using (var cmdContrib = new SqlCommand("SELECT CustomerName FROM Customer WHERE   CustomerID=" + ThisCustomer.CustomerID, con))

   {

        con.Open();
        string CustomerName = cmdContrib.ExecuteScalar();
   } 

И я получаю эту ошибку: "string CustomerName = cmdCust.ExecuteScalar();"

CS0266: невозможно неявно преобразовать тип «объект» в «строку». Существует явное преобразование (вам не хватает приведения?)

03.09.2011

  • Попробуйте запустить запрос select CustomerName from Customer непосредственно в Management Studio. Бьюсь об заклад, вы найдете какую-то орфографическую ошибку (искренне не оскорбляя ваш интеллект, такие вещи случаются). 03.09.2011
  • ты прав, я не правильно подумал. Но теперь он не дает мне динамических данных. Он возвращает имя клиента в качестве значения переменной CustomerName, но мне нужны данные из базы данных, почему он не возвращает динамические данные? 03.09.2011
  • Вы явно устанавливаете CustomerName в CustomerName. Вам нужно получить доступ к фактическому значению столбца CustomerName из dr (что-то вроде string CustomerName = dr["CustomerName"];) 03.09.2011
  • @ jadarnel27: Хорошо, я сделал это, и он говорит .... ОШИБКА CS0266: Невозможно неявно преобразовать тип «объект» в «строку». Существует явное преобразование (вам не хватает приведения?) 03.09.2011
  • string CustomerName = dr["CustomerName"].ToString(); Я на Восточном побережье (США), сейчас 3 часа ночи. пойду спать =) удачи! 03.09.2011
  • Новая ошибка: CS0428: невозможно преобразовать группу методов «ToString» в тип «string», не являющийся делегатом. Вы намеревались вызвать метод? 03.09.2011
  • Эта строка, скорее всего, потерпит неудачу, так как позиция по умолчанию для чтения находится перед любыми записями. Читатель должен быть расширен с помощью метода Read(), прежде чем вы сможете извлекать значения. SqlCommand.ExecuteScalar будет лучшим вариантом в этом случае, IMO. 03.09.2011
  • @Wilkins - проверьте мой ответ, чтобы узнать о двух разных способах заставить это работать. 03.09.2011
  • @Wilkins - еще раз посмотрите на мой пример. Вы забыли часть Convert.ToString() около cmdContrib.ExecuteScalar(). ExecuteScalar возвращает объект - вы должны преобразовать его в правильный тип (строка, в данном случае). Итак, у вас должно быть CustomerGUID = Convert.ToString(cmdContrib.ExecuteScalar());. Также обратите внимание, что вы должны объявить строку CustomerGUID за пределами используемого вами блока, иначе вы не сможете получить к ней доступ за пределами этих блоков. 03.09.2011
  • Во-первых: здесь два вопроса, это невероятно фрагментировано. Во-вторых: оператор отвечает, что это не работает, недостаточно подробностей, чтобы быть полезным. 03.09.2011

Ответы:


1

Чтобы ответить на ваш второй вопрос:

// Set it here so you can access it outside the scope of the using statement
string CustomerName = "";

using (SqlConnection con = new SqlConnection(DB.GetDBConn()))
{
    con.Open();
    using (IDataReader dr = DB.GetRS("select CustomerName from Customer where CustomerID=" + Customer.CustomerID, con))
    {
        while (dr.Read())
            CustomerName = dr["CustomerName"].ToString();
        }                    
    }
 }

Если вы уверены, что получите только один результат CustomerName, использование DataReader будет излишним.

Пример SqlCommand.ExecuteScalar

string CustomerName = "";

using (SqlConnection con = new SqlConnection(DB.GetDBConn()))
{

    SqlCommand cmd = new SqlCommand("SELECT CustomerName FROM Customer WHERE CustomerID = " + Customer.CustomerID, con);
    cmd.CommandType = CommandType.Text;

    con.Open();

    CustomerName = Convert.ToString(cmd.ExecuteScalar());

}

метод SqlCommand.ExecuteScalar

Дополнительная информация

ExecuteScalar возвращает объект, поэтому вам необходимо преобразовать возвращаемое значение в правильный тип (в данном случае строку).

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

03.09.2011
  • что я должен использовать вместо этого, если все, что мне нужно, это один результат? 03.09.2011
  • Я не уверен, что такое DB, но вы можете использовать ADO.NET и метод SqlCommand.ExecuteScalar. Дайте мне знать, если вам нужен пример. 03.09.2011
  • я нашел пример, спасибо .. но он все еще дает мне ту же ошибку .. я опубликую новый код 03.09.2011

  • 2

    Это означает, что CustomerName или CustomerID не является допустимым столбцом в вашей базе данных. Проверьте свою таблицу еще раз.

    03.09.2011
  • Это допустимое имя столбца, вот в чем дело. 03.09.2011
  • @Wilkins В этом имени есть пробел? 03.09.2011

  • 3
    1. Убедитесь, что вы пытаетесь подключить правильную базу данных.
    2. См. Столбец CustomerName должен быть в таблице Customer. проверьте также орфографию
    03.09.2011
  • Добавьте имя схемы, например dbo.customer. 03.09.2011

  • 4

    Сначала отладьте и проверьте значение:

    DB.GetDBConn()
    

    Вы убедитесь, что вы собираетесь в Студии так же, как и в программе.

    Я думаю, что это написание где-то между БД и вашим кодом.

    Как только вы избавитесь от ошибки, вам нужно исправить это:

    {
           string CustomerName = "CustomerName";                    
       }
    

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

    03.09.2011
  • Я действительно не пользуюсь ридерами, но я предполагаю, что dr[CustomerName] даст вам результат — что вы хотите с ним делать? 03.09.2011

  • 5

    Попробуйте выполнить select * from customer where ... и поставьте точку останова на операторе using datareader. Затем используйте быстрый просмотр объекта чтения данных, чтобы изучить столбцы, представленные в наборе записей.

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

    Я согласен с Мадхуром выше, название вашего столбца написано неправильно. Или вы не подключаетесь к правильной БД.

    Надеюсь это поможет

    03.09.2011
  • Как привязать содержимое базы данных к строке CustomerName? Кажется, что он возвращает только CustomerName в качестве значения для строки CustomerName. Я хотел бы, чтобы он возвращал данные базы данных для строки CustomerName. 03.09.2011
  • Пожалуйста, обратитесь к комментарию jadarnel27 выше. Вам нужно изменить назначение строки для имени клиента. Пожалуйста, используйте строку customername = dr.GetString(dr.GetOrdinal(CustomerName)); или что-то типа того. 03.09.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..