【发布时间】: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