C# 如何安全地创建一个查询,列出给定表名的列名,以及可能指向SQL Server或MySQL的连接字符串?

C# 如何安全地创建一个查询,列出给定表名的列名,以及可能指向SQL Server或MySQL的连接字符串?,c#,mysql,sql,sql-server,C#,Mysql,Sql,Sql Server,目前,我有以下方法适用于我的特定两个数据库,但我不确定这是否是实现我列出列名目标的正确方法,或者有点不成熟 让我担心的是,SQL Server似乎使用TABLE\u CATALOG作为数据库名称,而MySQL使用TABLE\u SCHEMA。我不确定我是否能在任何情况下都相信这一点 private string GetTableColumnsQuery(ConnectionStringSettings conString, string tableName) { string query

目前,我有以下方法适用于我的特定两个数据库,但我不确定这是否是实现我列出列名目标的正确方法,或者有点不成熟

让我担心的是,SQL Server似乎使用
TABLE\u CATALOG
作为数据库名称,而MySQL使用
TABLE\u SCHEMA
。我不确定我是否能在任何情况下都相信这一点

private string GetTableColumnsQuery(ConnectionStringSettings conString, string tableName)
{
    string query;
    if (conString.Name == "mysql")
    {
        var con = new MySqlConnectionStringBuilder(conString.ConnectionString);
        query = $"select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='{tableName}' and TABLE_SCHEMA='{con.Database}'";
    }
    else
    {
        var con = new SqlConnectionStringBuilder(conString.ConnectionString);
        query = $"select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='{tableName}' and TABLE_CATALOG='{con.Database}'";
    }

    return query;
}
这对所有SQL Server和MySQL数据库都能可靠地工作吗?我是否应该以某种方式对其进行更改以避免丢失的错误

最后,如果代码不面向用户,是否仍然鼓励编写语句


谢谢。

MySQL和SQL Server很长时间以来都支持
信息\u架构
视图。因此,您的代码应该可以在两个数据库中工作。您只选择列名,以便表中的其他差异不会影响代码。“模式”的解释有点不同,但代码本身应该可以工作

是的,您应该参数化您正在编写的所有查询。首先,这是一个好习惯——您不希望为内部目的编写的代码被“扩展”,从而引入SQL注入风险


其他问题是查询计划的重用和避免语法错误。使用查询字符串并不是传递参数的最佳方式。

给我两分钱:除了消除SQL注入风险(这非常重要)外,它的工作速度更快,正如您(至少在SQL Server方面,我不是真正喜欢mySQL)编译的执行计划一样。