【问题标题】:Search data in SQL在 SQL 中搜索数据
【发布时间】:2016-09-09 04:34:48
【问题描述】:

我想在数据库中搜索数据并将其放入数据表中,但我的 sql 命令似乎不正确,因为它没有返回任何数据。请帮忙。提前致谢。以下是我的代码,请检查。

        protected DataTable SearchResident(String name, String ConnStr)
    {
        DataTable dt = new DataTable();

        try
        {
            SqlCommand cmd;

            using (SqlConnection con = new SqlConnection(ConnStr))
            {
                con.Open();

                String SQL = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " +
                    "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " +
                    "WHERE FirstName LIKE '%name%' OR LastName LIKE '%name%'";

               using (cmd = new SqlCommand(SQL, con))
                {
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        dt.Load(sdr);
                    }
                }
            }
            return dt;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

【问题讨论】:

  • 我通常使用 SQL Server 附带的 SQL Server Management Studio (SSMS) 并在将查询添加到我的 c# 代码之前测试我的查询。 SSMS 非常易于使用,并且在查找查询中的错误方面做得更好。
  • 或者这个:String SQL = string.Format("SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " + "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " + "WHERE FirstName LIKE '%{0}%' OR LastName LIKE '%{0}%'", name);
  • 你忘记设置 SqlCommand
  • @Kushan 谢谢。但仍然没有返回任何东西
  • 仅当您插入数据库时​​。如果您不将值转换为不同的数据类型,则使用选择数据类型进行查询是查询的一部分。

标签: c# sql datatable


【解决方案1】:

您向string SQL 写了一个请求,但您没有在代码中使用它。示例 SQL 查询:

class SQLQuery
{
    public static DataSet SQLGetData(string ConnectionString, string commandString)
    {            
        DataSet DS = new DataSet();
        DataTable DT = new DataTable("Table1");
        DS.Tables.Add(DT);

        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {               
            try
            {
                connection.Open();
                SqlCommand command = new SqlCommand(commandString, connection);
                //command.CommandTimeout = 3000;
                SqlDataReader read = command.ExecuteReader();

                DS.Load(read, LoadOption.PreserveChanges, DS.Tables[0]);  
            }
            catch (SqlException e)
            {
                System.Windows.Forms.MessageBox.Show(e.Message);
            }
            finally
            {
                connection.Close();
            }               
        }
        return DS;
    }
}

并获取数据:

private DataTable SearchData (string name)
{
    DataTabel dt = new DataTable();

    string connStr; // connection string
    string command = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate,"+
                     "CivilStatus, Citizenship, MobileNo, Landline, PermanentAddress,"+
                     "Address FROM Residents WHERE FirstName LIKE '" + name + 
                     "' OR LastName LIKE '" + name + "'";

    dt = SQLQuery.SQLGetData(connStr, command).Tables[0];
    return dt;
}

【讨论】:

  • 唯一的问题是它容易被sql注入
  • 是的,它容易发生 sql 注入,而您忘记了 ''%" 符号。
【解决方案2】:

您需要一个 sql 命令,并将名称添加为参数:-

using (SqlConnection con = new SqlConnection(ConnStr))
            {
                con.Open();

                String SQL = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " +
                    "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " +
                    "WHERE FirstName LIKE '%@name%' OR LastName LIKE '%@name%'";
                var cmd = new SqlCommand(SQL, connection);
                cmd.Parameters.Add("@name", SqlDbType.Text);
                cmd.Parameters["@name"].Value = name;
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    dt.Load(sdr);
                }
            }

【讨论】:

  • 仍然没有返回任何东西。
【解决方案3】:

你可以这样使用:

protected DataTable SearchResident(String name, String ConnStr)
{           
    try
    {
        String SQL = "SELECT ID, LastName, FirstName, MiddleName, Gender, BirthDate, CivilStatus, " +
                    "Citizenship, MobileNo, Landline, PermanentAddress, Address FROM Residents " +
                    "WHERE FirstName LIKE '%@name%' OR LastName LIKE '%@name%'";

        using (SqlConnection sqlConn = new SqlConnection(ConnStr))
        using (SqlCommand cmd = new SqlCommand(SQL, sqlConn))
        {
            cmd.Parameters.AddWithValue("@name", name);

            sqlConn.Open();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());

            return  dt;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

还有一个建议,您正在邀请 SQL 注入。请使用参数化存储过程。

【讨论】:

  • 改变你的使用参数
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多