我试图通过匹配我的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();
}
答案 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,这可以帮助您缩小根本原因。