【问题标题】:how to select data from table if table names are in Combo box如果表名在组合框中,如何从表中选择数据
【发布时间】:2019-03-22 11:13:16
【问题描述】:

我在 VB.NET 上工作,现在正在切换到 C#。我正在使用以下代码将表格用作组合框中的变量来填充 DataGrid:

Dim strTAB as a String

dtTAB1 = New DataTable  
strTAB = cboDTA_TBL.Text 

adpPRJ = New SqlDataAdapter("Select * from """ & strTAB & """", conPRJ_NET)

'conPRJ_NET is connection to connect MsSQL Database on server.

adpPRJ.Fill(dtTAB1)

dgFIN_TAB.DataSource = dtTAB1 

我正在寻找 """ & strTAB & """ 的 C# 等效项。

此代码在 vb.net 中完美运行,没有错误。

谁能帮忙?

【问题讨论】:

  • 那么您是否在 C# 中寻找连接运算符?它是 + 但有时您可能必须首先转换为字符串。我建议重命名标题。
  • 此代码是SQL injection 等待发生的灾难。
  • 我已经尝试在 C# 中将 & 更改为 +。但它不起作用。
  • 无论如何你的问题的答案都可以在这里找到,我希望:docs.microsoft.com/en-us/dotnet/csharp/how-to/…。你有没有试过用谷歌搜索这个?这是一个非常基本的语言概念。这并不像将 & 替换为 + 那样简单,您还需要应对引号的转义。但是如果你修复了你的 SQL 注入漏洞,你就不必处理它了。我担心您似乎让用户控制几乎整个正在执行的 SQL 语句。这是您代码中的一个严重漏洞。
  • (注意,如果您尝试更改选择的表名,那么参数化实际上并不能帮助您,因为您不能参数化表名,只能参数化变量/字段值. 相反,您需要将允许的表名列入白名单,以阻止用户对您的数据库执行任意 SQL)。

标签: c# .net vb.net


【解决方案1】:

如前所述,由于 SQL 注入,这是一个糟糕的设计,但这是您的答案:

var strTAB = "tableName";
string myString = $"Select * from {strTAB}";

【讨论】:

  • @WamanIna。很高兴听到!你能检查一下这个作为答案吗?
  • 现在还有一个选项可以使用:string myString = "Select * from " + strTAB;
  • 用“+”连接也可以,是的,但通常不受欢迎,而且不像字符串插值那样容易阅读(我使用的 {value} 语法)
  • @WamanIna。答案有点长,但简短的答案是使用参数化 SQL。看这里->stackoverflow.com/questions/7505808/…
  • @WynDiesel 参数化 SQL 是一个很好的通用答案,但在这种情况下没有帮助。它确实需要一个有效表名的白名单,或者至少验证表名仅包含字母、数字和下划线(然后确保在名称周围加上 [])。
【解决方案2】:

虽然通常你永远不会连接字符串来构建 Sql 语句,但如果你的组合框 DropDownStyle 设置为 DropDownList,则不需要担心 Sql 注入。这本质上是“列表限制”,但它不是默认设置。

using 语句确保您的数据库对象已关闭和处置。

我不确定表名周围的双引号应该做什么,但在 Sql Server 中,标识符分隔符是方括号。 ( [ ] )

    private void button1_Click(object sender, EventArgs e)
    {
        string query = "Select * From [" + cboDTA_TBL.Text + "];";
        DataTable dtTAB1 = new DataTable();
        using (SqlConnection conPRJ_NET = new SqlConnection("Your connection string"))
        {
            using (SqlDataAdapter adpPRJ = new SqlDataAdapter(query, conPRJ_NET))
            {
                adpPRJ.Fill(dtTAB1);
            }
        }
        dgFIN_TAB.DataSource = dtTAB1;
    }

【讨论】:

    【解决方案3】:

    我使用这样的 MySQL 命令:

    string db_name= "test";
    string db_table = "table";
    command.CommandText = "SELECT * FROM " + db_name+ "." + db_table + " WHERE ID = "ID";";
    // sometimes you need the: ' around the string-variables
    command.CommandText = "SELECT * FROM '" + db_name+ "." + db_table + "' WHERE ID = "ID";";
    

    【讨论】:

    • MySQL 与 SQL Server 问题有何关系?我同意你已经展示了 C# 的字符串连接语法,所以也许可以在你的描述中关注它(并使用 OP 的代码,而不是你的一些随机代码)。让您的答案相关,而不是通用的复制和粘贴示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2019-09-18
    • 2019-03-04
    • 2012-11-24
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多