0

当我使用此代码时,它会返回表中的每一行,我不知道为什么。

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”并输入用单引号括起来的硬线名称。然而,仍然声明返回员工信息中的所有内容

4

3 回答 3

3

看起来您正在使用两个不同DataSet的 s:

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!

如果这是一个复制/粘贴错误,请按原样发布您的代码- 如果您尝试“虚拟”您的代码,您将导致人们追逐兔子而不暴露真正的问题

于 2013-03-12T16:48:28.463 回答
1

其他人则表示 OleDb 需要一个 ? 并且它不接受命名参数。这是错误的。我已经修复了我的代码并且它正在工作。手头的问题是声明需要不同的方式来定义空间。

对于 OleDB 连接,如果表名有空格,则必须在 EITHER `(Ticks) 中,否则两者的工作方式相同。

当您的列名带有空格时,混乱就开始了。构建语句时,所有列名都必须有一个 _(下分)来代替列名的空格。虽然 `(Ticks) 和 列名都是可选的。所需要的只是用 _(under score) 替换 " "(Space)

更令人困惑的是,表名需要有 `(Ticks) 或者如果你用 _(under score) 替换“”(空格),它将找不到表。

我的固定代码:

        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];
于 2013-03-12T17:53:30.540 回答
0

正如 MSDN 所记录的

当 CommandType 设置为 Text 时,OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。

我尝试了您的查询的变体以及使用 ? 它按预期工作。使用命名参数失败。

根据要求,这是示例:

        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。

于 2013-03-12T17:02:05.720 回答