这是我之前打开Excel工作表的方法:
Android platform
这样可以正常工作,但它也会生成代码分析警告:
CA2100传递给的查询字符串 ' OleDbDataAdapter.OleDbDataAdapter(string,OleDbConnection)'在 ' ExcelWrapper.GetEntireSheet(string,string)'可以包含 以下变量' string.Format(CultureInfo.InvariantCulture, " SELECT * FROM [{0} $]",sheetName)'。如果任何这些变量可以 来自用户输入,考虑使用存储过程或 参数化SQL查询,而不是使用字符串构建查询 级联。
工作表名称不是来自用户输入,因此我可以取消警告,但是抑制警告是我尽可能避免的做法。
我尝试使用以下内容更新方法:
public static System.Data.DataTable GetEntireSheet(string fileName,
string sheetName)
{
string connectionString = GetConnectionString(fileName);
System.Data.DataTable excelTable = new System.Data.DataTable();
excelTable.Locale = CultureInfo.InvariantCulture;
using (OleDbConnection connection =
new OleDbConnection(connectionString))
{
using (OleDbDataAdapter adaptor = new OleDbDataAdapter(
string.Format(CultureInfo.InvariantCulture,
"Select * from [{0}$]", sheetName),
connection))
{
adaptor.Fill(excelTable);
}
}
return excelTable;
}
它看起来很可疑,但它也会产生OleDbException:
Microsoft Access数据库引擎找不到对象'?'。 确保对象存在,并拼写其名称和路径 名字正确。如果'?'不是本地对象,请检查您的网络 连接或联系服务器管理员。
使用查询参数调用此方法的正确方法是什么?
答案 0 :(得分:1)
您不能使用参数来表示表名(工作表名称)。只有在要为INSERT,UPDATE和WHERE子句传递VALUES时才使用参数。
然而,正如所指出的,通过代码分析工具,您可以使用白名单列表,用户可以在其中选择,而无需键入任何内容。
您使用OleDbConnection中的GetOleDbSchemaTable并使用DropDownList的DropDownStyle填充组合
using(OleDbConnection excel_con = new OleDbConnection(connectionString))
using(OleDbCommand cmd = new OleDbCommand())
{
excel_con.Open();
DataTable result = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
var names = result.AsEnumerable().Select(x => x.Field<string>("TABLE_NAME").TrimEnd('$')).ToList();
comboBoxTables.DataSource = names;
}
现在您的代码可以使用comboBoxTables中的SelectedItem并使用字符串连接方法而不会出现Sql Injection问题。
答案 1 :(得分:0)
使用下面给出的代码,用户显式提供者声明。
string query = "select PersonName from Persons'