在我的应用程序中,我有几列名为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”列(效果很好)。我还需要指定一个不在表中的“事件”列,以显示“名称”,然后在其中显示搜索到的列信息。
希望我在这里很有意义:-)
谢谢
答案 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
。在这种情况下,您还必须使该零件动态化