Не удается загрузить odbcdatareader в datatable

Я использую Informix db, и я пытаюсь получить данные для определенного элемента и сохранить их в базе данных.

Я проверил следующее:

1) строка подключения выглядит хорошо

2) соединение может открыться

3) Я использовал ту же строку подключения из web.config в наборе данных, создавая адаптер таблицы, и он мог получить запись.

Это код, который я использую:

var connectionstring = ConfigurationManager.ConnectionStrings["TestDataTable"].ConnectionString;
OdbcConnection con = new OdbcConnection(connectionstring);
//con.ConnectionString = connectionstring;
if (TxtItem.Text != hold_item)
{
    con.Open();
    OdbcCommand cmd = new OdbcCommand(@"Select t_item,t_idsc,t_upct,
                                        t_item_upc,t_ctyp,t_citg,
                                        t_best,t_disp,t_mold,t_csel 
                                        from informix.tsckcm907
                                        where t_item = " + stitem, con); 
    OdbcDataReader myReader = cmd.ExecuteReader();
    DataTable testdt = new DataTable();
    testdt.Load(myReader);
    foreach (DataRow row in testdt.Rows)
    {
       lbldesc.Text = row["t_idsc"].ToString();
       Spanish_Item();
       {
           DropDownList2.SelectedIndex = 1;
           object stlanguage = 1;
           hold_language = Convert.ToString(stlanguage);
           TxtBestBefore.Text = row["t_best"].ToString();
           holdbest = Convert.ToInt16(TxtBestBefore.Text);
       }
   }
   myReader.Close();
   myReader.Dispose();
   cmd.Dispose();
   con.Close();
   con.Dispose();
}

в режиме отладки моя ошибка возникает в строке OdbcDataReader: сообщение об ошибке:

An exception of type 'System.Data.Odbc.OdbcException' 
occurred in System.Data.dll but was not handled in user code

Additional information: ERROR [42000] [Informix]
[Informix ODBC Driver][Informix]A syntax error has 
occurred.

1 ответ

Если ваш драйвер ODBC Informix сообщает: "Произошла синтаксическая ошибка", вам необходимо проверить оператор SQL:

"Select t_item,...  from informix.tsckcm907 where t_item = " + stitem

Я думаю, что-то не так с stitem, Мы не знаем, какой это тип и значение, но если его типом является строка или дата, то он может быть в неправильной форме. Самый простой способ - извлечь полный оператор SQL (просто распечатать его перед выполнением) и использовать его с некоторым редактором базы данных (например, db_access от Informix). Затем заставьте это работать в редакторе SQL и преобразуйте stitem переменная в приемлемой форме (добавление кавычек, экранирование внутренних кавычек, экранирование специальных символов и т. д.)

Я также рекомендую использовать PreparedStatement, который отделяет ваш запрос от данных. Таким образом, вам не нужно беспокоиться о stitem форма. Без кавычек, без экранирования, просто место в строке запроса и добавленное значение отдельно.

Я не использую C#, но вижу, что C# может работать с предварительно подготовленными операторами с неназванными параметрами:

cmd.CommandText = "SELECT ... FROM ... WHERE t_item = ?";
cmd.Parameters.Add("@t_item", ObdcType.VarChar, 200).Value = t_item;

или с именованными параметрами:

cmd.CommandText = "SELECT ... FROM ... WHERE t_item = @t_item";
cmd.Parameters.Add("@t_item", ObdcType.VarChar, 200).Value = t_item;

Я использую неназванные параметры из ODBC, чтобы драйвер Informix мог работать с такими параметрами, но вам придется проверить это самостоятельно с помощью C#.

Другие вопросы по тегам