问题描述 投票:0回答:1

public DataTable findInternalID(string name) { RecordConnection.Open(); DataTable output = new DataTable(); OleDbCommand bdCommand = RecordConnection.CreateCommand() as OleDbCommand; StringBuilder x = new StringBuilder(); // SELECT InternalID FROM EmployeeList WHERE Name = "(name)" x.AppendLine("SELECT InternalID "); x.AppendLine("FROM EmployeeList "); x.AppendLine($"WHERE Name LIKE '%{name}%'"); bdCommand.CommandText = x.ToString(); _dataAdapter = new OleDbDataAdapter(bdCommand); _dataAdapter.Fill(output); RecordConnection.Close(); return output; }

该代码块适合员工只有一个记录,但是对于具有多个记录的员工,由于这一行,它将同时填充所有内部INTERDID记录和输出:

x.AppendLine($"WHERE Name LIKE '%{name}%'");

因此,我试图将类似的关键字更改为“ =”:

x.AppendLine($"WHERE Name = '%{name}%'");

但这给了我一个错误。
如何编辑代码,因此,当输入“ John Smith”仅输出“ 52455”并输入“ John Smith”仅输出“ 49”。

在主函数下,我编写了一个代码来测试此功能:

  string name = "John Smith"; // or John smith
  DataTable output = _accessManager.findInternalID(name);
         
  String message = result.Rows[0][0].ToString(); // Or ROWS[1][0]
  MessageBox.Show(message);

BTW,我使用MS Access:)

=================解决问题! ===================
我非常感谢大家帮助我。我考虑了每个人的建议,这是我的最终代码。我使用了

StrComp()

功能,非常适合在MS访问中执行对案例敏感的SQL查询:

public DataTable findInternalID(string name) { RecordConnection.Open(); DataTable output = new DataTable(); OleDbCommand bdCommand = RecordConnection.CreateCommand() as OleDbCommand; StringBuilder x = new StringBuilder(); x.AppendLine("SELECT InternalID "); x.AppendLine("FROM EmployeeList "); x.AppendLine($"WHERE StrComp(Name, @name, 0) = 0;"); bdCommand.CommandText = x.ToString(); bdCommand.Parameters.AddWithValue("name", $"{name}"); _dataAdapter = new OleDbDataAdapter(bdCommand); _dataAdapter.Fill(output); RecordConnection.Close(); return output; }

即将使用MS Access,几个注释供将来参考,那么
COLLATE

varbinary(MAX)

不是适合您的功能。

对于初学者,您绝对不应通过将用户置换到查询字符串中来构建SQL查询。这样做会使您容易受到

SQL注入的影响。相反,您应该使用查询参数将用户提供的数据传递给查询。
重写您的原始功能以使用参数可能看起来像这样:

public DataTable findInternalID(string name)
{
    RecordConnection.Open();
    var output = new DataTable();
    var bdCommand = RecordConnection.CreateCommand() as OleDbCommand;
    var x = new StringBuilder();

    // SELECT InternalID FROM EmployeeList WHERE Name = "(name)"
    x.AppendLine("SELECT InternalID ");
    x.AppendLine("FROM EmployeeList ");
    x.AppendLine("WHERE Name LIKE @name");

    bdCommand.CommandText = x.ToString();
    bdCommand.Parameters.AddWithValue("name", $"%{name}%");
    _dataAdapter = new OleDbDataAdapter(bdCommand);
    _dataAdapter.Fill(output);

    RecordConnection.Close();
    return output;
}

为了获得案例敏感的查询,我不能说我实际上已经做到了。假设您的数据库是SQL Server。

COLLATE
或者,也许要比较字节?

x.AppendLine("SELECT InternalID "); x.AppendLine("FROM EmployeeList "); x.AppendLine("WHERE Name = @name COLLATE Latin1_General_CP1_CS_AS");
c# sql database ms-access stringbuilder
1个回答
6
投票
也是最后一个注意,您真的不需要使用

varbinary(MAX)。如果要跨多行格式化语句,则可以将逐字化x.AppendLine("SELECT InternalID "); x.AppendLine("FROM EmployeeList "); x.AppendLine("WHERE CAST(Name as varbinary(MAX)) = CAST(@name AS varbinary(MAX))");

StringBuilder

标识符一起使用。
string

在SQL Server中,您只需要对病例敏感的搜索,请尝试此!

@


在MS-Access中,尝试这个!

string commandText = @"SELECT InternalId
FROM EmployeeList
WHERE Name = @name COLLATE Latin1_General_CP1_CS_AS";
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.