添加列和 table 名称作为 SqlCommand 中的参数,如 "SELECT @col from @table" 查询
Add column and table name as parameters in SqlCommand like "SELECT @col from @table" queries
我正在开发一个应用程序,读取 MS-SQL 数据库中的表。通常这种工作方式是可以的:
sqlCommand.CommentText = $"SELECT {Col_Name} FROM {variable}";
sqlReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
<retrieve> sqlDataReader.GetString(0); // this takes the value of Col_Name
}
然而,现在我正在使用 SELECT DISTINCT
查询,整个事情都出错了:
for (int i = 0; i< dt_main.Columns.Count - 1; i++) // dt_main is a DataTable, containing the columns.
// This is checked and working fine.
{
string col_Name = dt_main.Columns[i].Caption; // This seems to be correct too.
sqlCommand.CommandText = $"SELECT DISTINCT @col FROM {cmb_Table_Names.SelectedItem}";
// cmb_Table_Names.SelectedItem contains the table name -> Ok.
sqlCommand.Parameters.Clear(); // In the program, I'm always using the same
// sqlCommand object, so the parameters need to be cleared first.
sqlCommand.Parameters.AddWithValue("col", col_Name);
sqlDataReader = sqlCommand.ExecuteReader();
string value_in_table = "";
while (sqlDataReader.Read())
{
value_in_table = sqlDataReader.GetString(0); // try read the distinct values.
// NOK: the column name is read instead.
}
sqlDataReader.Close();
}
从评论中可以看出,出错(NOK
)的意思是value_in_table
中设置的不是列里面的值,而是列的名称。
备注:我已经在 MS-SQL management studio 中尝试了 SELECT DISTINCT
查询,它工作正常。
备注2:我也做过绝望的实验value_in_table = sqlDataReader.GetString(1);
,显然失败得很惨:-)
由于我是 SqlCommand
和相应的 SqlDataReader
的新人,昨天我被困在一个完全不可预见的问题上,我担心我又掉进了一些奇怪的陷阱。
有人知道我需要做什么才能读取值,而不是列名吗?
提前致谢
您不能将列名用作命令参数,将所有内容设为 sql 字符串
sqlCommand.CommandText = $"SELECT DISTINCT {col_name} FROM {cmb_Table_Names.SelectedItem}";
我确定 PO 知道 sql 注射。
我正在开发一个应用程序,读取 MS-SQL 数据库中的表。通常这种工作方式是可以的:
sqlCommand.CommentText = $"SELECT {Col_Name} FROM {variable}";
sqlReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
<retrieve> sqlDataReader.GetString(0); // this takes the value of Col_Name
}
然而,现在我正在使用 SELECT DISTINCT
查询,整个事情都出错了:
for (int i = 0; i< dt_main.Columns.Count - 1; i++) // dt_main is a DataTable, containing the columns.
// This is checked and working fine.
{
string col_Name = dt_main.Columns[i].Caption; // This seems to be correct too.
sqlCommand.CommandText = $"SELECT DISTINCT @col FROM {cmb_Table_Names.SelectedItem}";
// cmb_Table_Names.SelectedItem contains the table name -> Ok.
sqlCommand.Parameters.Clear(); // In the program, I'm always using the same
// sqlCommand object, so the parameters need to be cleared first.
sqlCommand.Parameters.AddWithValue("col", col_Name);
sqlDataReader = sqlCommand.ExecuteReader();
string value_in_table = "";
while (sqlDataReader.Read())
{
value_in_table = sqlDataReader.GetString(0); // try read the distinct values.
// NOK: the column name is read instead.
}
sqlDataReader.Close();
}
从评论中可以看出,出错(NOK
)的意思是value_in_table
中设置的不是列里面的值,而是列的名称。
备注:我已经在 MS-SQL management studio 中尝试了 SELECT DISTINCT
查询,它工作正常。
备注2:我也做过绝望的实验value_in_table = sqlDataReader.GetString(1);
,显然失败得很惨:-)
由于我是 SqlCommand
和相应的 SqlDataReader
的新人,昨天我被困在一个完全不可预见的问题上,我担心我又掉进了一些奇怪的陷阱。
有人知道我需要做什么才能读取值,而不是列名吗?
提前致谢
您不能将列名用作命令参数,将所有内容设为 sql 字符串
sqlCommand.CommandText = $"SELECT DISTINCT {col_name} FROM {cmb_Table_Names.SelectedItem}";
我确定 PO 知道 sql 注射。