Ошибка при разборе параметризованного запроса C#

Я продолжаю получать сообщение об ошибке при попытке разобрать параметризованный запрос. Ошибка: токен в ошибке = @tableName

Кажется, что все в порядке с переменными, пробовал передавать строки все то же самое.

using (SqlCeCommand command = new SqlCeCommand("SELECT * FROM @tableName WHERE @columnName = @id", connection))
            {
                command.Parameters.Add(new SqlCeParameter("tableName", tableName));
                command.Parameters.Add(new SqlCeParameter("columnName", column));
                command.Parameters.Add(new SqlCeParameter("id", id));

EDIT1:

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

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

PS прошу прощения, если я нарушаю правила.

EDIT2:

Извините, если я не дал понять, но есть мой вопрос.

Какая архитектура (если можно так назвать) лучше подходит для доступа к разным таблицам базы данных в разное время при запуске приложения? Я имею в виду, что бы вы решили? Хорошо это или плохо и так далее.

2 ответа

Решение

Вы не можете поместить параметры в имена таблиц и столбцы. Я также вижу, что вы используете SQL Compact Edition. Вы можете установить свою команду в C# следующим образом:

sqlCommand.CommandText = "SELECT * FROM " + yourtablename + " WHERE " + yourcolumnname+" LIKE @param";
sqlCommand.Parameters.Add("@param", SqlDbType.NVarChar).Value = paramVal + "%"; 

К вашему сведению, вы должны знать, что этот код открыт для SQL-инъекций.

Я считаю, что SqlCeCommand и SqlCommands работают одинаково, поэтому параметры должны передаваться с начальным @: "@Name".

Кроме "TableName" и "columnName" в вашем запросе должны быть имена объектов Sql, поэтому не параметризуйте их.

Вместо этого постройте свой запрос динамически, затем передайте параметр фильтрации @id.
Вы можете попробовать что-то вроде этого:

using (SqlCeCommand command = new SqlCeCommand(string.Format("SELECT * FROM {0} WHERE {1} = @id", tableName, column), connection))
            {
                command.Parameters.Add(new SqlCeParameter("@id", id));
Другие вопросы по тегам