对象不是ADODB记录集= C#填充数据表

时间:2014-07-23 10:13:43

标签: c# sql string ms-access int

我试图通过匹配我的comboBox2中选择的数字从我的访问数据库中恢复记录,并返回与该数字相关的所有行 - 这在其他项目中运行良好但由于某种原因我不断得到相关上面的错误 - 任何帮助都会很好..错误是在dap.Fill(dt,typeof(Int32)); - 当我把“typeof int32 out”时,我收到此错误:“表达式中的语法错误丢失操作符'OCR =';”

编辑:如果它有所作为我在这种类型的事件中使用此代码:

编辑修复所有评论的帮助 - 现在修改后的代码加上

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();
        }

3 个答案:

答案 0 :(得分: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();
        }
    }

答案 1 :(得分:1)

如果您的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进行查询。

无论如何,我强烈建议您使用 parameterized queries 。这将帮助您直接解决语法问题,并帮助您防止SQL注入攻击。

答案 2 :(得分:1)

你需要开始分解你的代码,首先是因为它抱怨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,这可以帮助您缩小根本原因。