如何在SQL表中搜索特定列

时间:2018-11-05 17:31:10

标签: c#

在我的应用程序中,我有几列名为1,2,3 ...8。我在Windows窗体应用程序中有一个搜索框,用户可以搜索列1或2等,然后它需要显示该信息在我的datagridview中。

目前,我有这段代码可以搜索列名称MAT,但它也需要搜索具有特定列名称的列。

例如:

在我的文本文件中,我有“ test”和“ 3”,然后读取文本文件中的第一个单词并将其放在文本框中,然后自动搜索名为“ MAT”的列。在第二个文本框中,它放置了“ 3”,现在需要搜索第3列。就像我在文本文件中所说的那样,它可以是1-8(测试1或测试2或测试3 ....等)中的任何一个。 )

这是我目前的代码:

private void latestMatTextBox_TextChanged(object sender, EventArgs e)
    {
        using (var conn = new SqlConnection())
        {

            conn.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\AddMatDB.mdf;Integrated Security=True";
            conn.Open();

            using (var adapter = new SqlDataAdapter("SELECT GetDate() as Event, Owner, Holder, MAT, Location FROM TBLMat where MAT like @search", conn))

            {
                adapter.SelectCommand.Parameters.Add("search", SqlDbType.NVarChar).Value =
            "%" + latestMatTextBox.Text + "%";
                adapter.Fill(dataTable);
                if (dataTable.Columns.Count > 0)
                {
                    dataTable.PrimaryKey = new DataColumn[] { dataTable.Columns[0] };
                }

                mainAMSDataGrid.DataSource = dataTable;
                mainAMSDataGrid.Visible = true;
                mainAMSDataGrid.Sort(this.mainAMSDataGrid.Columns[0], ListSortDirection.Descending);


                conn.Close();
            }
        }

因此,上面的代码显示了“ MAT”列(效果很好)。我还需要指定一个不在表中的“事件”列,以显示“名称”,然后在其中显示搜索到的列信息。

希望我在这里很有意义:-)

谢谢

1 个答案:

答案 0 :(得分:1)

您需要构建动态sql。我要为此偷走并称赞@jdweng-

在表单中,您需要用您所拥有的列的名称填充一个或多个组合框。因此,如果您使用

填充数据表
Select * from TBLMat where 1=0

这将为您提供空表。现在您可以这样做

string[] columns = dataTable.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToArray(); 

您也可以执行select * from information_schema.COLUMNS WHERE ...

填写好组合后,您需要建立where条件的列表

list.Add(cbocol.SelectedItem.ToString() + " = " & GenerateParameterAndAddToCommand(txtVal.Text)) // this method should output @1, @2, etc

然后,您编译where并附加到其余查询

var sql = @"SELECT GetDate() as Event, Owner, Holder, MAT, Location 
             FROM TBLMat 
             where " + string.Join(" AND ", list)

您可以选择运算符-Like, =, <>等。可以选择AND\OR。在这种情况下,您还必须使该零件动态化