【问题标题】:add list the Search a substring in C#添加列表在 C# 中搜索子字符串
【发布时间】:2020-07-18 17:51:42
【问题描述】:

我正在创建应用程序,但我有一个问题。

客户端在文本框中写入用户名,例如3个字母并在数据库中搜索(访问)并添加数据库。

示例:用户:Rui。 并在数据库中搜索所有名称用户“Rui”。

//libraries
using Microsoft.VisualStudio.OLE.Interop;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

private void textBox1_TextChanged(object sender, EventArgs e)
{
    OleDbConnection conexao = new OleDbConnection(string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= {0}\Teste.accdb", Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)));
        
    List<string> Users = new List<string>();

    
    OleDbCommand STK = new OleDbCommand($"SELECT NºCliente, NomeUser, CodigoPostal, NIF", conexao);
    STK.CommandText = $" SELECT* FROM MyTable WHERE Str(Lista_Pokemon) like '*{textBox1.Text}*'";

    User.Clear();
    //this code is invention, probably is wrong

    for(int d=0; d<Stk.Count()-1; d++)
         User.Add(...);
}

如果你能帮助我,谢谢。这个项目是c#,net framework,数据库是Access 2010。目前我不创建类,但如果你需要告诉我,我需要创建。

【问题讨论】:

  • 您的代码中有comando 和STK。你实际使用的是哪一个?
  • 对不起,stk...我的坏@AlexanderPetrov
  • 参数化你的查询,看起来容易受到 SQL 注入的攻击。

标签: c# list search oledb


【解决方案1】:

您需要创建一个 DbReader 并移动到下一行直到结束:

OleDbCommand STK = new OleDbCommand($"SELECT NºCliente, NomeUser, CodigoPostal, NIF", conexao);
STK.CommandText = $" SELECT * FROM MyTable WHERE Str(Lista_Pokemon) like '%{textBox1.Text}%'";

Users.Clear();

var reader = STK.ExecuteReader();
while (reader.Read())
    Users.Add(reader["Lista_Pokemon"].ToString());

将用户输入线程化到查询文本中被认为是一种危险的做法,在安全性方面也不是不安全的。 带参数最好“按书”行事:

OleDbCommand STK = new OleDbCommand();
STK.Connection = conexao;
STK.CommandText = "SELECT * FROM tblCliente WHERE User like @userParameter";
STK.Parameters.AddWithValue("@userParameter", $"%{textBox1.Text}%")

Users.Clear();

var reader = STK.ExecuteReader();
while (reader.Read())
    Users.Add(reader["User"].ToString());

【讨论】:

  • 谢谢老兄,但是在 var reader = STK.ExecuteReader() 中有一个错误:没有为一个或多个定义的参数提供值@dovid
  • 我不明白,'@' @dovid 的目标是什么
  • @Andrezila 您是否完全复制了我的代码?你用的是哪两个,第一个还是第二个?
  • 我复制第一个代码和第二个代码。但是有类似的问题。我不知道,为什么!?!?第二个我不明白'@'和阅读器中的第一个代码错误。如果有任何问题,我提供更多信息的代码!!!
  • @Andrezila 你能发布表格字段吗?
【解决方案2】:

看下面的代码。

using 运算符在这里用于释放资源——这很重要!

var dataSource = Path.Combine(
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
    "Teste.accdb");

var builder = new OleDbConnectionStringBuilder();
builder.Provider = "Microsoft.ACE.OLEDB.12.0";
builder.DataSource = dataSource;

var connectionString = builder.ToString();
var sql = "SELECT ..."; // place your query here

using (var connection = new OleDbConnection(connectionString))
{
    connection.Open();

    using (var command = new OleDbCommand(sql, connection))
    using (var reader = command.ExecuteReader())
    {
        var users = new List<User>();

        while (reader.Read())
        {
            var user = new User();

            user.ClientNumber = (int)reader["NºCliente"];
            user.UserName = (string)reader["NomeUser"];
            user.CodigoPostal = (string)reader["CodigoPostal"];
            user.NIF = (string)reader["NIF"];

            users.Add(user);
        }
        // return users; // Return data from method
    }
}

该类用于存储用户数据。
将属性名称和类型更改为您需要的。

class User
{
    public int ClientNumber { get; set; }
    public string UserName { get; set; }
    public string CodigoPostal { get; set; }
    public string NIF { get; set; }
}

当然,在 sql 查询中使用参数,正如 @dovid 在他的示例中所示。

【讨论】:

  • 感谢您的贡献。但是我没有使用sql,而是使用访问连接,System.Data.Oledb。在我的项目中使用 (var reader = command.ExecuteReader()) 时出现此错误:'查询表达式中的语法错误(缺少运算符)'...'。'
  • 我需要更改代码,但您的解决方案更好!
【解决方案3】:

感谢Alexander Petrov 和dovid,为我的问题提供了解决方案。但我“找到”了解决方案并发送了。

OleDbConnection conexao = new OleDbConnection(string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= {0}\Teste.accdb", Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)));

       OleDbCommand STK = new OleDbCommand("SELECT * FROM MyTable ORDER BY Id"); 
conexao.Open();
           comando.Connection = STK;

           var reader = comando.ExecuteReader();

var users = new List<User>();


while (reader.Read())
                   {
                       var user = new User();

                       user.ClientNumber = (reader["ClientNumber "]);
                       user.UserName= reader["UserName"];
                       user.CodigoPostal= reader["CodigoPostal"];
                       user.NIF= reader["NIF"];

                       users.Add(user);
                   }

class User
        {
            public string ClientNumber { get; set; }
            public string UserName { get; set; }
            public string CodigoPostal { get; set; }
            public string NIF { get; set; }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2020-01-01
    • 2014-08-30
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多