繁体   English   中英

当数据库表中的数据与我的 textBox1.text 上提供的输入相匹配时,如何向 select 写入命令?

[英]How can I write a command to select a data from a database table when it matches the input provided on my textBox1.text?

我正在开发一个 windows 应用程序,如果TextBox1上的输入与下面我的数据库表的Word列中的任何数据匹配,它将显示TextBox2同义词 我下面的代码只有output当我在Word列中输入任何单词时很高兴请问我该如何纠正和实现?

请参阅下面的表格和代码:

**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..*使用通用列表class 来存储将在文本框中以单行显示方式连接的值(如果未找到则为空字符串):

using System.Collections.Generic;
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);

我们可以使用多行文本框、列表框、上下文菜单或其他任何东西来管理多个结果。

预防SQL注入的好方法是什么?

AddWithValue sql 注入安全吗? 为什么?

SqlCommand 参数 Add 与 AddWithValue

Output

Fine

改进 - 重构

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

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM