Как вставить в c #, используя пользовательское имя таблицы

#c# #sql-server

#c# #sql-сервер

Вопрос:

Это частичный код, который я пытаюсь

 SqlConnection con = new SqlConnection(@"Data Source=ANSARI-PC;Initial Catalog=BMS;Integrated Security=True");
    string tname = idc   "-InvoiceT";
    string sql = "select count(*) from '"  tname   "' ";
    con.Open();
    SqlCommand sda = new SqlCommand(sql, con);
    SqlDataReader myreader;
    myreader = sda.ExecuteReader();
    int lid;  
  

Для приведенного выше кода я получаю эту ошибку, неправильный синтаксис рядом с ‘2-InvoiceT’
2-InvoiceT — это имя таблицы в базе данных ‘idc’, содержащее 2 в качестве значения.

Комментарии:

1. Заключение имени таблицы в кавычки преобразует это имя в строку, и, конечно же, это синтаксическая ошибка. Итак, уберите кавычки. Но я бы также посоветовал вам не разрешать вашему пользователю вводить имя таблицы. Разрешите использовать только белый список имен, которые ваш пользователь должен выбрать из элемента управления, доступного только для чтения, такого как ListBox или DropDownList

2. Лично я бы использовал параметризованный динамический оператор. То, что у вас есть, опасно открыто для внедрения. db<>fiddle

3. Кажется, синтаксическая ошибка и неправильно указано имя таблицы.

Ответ №1:

Изменить

 string sql = "select count(*) from '"  tname   "' ";
  

Для

 string sql = "select count(*) from ["  tname   "] ";
  

Комментарии:

1. Это далеко не решает проблему с внедрением, что является основным недостатком здесь.

2. Это правильно, вы никогда не должны позволять своим пользователям вводить имя таблицы подобным образом, но вопрос был не в этом.

3. То, что это не вопрос, не означает, что неправильный ответ является правильным. Ответ, который имеет огромный недостаток в безопасности, не является хорошим ответом, и этот недостаток необходимо устранить.

4. @Z3esha9 Я настоятельно рекомендую вам не использовать этот ответ в его нынешнем виде.

5. Рад, что смог помочь. И да, вы должны быть осторожны с внедрением.