Ошибка при разборе параметризованного запроса 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));