选择语句忽略参数?

时间:2013-03-12 16:39:12

标签: c# select oledb oledbconnection oledbdataadapter

当我使用这段代码时,它会返回表格中的每一行,我不明白为什么。

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

3 个答案:

答案 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)

As documented by MSDN

  

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中。