C# 当数据库表中的数据与我的textBox1.text上提供的输入相匹配时,如何编写命令从数据库表中选择数据?

C# 当数据库表中的数据与我的textBox1.text上提供的输入相匹配时,如何编写命令从数据库表中选择数据?,c#,sql,database,C#,Sql,Database,我正在使用一个windows应用程序,如果TextBox1上的输入与下面数据库表的Word列中的任何数据匹配,则该应用程序会将同义词显示到TextBox2。当我在Word列中输入任何单词时,下面的代码仅输出joying 请问我如何纠正和实现这一点 请参见下面的我的表格和代码: **Id** **Word** **Synonym** 1 Happy Joyful 2 Sad Unhappy 3. Good Fine string constr = @&quo

我正在使用一个windows应用程序,如果TextBox1上的输入与下面数据库表的Word列中的任何数据匹配,则该应用程序会将同义词显示到TextBox2。当我在Word列中输入任何单词时,下面的代码仅输出joying 请问我如何纠正和实现这一点

请参见下面的我的表格和代码:

**Id**  **Word**    **Synonym**
1   Happy   Joyful
2   Sad     Unhappy
3.  Good    Fine


string constr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=…\Database1.mdf;Integrated Security=True";
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand("SELECT Synonym FROM Ant&Syn WHERE Id = 1"))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        sdr.Read();
                        textBox2.Text = sdr["Synonym"].ToString();
                    }
                }
                con.Close();

使用如下参数化查询如何

string matchingWord = TextBox1.text;
using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand("SELECT Synonym FROM Ant&Syn WHERE Word = @word"))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@word", matchingWord)
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        sdr.Read();
                        textBox2.Text = sdr["Synonym"].ToString();
                    }
                }
                con.Close();
            }

使用SQL参数

它执行查询以筛选要搜索的单词,并返回所有可用的同义词
0..*
,使用泛型类存储将在文本框中连成一行显示的值(如果未找到,则为空字符串):

改进-重构

我们可以创建一个方法并使用关键字返回:

改进-不区分大小写的比较

我们可以使用标志设置选项:

IEnumerable<string> GetSynonyms(string word, bool caseInsensitive)
{
  using ( var connection = new SqlConnection(connectionString) )
    try
    {
      connection.Open();
      using ( var command = connection.CreateCommand() )
      {
        string checkColumn = caseInsensitive ? "lower(Word)" : "Word";
        string checkMatch = caseInsensitive ? word.ToLower() : word;
        command.CommandText = "SELECT Synonym FROM [Ant&Syn] WHERE " + checkColumn + " = ?";
        command.Parameters.Add("@word", DbType.String).Value = checkMatch;
        using ( var reader = command.ExecuteReader() )
          while ( reader.Read() )
            yield return reader[0].ToString();
      }
    }
    finally
    {
      connection.Close();
    }
}
IEnumerable GetSynonyms(字符串字,布尔不区分大小写)
{
使用(var连接=新的SqlConnection(connectionString))
尝试
{
connection.Open();
使用(var command=connection.CreateCommand())
{
字符串检查列=不区分大小写?“较低(Word)”:“Word”;
字符串检查匹配=不区分大小写?word.ToLower():word;
command.CommandText=“从[Ant&Syn]中选择同义词,其中“+checkColumn+”=?”;
command.Parameters.Add(“@word”,DbType.String).Value=checkMatch;
使用(var reader=command.ExecuteReader())
while(reader.Read())
产生返回读取器[0]。ToString();
}
}
最后
{
connection.Close();
}
}

其中Id=1将始终检索相同的记录。您需要更改此条件以使用文本框中的字符串。搜索如何在中使用WHERE语句sql@Steve,谢谢你注意到了。我将阅读更多关于如何在中使用WHERE语句的内容sql@OlivierRogier,谢谢你给我介绍这个链接。这篇文章很有帮助。然而,我尝试了以下方法:从Ant&Syn中选择同义词,其中Word='“+TextBox1+”“不起作用。你有更好的建议给我吗。我是新来的。仍在学习接受的答案包含错误以及原始代码。您正在调用Read,但您不关心该读取的结果。如果没有匹配的记录,则没有要读取的内容,调用返回false。当Read返回false时,您不应该盲目地从读取器中提取值。非常感谢。我的程序在遵循了您的建议后,现在似乎正在按预期工作。不建议使用
AddWithValue
:哇!感谢您分享有关AddWithValue使用的这方面信息。非常有用。在编程的世界里有很多东西需要学习和发现,非常感谢。我已将其保存以供以后测试。我希望它能在VisualStudio2019中与LocalDB一起工作?正如我前面提到的,我真的很新,还在学习。所以请对我耐心点。我尝试了您的代码,但出现以下两个错误:第一个错误是:“当前上下文中不存在名称‘Builder’”。第二个错误是:“找不到类型或命名空间名称‘List’(是否缺少using指令或程序集引用?)
var synonyms = new List<string>();

using ( var connection = new SqlConnection(connectionString) )
  try
  {
    connection.Open();
    using ( var command = connection.CreateCommand() )
    {
      command.CommandText = "SELECT Synonym FROM [Ant&Syn] WHERE Word = ?";
      command.Parameters.Add("@word", SqlDbType.Text).Value = TextBox1.text;
      using ( var reader = command.ExecuteReader() )
        while ( reader.Read() )
          synonyms.Add(reader[0].ToString());
    }
  }
  finally
  {
    connection.Close();
  }

TextBox2.Text = string.Join(", ", synonyms);
IEnumerable<string> GetSynonyms(string word)
{
  using ( var connection = new SqlConnection(connectionString) )
    try
    {
      connection.Open();
      using ( var command = connection.CreateCommand() )
      {
        command.CommandText = "SELECT Synonym FROM [Ant&Syn] WHERE Word = ?";
        command.Parameters.Add("@word", SqlDbType.Text).Value = word;
        using ( var reader = command.ExecuteReader() )
          while ( reader.Read() )
            yield return reader[0].ToString();
      }
    }
    finally
    {
      connection.Close();
    }
}
var synonyms = GetSynonyms(TextBox1.text);
IEnumerable<string> GetSynonyms(string word, bool caseInsensitive)
{
  using ( var connection = new SqlConnection(connectionString) )
    try
    {
      connection.Open();
      using ( var command = connection.CreateCommand() )
      {
        string checkColumn = caseInsensitive ? "lower(Word)" : "Word";
        string checkMatch = caseInsensitive ? word.ToLower() : word;
        command.CommandText = "SELECT Synonym FROM [Ant&Syn] WHERE " + checkColumn + " = ?";
        command.Parameters.Add("@word", DbType.String).Value = checkMatch;
        using ( var reader = command.ExecuteReader() )
          while ( reader.Read() )
            yield return reader[0].ToString();
      }
    }
    finally
    {
      connection.Close();
    }
}