Объект не является набором записей ADODB = заполнение С#

Вопрос:

Я пытаюсь вернуть записи из моего БД доступа, сопоставляя число, выбранное в моем comboBox2, и возвращаю все строки по отношению к этому числу – это отлично работает в других проектах, но по какой-то причине я продолжаю получать связанную ошибку выше – любая помощь была бы приятной. ошибка находится на dap.Fill(dt, typeof (Int32)); – Когда я беру “typeof int32 out”, я получаю эту ошибку: “SYNTAX ERROR MISSING OPERATOR IN EXPRESSIONS” OCR = ‘; “

EDIT: если это имеет значение, я использую этот код в этом типе событий:

EDIT FIXED WIH HELP ИЗ ВСЕХ КОММЕНТАРИЙ – ФИКСИРОВАННЫЙ КОДЕКС СЕЙЧАС ДОБАВЛЯЕТСЯ ПОСЛЕ КОДА, КОТОРАЯ НЕ РАБОТАЕТ

comboBox2_SelectedValueChanged

   string strprovider = @"provider=microsoft.jet.oledb.4.0;data source=C:\Users\farrejos\Documents\inboxV2.mdb;persist security info=false";
OleDbConnection newConn = new OleDbConnection(strprovider);
System.Data.DataTable dt = new System.Data.DataTable();
//DataSet ds = new DataSet();
//ds.Tables.Add(dt);
OleDbDataAdapter dap = new OleDbDataAdapter("Select * from ocr where OCR = " + comboBox2.SelectedText.ToString() + "", newConn);

if (dap != null)
{
//dap.Fill(ds);

dap.Fill(dt, typeof(Int32));
}

//dap.Fill(ds, "ocr");

foreach (DataRow myRow in dt.Rows)
{
textBox3.Text = myRow[4].ToString();
textBox4.Text = myRow[6].ToString();
}
}

ФИКСИРОВАННЫЙ КОД:

  System.Data.DataTable dt = new System.Data.DataTable();
DataSet ds = new DataSet();

OleDbDataAdapter da = new OleDbDataAdapter("Select *  from ocr where [OCR] = " + comboBox2.SelectedText.ToString() + "", newConn);

da.Fill(dt);
foreach (DataRow myRow in dt.Rows)
{
textBox3.Text = myRow[4].ToString();

textBox4.Text = myRow[6].ToString();
}

Ответ №1

Сделайте так

 string strprovider = @"provider=microsoft.jet.oledb.4.0;data source=C:\Users\farrejos\Documents\inboxV2.mdb;persist security info=false";
OleDbConnection newConn = new OleDbConnection(strprovider);
System.Data.DataTable dt = new System.Data.DataTable();
DataSet ds = new DataSet();
//ds.Tables.Add(dt);
OleDbDataAdapter dap = new OleDbDataAdapter("Select * from ocr where OCR = " + comboBox2.SelectedText.ToString() + "", newConn);

if (dap != null)
{
dap.Fill(ds);
}

foreach (DataRow myRow in ds.Tables[0].Rows)
{
textBox3.Text = myRow[4].ToString();
textBox4.Text = myRow[6].ToString();
}
}

Ответ №2

Если ваше поле OCR является строковым полем, вам может потребоваться приложить значение ComboBox с помощью апострофов:

OleDbDataAdapter dap = new OleDbDataAdapter("Select * from ocr where OCR = '" + comboBox2.SelectedText.ToString() + "'", newConn);

РЕДАКТИРОВАТЬ

Я не делал этого через несколько лет, но я считаю, что OleDbDataAdapter иногда вызывал некоторые проблемы при использовании его с предложением where в конструкторе.

Попробуйте это вместо OleDbCommand?

            OleDbDataAdapter dap = new OleDbDataAdapter();
dap.SelectCommand = new OleDbCommand("Select * from ocr where OCR = " + comboBox2.SelectedText.ToString() + "", newConn);
dap.Fill(dt, typeof(Int32));

Изменить 2

Ваш оператор SQL использует “ocr” как имя таблицы, так и имя поля. Возможно, это амбициозность, с которой у провайдера возникают проблемы?

Измените его на:

Select * from [ocr] where [ocr].[OCR] = ...

Еще несколько идей, попробуйте в следующем порядке:

  • Вместо * укажите имена полей, которые вы хотите выбрать вручную.
  • Ввести имя таблицы с помощью [ ] скобок
  • Введите имена полей с помощью [ ] скобок

  • Перепишите свой код, чтобы использовать OleDbParameter для ваших запросов.

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

Ответ №3

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

    DataSet ds = new DataSet();
//ds.Tables.Add(dt);
string sql = String.Format("select * from [ocr] where [ocr].[OCR] = {0}", comboBox2.SelectedText);
System.Diagnostics.Debug.WriteLine(s);

OleDbDataAdapter dap = new OleDbDataAdapter(sql, newConn);

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

Оцените статью
TechArks.Ru
Добавить комментарий