Не удается загрузить 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#.