【问题标题】:SQL Server & C# : not returning any results [duplicate]SQL Server & C#:不返回任何结果[重复]
【发布时间】:2017-03-30 23:37:18
【问题描述】:
private void searchMulti(string searchType, string searchTerm)
    {
        {
            {
                var query = "";
                cb_Surname.Items.Clear();
                txt_patient_search.Clear();
                if (patient_NHSID.Equals(null) != true)
                {
                    pbar_search.Value = 2;
                    var connectionString = Settings.Default.CMTA_DBConnectionString;
                    using (var con = new SqlConnection(connectionString))
                    {
                        if (searchType != "NHSID")
                        {
                            query = @"SELECT * FROM Patient WHERE @p2 = '@p1' ";
                        }
                        else
                        {
                            query = @"SELECT * FROM Patient WHERE @p2 = @p1";
                        }

                        using (var qry_search = new SqlCommand(query))
                        {
                            qry_search.Connection = con;
                            qry_search.Parameters.Add("@p1", SqlDbType.VarChar).Value = searchTerm;
                            qry_search.Parameters.Add("@p2", SqlDbType.VarChar).Value = searchType;

                            con.Open();
                            qry_search.ExecuteNonQuery();
                            int firstIteration = 0;

                            using (var rdr = qry_search.ExecuteReader())
                            {
                                if (rdr.HasRows)
                                {
                                    //Found Valid Patient Event
                                    pbar_search.Value = 6;
                                    pbox_tick.Show();
                                    foundValidPatient = true;
                                    ////////////////////////////

                                    while (rdr.Read())
                                    {
                                        if (firstIteration == 0)
                                        {
                                            pbar_search.Value = 8;
                                            cb_Surname.Text = rdr.GetInt64(0) + " - " + rdr.GetString(1) + " - " +
                                                              rdr.GetString(2);
                                            firstIteration = 1;
                                        }
                                        cb_Surname.Items.Add(rdr.GetInt64(0) + " - " + rdr.GetString(1) + " - " +
                                                             rdr.GetString(2));
                                    }
                                }
                                else
                                {
                                    //Patient Not Found
                                    pbox_cross.Show();
                                    patientSelected = false;
                                    foundValidPatient = false;
                                }
                                con.Close();
                            }
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Please Enter Valid Text");
                    pbar_search.Value = 0;
                    pbox_cross.Show();
                }
            }
        }
    }

上述方法无效。它应该在 SQL Server 数据库中查询用户输入的术语(例如文本框值)并查询它的搜索类型(名字),但是在调试时执行 SQL 查询但不返回任何行。

如果我在不带参数的情况下运行命令并插入实际值,即 (WHERE FirstName = 'Alan'),它将完美运行。

我对这个 SQL 查询做错了什么?

query = @"SELECT * FROM Patient WHERE @p2 = '@p1' ";

非常感谢!

【问题讨论】:

  • 列名真的是@p2吗?因为你做了'@p1'= 'ALan' 是现有记录,如果我没记错的话,'@p1' 是列名。
  • 没有列名例如应该是“FirstName”所以它应该转换为WHERE @p2 = @p1 ; (p1 = alan, p2= firstname)
  • @Jon:准备好的语句不是这样工作的。您不能像这样动态选择搜索的列。您没有得到任何结果,因为在结果 SQL 语句中,看起来您正在比较两个字符串值 (WHERE 'FirstName' = 'Alan),这始终是错误的。
  • @Cory 那么我如何将它设置为像列名一样读取名字而不是字符串?
  • 您可能需要的是query = @"SELECT * FROM Patient WHERE " + searchType +" = @p1";query = String.Format("SELECT * FROM Patient WHERE {0} = @p1", searchType)。表名应在查询中连接,而不是通过将表名作为参数值传递来使用字符串比较。

标签: c# sql-server tsql


【解决方案1】:

错误:query = @"SELECT * FROM Patient WHERE @p2 = '@p1' ";

(答案)正确:query = @"SELECT * FROM Patient WHERE " + searchType +" = @p1";

回答者:- 山本哲也

【讨论】:

  • 请记住我上面关于 SQL 注入的评论。如果searchType 来自可能被欺骗的输入(文本框、网络请求等),则需要先对其进行清理。
  • @Cory 是否也涵盖了 combobox.selectedvalue?
  • @Cory 因为他们没有用户文本输入(他们从预先确定的组合框值中选择),所以没有机会为 SQL 注入自定义输入
【解决方案2】:

您不能将列名作为参数传递,但您可以将其显式添加到查询字符串中。您还可以考虑在列名周围加上方括号,以防有人的列名也是 SQL 关键字。

我在下面的[] 中有两个使用您的列名格式化字符串的示例:

if (searchType != "NHSID")
{
    query = $@"SELECT * FROM Patient WHERE [{searchType}] = '@p1'";
}
else
{
    query = string.Format(@"SELECT * FROM Patient WHERE [{0}] = @p1", searchType);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多