TempoClick Ответов: 2

Метода commandbehavior.исключение метод sequentialaccess. Попытка считывания из столбца порядкового номера '0' недопустима.


Я использую
EntityDataReader
для заполнения
List<SelectListItem> products
из таблицы MS SQL, имеющей только один столбец типа "string": [prod_name_pharma_form]
Я получаю это исключение:
Attempt to read from column ordinal '0' is not valid.  With CommandBehavior.SequentialAccess, you may only read from column ordinal '1' or greater.'


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

Я использую этот код, который отлично работает с таблицами из более чем одного столбца:

<pre>public JsonResult AjaxProducts()
        {
            List<SelectListItem> products = new List<SelectListItem>();
            string query = "SELECT p.prod_name_pharma_form FROM Entities.FDF_FAMILY_PROD_NAME as p";
            using (EntityConnection con = new EntityConnection("name=Entities"))
            {
                using (EntityCommand cmd = new EntityCommand(query))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    con.Open();
                    using (EntityDataReader sdr = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
                    {
                        while (sdr.Read())
                        {
                            products.Add(new SelectListItem
                            {
                                Value = sdr["prod_name_pharma_form"].ToString(),
                                Text = sdr["prod_name_pharma_form"].ToString()
                            });
                        }
                    }
                }
            }

            return Json(products);
        }

Я понимаю, что с помощью "SequentialAccess" я должен читать (выбирать) столбцы в правильном порядке, чтобы избежать такого рода исключений, но что я делаю в случае наличия таблицы из одного столбца?

2 Ответов

Рейтинг:
16

F-ES Sitecore

Это может быть потому, что Вы читаете его дважды. Попробовать это

while (sdr.Read())
{
    string name = sdr["prod_name_pharma_form"].ToString();

    products.Add(new SelectListItem
    {
        Value = name,
        Text = name
    });
}


Maciej Los

Коротко И По Существу!

TempoClick

Работает отлично! Он читал колонку дважды. Спасибо.

Рейтинг:
0

#realJSOP

Поставить try/catch блокируйте свой код, чтобы вы могли его правильно отладить.

Кстати, вам не нужен псевдоним "p", если вы не делаете соединение.

Я бы также добавил чек, чтобы убедиться в этом sdr.HasRows это верно перед попыткой получить доступ к sdr объект, а также проверить, чтобы убедиться, что нужный столбец(ы) существует в схеме столбца, прежде чем пытаться получить значение нужного столбца(ов). Короче говоря, никогда не безопасно предполагать, что ваш набор данных будет содержать то, что вы ожидаете.


F-ES Sitecore

Нет необходимости в проверке строк, если в sdr нет строк, то код никогда не войдет в систему.

в то время как (sdr.Read())

block as sdr.Read() вернет false.

#realJSOP

Я всегда проверяю.

TempoClick

@John Simmons, спасибо за совет.