无法将 odbcdatareader 加载到数据表

Posted

技术标签:

【中文标题】无法将 odbcdatareader 加载到数据表【英文标题】:not able to load odbcdatareader to a datatable 【发布时间】:2016-02-08 16:19:30 【问题描述】:

我正在使用 Informix 数据库,我正在尝试获取特定项目的数据并将其存储在数据表中。

我检查了以下内容:

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.

【问题讨论】:

stitem 的实际值是多少 你使用字符串连接,在很多层面上都非常糟糕,包括你的值中存在单引号。如果 t_item 是一个文本字段,那么你需要在变量周围加上引号 【参考方案1】:

如果您的 Informix ODBC 驱动程序显示:“发生语法错误”,那么您必须检查您的 SQL 语句:

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

我认为stitem 有问题。我们不知道它是什么类型和值,但如果它的类型是某种字符串或日期,那么它可能是错误的形式。最简单的方法是提取完整的 SQL 语句(在执行之前简单地打印它)并将它与一些数据库编辑器一起使用(例如来自 Informix 的db_access)。然后让它在 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# 进行检查。

【讨论】:

以上是关于无法将 odbcdatareader 加载到数据表的主要内容,如果未能解决你的问题,请参考以下文章

什么会导致 OdbcDataReader 挂起?

ODBCDataReader 随机挂起?

无法将数据加载到gridview

无法将数据加载到配置单元表中

委托通过后无法将数据加载到tableview

无法将 Plist 中的数据加载到数组中