选择语句忽略参数

本文关键字:参数 语句 选择 | 更新日期: 2023-09-27 18:03:37

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

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];

我甚至将Employee Name列的值复制粘贴到文本框中,以验证我使用的是有效的员工名。如果语句不正确,我希望什么都不返回,而不是返回所有内容。

更新:我还尝试删除命名参数"@EmployeeName"并输入由单引号包围的硬编码名称。然而语句仍然返回Employee Info

选择语句忽略参数

中的所有内容

看起来你在使用两个不同的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!

如果这是一个复制/粘贴错误,请将你的代码准确地贴出 -如果你试图"假"你的代码,你会导致人们追兔子,而不是暴露真正的问题。

其他人表示OleDb需要一个?而且它不接受命名参数。这是错误的。我已经修复了我的代码,它正在工作。这里的问题是,Statement需要用不同的方式来定义空格。

与OleDB连接的表名,如果它有一个空格必须在' (Ticks)或两者将工作相同。

当列名带有空格时,混淆就开始了。在构建语句时,所有列名都必须用_ (Under Score)代替列名中的空格。而' (Ticks)和对于列名都是可选的。只需要将" "(空格)替换为_(under score)

增加混淆的事实是,表名必须有'(勾号)或,如果你用_(分数下)替换" "(空格),它将找不到表。

My fixed Code:

        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];

MSDN文档:

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

我尝试了一个变体的查询和OLEDB连接到SQL Server使用?正如预期的那样。使用命名参数失败。

按要求,样品如下:

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