如何在 ODBC 查询中参数化表名

2023-12-21

我有一个到数据库的 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);

以安全的方式实现这一目标的最佳方法是什么?


使用存储过程,这是最安全的方法。

一些提示:

  1. 您可能还可以使用System.Data.SqlClient命名空间对象
  2. 将连接、命令和适配器对象初始化包含在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(使用前将#替换为@)

如何在 ODBC 查询中参数化表名 的相关文章

随机推荐

  • 需要一些有关使用 PERL 的 IRC BOTS 的信息

    有谁知道有一款用 Perl 编写的好 irc 机器人吗 我只需要一个简单的登录到该频道 然后根据用户所说的内容进行回复 e g 用户
  • 只让实例访问标签本身?

    看着这个帖子 https serverfault com questions 686526 how do you tag and name the ec2 instance that was launched by an ec2 spot
  • AppStore iOS 应用新版本提交问题

    您好 提前致谢 在尝试使用应用程序加载器向 AppStore 提交新版本的 iOS 应用程序时 我收到了以下消息 ITC apps validation prerelease build missing 并停止提交 我在使用以前版本的 iT
  • GRPC:用Java/Scala制作高吞吐量客户端

    我有一项以相当高的速率传输消息的服务 目前它由 akka tcp 提供服务 每分钟生成 350 万条消息 我决定尝试一下 grpc 不幸的是 它导致吞吐量小得多 每分钟约 500k 条消息 甚至更少 您能推荐一下如何优化吗 My setup
  • 错误:我的 Prolog 代码中超出本地堆栈

    我无法弄清楚为什么给定 Prolog 代码的以下查询会生成错误Out of local stack 序言代码 likes g c likes c a likes c b likes b a likes b d likes X Z likes
  • PHP DOM UTF-8 问题

    首先 我的数据库使用 Windows 1250 作为本机字符集 我将数据输出为 UTF 8 我在我的网站上使用 iconv 函数将 Windows 1250 字符串转换为 UTF 8 字符串 并且效果完美 问题是当我使用 PHP DOM 解
  • 列出 Capybara/Poltergeist 元素的子元素

    我四处寻找 但找不到办法做到这一点 我们正在 EmberJS Rails 应用程序上的 Cucumber 功能中使用 Poltergeist 驱动程序运行 Capybara 测试 我无法使用 page driver debug 因为我在无头
  • 从 Swagger/OpenAPI 生成 Spring MVC 控制器

    有没有办法根据 Swagger OpenAPI 规范生成控制器 Spring MVC 代码 我知道 Swagger 可以从现有的 Spring 代码生成 但是反过来也可能吗 您基本上是在寻找生成 swagger 服务器端代码 如果您想在构建
  • 重新排列数据:从水年转换为日历年

    我有一个表 其中包含来自流量计的数据 排列如下 Water Year May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Apr 1 1953 1954 55 55 43 62 30 46 26 17 2
  • 如何在Android中获取MP3文件的持续时间[重复]

    这个问题在这里已经有答案了 我正在开发一个媒体播放器项目 我想根据我正在播放的 MP3 文件的长度旋转图像 即当歌曲结束时图像应该停止旋转 我想获取所选 MP3 文件的持续时间 以便可以对旋转进行计时 我读了这个问题在 Android 中从
  • 构造函数中“this”关键字的作用是什么?

    我刚才正在查看 MSDN 的示例代码 发现 namespace IListSourceCS public class Employee BusinessObjectBase private string id private string
  • 等待所有线程完成java中的工作

    我正在编写一个具有 5 个线程的应用程序 这些线程同时从 Web 获取一些信息并填充缓冲区类中的 5 个不同字段 当所有线程完成其工作时 我需要验证缓冲区数据并将其存储在数据库中 我该如何做到这一点 当所有线程完成工作时收到警报 我采取的方
  • 如何从分隔类型文件中的特定行打印特定字段

    我有一个排序的分隔类型文件 我想提取特定行中的特定字段 这是我的输入文件 somefile csv efevfe 132143 27092011080210 howdy hoodie adfasdfs 14321 2709201108184
  • Bootstrap:CSS - 列表组项目的高度

    请考虑关注 JSFiddle http jsfiddle net 7W2r4 12 http jsfiddle net 7W2r4 12 您可能会注意到 list group item已经完全崩溃了 而且我似乎无法让它自动调整 例如 hei
  • 更改 Visual Studio 中文档之间移动的 Ctrl + Tab 行为

    Is it possible to change how Ctrl Tab and Shift Ctrl Tab work in Visual Studio I have disabled the popup navigator windo
  • java.lang.ClassCastException:android.widget.TextView。为什么我会得到这个?

    由于某种原因 我收到 ClassCastException 错误 我真的不知道为什么 预先感谢 我是一名新程序员 任何帮助都会真正有帮助 没有双关语 Code final EditText answerBox EditText findVi
  • 使用 Pandas 数据框运行 OLS 回归

    我有一个pandas数据框 我希望能够根据 B 列和 C 列中的值预测 A 列的值 这是一个玩具示例 import pandas as pd df pd DataFrame A 10 20 30 40 50 B 20 30 10 40 50
  • Linq to SQL DataContext 生命周期管理问题

    我读过里克 斯特拉尔的article http www west wind com weblog posts 246222 aspx关于处理数据上下文的方法 我的 DBML 位于类库内 我通过在库内的单独自定义部分类中创建静态 Curren
  • iOS模拟器:双击home键有时不起作用

    使用 iOS 模拟器版本 10 双击主页按钮调出多任务处理 运行应用程序 有时没有响应 有时甚至点击 cmd shift h x2 来模拟主页按钮双击也有效 我已经和同事核实了这一点 他们也有同样的问题 我不确定这是否是模拟器中的错误 或者
  • 如何在 ODBC 查询中参数化表名

    我有一个到数据库的 ODBC 连接 我希望用户能够查看任何表中的数据 由于这是一个 ASP net 应用程序 我不能相信发送的表名不包含令人讨厌的内容 我尝试过使用参数化查询 但总是收到错误消息 必须声明表变量 这似乎是一个问题 因为它是表