2016-02-08 2 views
-3

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

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

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. 
+0

Каково фактическое значение _stitem_ Вы используете конкатенацию строк, очень плохо на многих уровнях, включая наличие одной кавычки в вашем значении. И если t_item является текстовым полем, вам нужны кавычки вокруг переменной – Steve

ответ

0

Если драйвер Informix ODBC говорит: «А произошла синтаксическая ошибка ", тогда вы должны проверить свой оператор SQL:

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

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

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

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

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#.