我写这些代码都工作正常,但有一个警告来清理sql参数。
private DataSet ExcelToDataSet(string fileData)
{
DataSet ds = new DataSet();
string connectionString = GetConnectionString(fileData);
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
// Get all Sheets in Excel File
DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
// Loop through all Sheets to get data
foreach (DataRow dr in dtSheet.Rows)
{
string sheetName = dr["TABLE_NAME"].ToString();
if (!sheetName.EndsWith("$"))
continue;
// Get all rows from the Sheet
cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
DataTable dt = new DataTable();
dt.TableName = sheetName;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(dt);
ds.Tables.Add(dt);
}
cmd = null;
conn.Close();
}
return (ds);
}
我必须清理以下行
cmd.CommandText = "SELECT * FROM [" + sheetName + "]";
答案 0 :(得分:0)
通常,在编写SQL语句时,需要使用参数将数据从用户输入传递到sql语句中,以防止SQL注入攻击。这就是你得到这个警告的原因。但是,由于无法在SQL中参数化标识符,因此您无需执行此操作,因为您没有连接用户输入,并且您没有运行此查询一个数据库,所以即使你可以使用SQL注入,你可以做的最糟糕的事情就是破坏一个文件
答案 1 :(得分:0)
更新:我没有注意到这是OleDbConnection
,您要连接的数据库可能没有引用标识符的相同功能。我在这里留下这个答案,以防有人遇到这个问题并且需要相同的东西,但是对于SQL连接。
正如其他人所说,在这种情况下无需担心警告,因为数据不是来自用户数据。
但是,如果您无法参数化标识符,那么每个人都错了。您需要动态构建查询服务器端并使用QUOTENAME
函数,但这是可能的。
foreach (DataRow dr in dtSheet.Rows)
{
string sheetName = dr["TABLE_NAME"].ToString();
if (!sheetName.EndsWith("$"))
continue;
// Get all rows from the Sheet
cmd.CommandText = @"
declare @sql nvarchar(114);
set @sql = N'select * from ' + quotename(@sheetname)
exec sp_executesql @sql
";
cmd.Parameters.Clear();
cmd.Parameters.Add("@sheetname", SqlDbType.NVarChar, 100).Value = sheetName;
DataTable dt = new DataTable();
dt.TableName = sheetName;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(dt);
ds.Tables.Add(dt);
}
这将生成一个动态查询,可以安全地转义表的名称。