我正在使用C#VS 2010开发一个应用程序。
我有以下代码,可以在datagridview中获取具有某个名称的学生详细信息。
var CommandText = @"SELECT sid as 'Student ID', name as 'Student Name', adDate as
'Admission Date',
paidFees as 'Fees Paid', balance as 'Fees Remaining'
FROM Student WHERE (status = '" + status + "') AND
(name LIKE '%'+'"+txtSearchName.Text.Trim() + "'+'%')";
string select = CommandText;
con.Open();
SqlDataAdapter dataAdapter = new SqlDataAdapter(select, con);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
con.Close();
dgvSearch.ReadOnly = true;
dgvSearch.DataSource = ds.Tables[0];
我的问题是我只是获取表格的标题而不是下面截图的数据。
这里有什么问题?
答案 0 :(得分:1)
我认为您应该在打开'
之后和关闭%
之前放弃%
。
var CommandText = @"SELECT sid as 'Student ID', name as 'Student Name', adDate as
'Admission Date',
paidFees as 'Fees Paid', balance as 'Fees Remaining'
FROM Student WHERE (status = '" + status + @"') AND
(name LIKE '%" + name + "%')";
LIKE
部分的格式应为LIKE '%somename%'
。
使用using
构造包装SqlConnection也是一种很好的做法,这样你就不会忘记处理它(即使抛出异常也是如此。
using (var conn = new SqlConnection(...))
{
}
答案 1 :(得分:1)
我建议使用参数化查询。
var CommandText = @"SELECT sid as 'Student ID', name as 'Student Name', adDate as
'Admission Date', paidFees as 'Fees Paid', balance as 'Fees Remaining'
FROM Student WHERE (status = @status) AND (name LIKE @stuname)";
string select = CommandText;
con.Open();
SqlDataAdapter dataAdapter = new SqlDataAdapter(select, con);
dataAdapter.SelectCommand.Parameters.AddWithValue("@status", status);
dataAdapter.SelectCommand.Parameters.AddWithValue("@stuname", "%" + txtSearchName.Text.Trim() + "%");
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
....
通过这种方式,LIKE语句的引号和通配符字符串连接的问题大大简化,并且可以避免像%
char周围的错误引号等细微错误。
当然这会删除任何可能的SQL Injection attack