Как я могу выбрать из таблицы, где имя таблицы указано как SqlParameter? - PullRequest
3 голосов
/ 27 сентября 2011

Я пытаюсь выполнить динамический выбор SQL, где я выбираю из таблицы, используя параметр.

SELECT null FROM @TableName 

Однако я получаю ошибку must declare table variable @TableName.Я подозреваю, что это потому, что я выбираю из таблицы, используя переменную.Мне не нужно было делать это раньше.

List<SqlParameter> sqlParams = new List<SqlParameter>()
{ 
    new SqlParameter("TableName", "testtable"),
    new SqlParameter("FieldName", "testfield"),
    new SqlParameter("Find", "testfind"),
};
string sqlSelect = "SELECT null FROM @TableName 
                    WHERE @FieldName LIKE '%' + @Find + '%' ";

DataTable dtSelect = SqlHelper.ExecuteDataset(sqlConn, CommandType.Text, 
                        sqlSelect, 30, sqlParams.ToArray()).Tables[0]; 
//30 = timeout

Как я могу выполнить вышеизложенное с помощью динамического SQL?(нет хранимых процедур, пожалуйста)

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

Нельзя использовать параметры для таких вещей, как имена таблиц и столбцов. Для них вы можете иметь белый список возможных значений, а затем использовать конкатенацию строк при построении SQL-запроса.

4 голосов
/ 27 сентября 2011

Вы не можете использовать такие параметры, поэтому вы должны построить запрос в виде строки. Вы можете сделать это в SQL, но вы также можете просто создать строку в коде C #.

Убедитесь, что имя таблицы и имя поля являются безопасными и надежными значениями и не поступают напрямую из небезопасного источника, такого как веб-запрос.

string tableName = "testtable";
string fieldName = "testfield";

List<SqlParameter> sqlParams = new List<SqlParameter>() { 
  new SqlParameter("Find", "testfind"),
};
string sqlSelect =
  "SELECT null " +
  "FROM " + tableName + " " +
  "WHERE " + fieldName + " LIKE '%' + @Find + '%' ";
1 голос
/ 27 сентября 2011
    private DataTable ExecuteDynamic(string TableName,string FieldName, string Find)
    {

    string sqlSelect = "SELECT * FROM " + TableName +  
                        " WHERE " + FieldName + " LIKE '%'" + Find + "'%' ";
    using (connection = new SqlConnection(Strcon))
        connection.Open();
    {
        using (cmd = new SqlCommand(sqlSelect, connection))
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 60;
            adpt = new SqlDataAdapter(cmd);
            dt = new DataTable();
            adpt.Fill(dt);
            return (dt);
        }
    }
}
...