我有一个到数据库的 ODBC 连接,我希望用户能够查看任何表中的数据。由于这是一个 ASP.net 应用程序,我不能相信发送的表名不包含令人讨厌的内容。我尝试过使用参数化查询,但总是收到错误消息“必须声明表变量“ - 这似乎是一个问题,因为它是表名
string sql = "SELECT TOP 10 * FROM ? ";
OdbcCommand command = new OdbcCommand(sql, dbConnection);
command.Parameters.Add(new OdbcParameter("@table", tableName));
OdbcDataAdapter adapter = new OdbcDataAdapter();
adapter.SelectCommand = command;
adapter.Fill(tableData);
以安全的方式实现这一目标的最佳方法是什么?
使用存储过程,这是最安全的方法。
一些提示:
- 您可能还可以使用
System.Data.SqlClient
命名空间对象
- 将连接、命令和适配器对象初始化包含在
using
声明
这是一个简单的例子:
string sqlStoredProcedure = "SelectFromTable";
using (OdbcConnection dbConnection = new OdbcConnection(dbConnectionString))
{
dbConnection.Open();
using (OdbcCommand command = new OdbcCommand(sqlStoredProcedure, dbConnection))
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.Add(new OdbcParameter("@table", tableName));
using (OdbcDataAdapter adapter = new OdbcDataAdapter(command))
{
adapter.SelectCommand = command;
adapter.Fill(tableData);
}
}
}
另一种方法是检索所有表名并验证tableName
字符串变量作为列表中的条目,可能使用:
DataTable tables = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Tables);
这是根据您的场景的简单实现:
string sql = "SELECT TOP 10 * FROM {0}";
using (OdbcConnection dbConnection = new OdbcConnection(dbConnectionString))
{
dbConnection.Open();
DataTable tables = dbConnection.GetSchema(OdbcMetaDataCollectionNames.Tables);
var matches = tables.Select(String.Format("TABLE_NAME = '{0}'", tableName));
//check if table exists
if (matches.Count() > 0)
{
using (OdbcCommand command = new OdbcCommand(String.Format(sql, tableName), dbConnection))
{
using (OdbcDataAdapter adapter = new OdbcDataAdapter(command))
{
adapter.SelectCommand = command;
adapter.Fill(tableData);
}
}
}
else
{
//handle invalid value
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)