Как использовать параметр SqlCommand для указания имени схемы для запроса на выборку - PullRequest
1 голос
/ 01 февраля 2012

Имя схемы в нашей базе данных является динамическим. Почему не работает следующая работа?

public void ReadVersion(string connString, string schemaName) 
{
    string selectCommand = "SELECT major FROM [@SchemaName].[version]");
    using (SqlConnection sqlConn = new SqlConnection(connString)) 
    {
        using (SqlCommand cmd = new SqlCommand(selectCommand, sqlConn)) 
        {
            sqlConn.Open();
            cmd.Parameters.AddWithValue("@SchemaName", schemaName);
            object result = cmd.ExecuteScalar();
        }
    }
}

При выполнении команды значение параметра не подставляется. Это ограничение параметров SqlCommand?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Вы не можете сделать следующее в простом SQL (игнорируя все накладные расходы ADO.Net):

DECLARE @SchemaName sysname
SET @SchemaName = 'dbo'
SELECT major FROM @SchemaName.[version]

И причина проста. SQL хочет после FROM имя . То, что вы пытаетесь дать, это строка . SQL Server не случайно не начинает пиринг внутри строк, чтобы посмотреть, не похожи ли они на какую-то другую конструкцию.

Для вашего санитарного запроса, предполагая, что вы сохраняете имена схем в здравом уме, просто используйте простое регулярное выражение в имени схемы, прежде чем доверять ему (например, ^[A-Z][A-Z0-9]+$ должно быть достаточно для большинства применений). Убедитесь, что вы используете белый (разрешенные символы), а не черный список.

3 голосов
/ 01 февраля 2012

Это ограничение параметров SqlCommand?

Да, это ограничение. В ADO.NET вы не можете использовать параметры для схемы (такие как имена таблиц и столбцов). Лучше всего использовать конкатенацию строк и, как следствие, собственную фильтрацию для инъекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...