当我使用这段代码时,它会返回表格中的每一行,我不明白为什么。
string SelectOleDb = "SELECT Top 1 * From `Employee Info` Where [Employee Name]=@EmployeeName" Order By ID DESC";
OleDbConnection OleDbCon = new OleDbConnection(EmployeeInfo.Properties.Settings.Default.cstrEmployeeInfoDatabase);
OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter();
OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon);
OleDbCom.Parameters.AddWithValue("@EmployeeName", employee_NameComboBox.Text);
OleDbAdpt.SelectCommand = OleDbCom;
DataSet FooDS = new DataSet();
OleDbCon.Open();
OleDbAdpt.Fill(FooDS);
OleDbCon.Close();
OleDbCon.Dispose();
DataTable EmployeeInfo = FooDS.Tables[0];
我甚至将“员工姓名”列中的值粘贴到文本框中以验证我使用的是有效的员工姓名。如果声明不正确,我希望不会返回任何内容而不是一切。
更新:我还尝试删除命名参数“@EmployeeName”并输入由单引号括起来的硬编号名称。然而,仍然声明返回员工信息中的所有内容
答案 0 :(得分:3)
看起来你正在使用两个不同的DataSet
:
DataSet FooDS = new DataSet(); // <-- FooDS?
OleDbCon.Open();
OleDbAdpt.Fill(ExpediteDS); // <-- filing a different dataset?
OleDbCon.Close();
OleDbCon.Dispose();
DataTable EmployeeInfo = FooDS.Tables[0]; // <-- not the dataset you just filled!
如果这是复制/粘贴错误,请将您的代码完全发布 - 如果您尝试“虚拟”代码,那么您将导致人们追逐兔子而不是揭露真正的问题。
答案 1 :(得分:1)
其他人已经表示OleDb需要一个?并且它不接受命名参数。这是错误的。我修复了我的代码,它正在运行。手头的问题是Statement声明需要不同的方法来定义空格。
使用OleDB连接时,Table Name如果有一个空格必须是EITHER`(Ticks),或者两者都是一样的。
当列名为空格时,会开始出现混淆。构建语句时所有列名称必须具有_(Under Score)以代替列名称的空格。虽然'(Ticks)和列名都是可选的。所有必需的是用“(得分)
替换”(空格)令人困惑的是,表名必须具有`(Ticks),或者如果你用_(替换)替换“”(空格),它将找不到表格。
我的固定代码:
string SelectOleDb = "SELECT Top 1 * From [Employee Info] Where Employee_Name= @EmployeeName Order By ID DESC";
OleDbConnection OleDbCon = new OleDbConnection(EmployeeInfo.Properties.Settings.Default.cstrEmployeeInfoDatabase);
OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter();
OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon);
OleDbCom.Parameters.AddWithValue("@EmployeeName", employee_NameComboBox.Text);
OleDbAdpt.SelectCommand = OleDbCom;
DataSet EmployeeInfoDS = new DataSet();
OleDbCon.Open();
OleDbAdpt.Fill(EmployeeInfoDS);
OleDbCon.Close();
OleDbCon.Dispose();
DataTable EmployeeInfoDT = EmployeeInfoDS.Tables[0];
答案 2 :(得分:0)
OLE DB .NET提供程序不支持传递的命名参数 SQL语句或由a调用的存储过程的参数 CommandType设置为Text时的OleDbCommand。在这种情况下, 必须使用问号(?)占位符。
我尝试使用?的查询变体和与SQL Server的OLEDB连接?它按预期工作。使用命名参数失败。
根据要求,以下是样本:
string SelectOleDb = "SELECT Top 1 * From users Where [application_user_name]=? Order By application_user_id DESC";
OleDbConnection OleDbCon = new OleDbConnection("Provider=SQLOLEDB;Data Source=SERVER\\INSTANCE;Initial Catalog=samples;Trusted_Connection=yes");
OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter();
OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon);
OleDbCom.Parameters.AddWithValue("@EmployeeName", "smith");
OleDbAdpt.SelectCommand = OleDbCom;
DataSet ExpediteDS = new DataSet();
DataSet FooDS = new DataSet();
OleDbCon.Open();
OleDbAdpt.Fill(ExpediteDS);
OleDbCon.Close();
OleDbCon.Dispose();
值得注意的是,对于OLEDB,参数顺序很重要。您必须按照希望它们在查询中引用的顺序将它们添加到ParameterCollection中。