使用OleDbAdaptor和查询参数打开Excel工作表

时间:2017-05-14 12:05:04

标签: c# sql excel oledb

这是我之前打开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数据库引擎找不到对象'?'。   确保对象存在,并拼写其名称和路径   名字正确。如果'?'不是本地对象,请检查您的网络   连接或联系服务器管理员。

使用查询参数调用此方法的正确方法是什么?

2 个答案:

答案 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'