Создать SQL-запрос таблицы — выбрать имя таблицы из строки

#c# #sql #database #datatable #create-table

#c# #sql #База данных #datatable #создать таблицу

Вопрос:

Я пытаюсь программно создать таблицу SQL. Я могу создать таблицу с помощью запроса, это вообще не проблема. Но я бы хотел, чтобы имя таблицы имело некоторое отношение к вставленным в него данным, поскольку оно используется для предложений и счетов-фактур. В него будут вставлены данные, введенные из DataGridView (возможно, с помощью bulkcopy или чего-то подобного).

 using (SqlCeCommand command = new SqlCeCommand(
                  "CREATE TABLE table1' (Weight INT, Name NVARCHAR, Breed NVARCHAR)", con))  
 

работает отлично. Однако я бы хотел, чтобы этот код работал:

 using (SqlCeConnection con = new SqlCeConnection(@"Data Source=|DataDirectory|LWADataBase.sdf"))
{
   con.Open();
   try
   {
      string tableName = ""   quotenameTxt.Text   "-"  firstTxt.Text  "-"   surenameTxt.Text;

      using (SqlCeCommand command = new SqlCeCommand(
         "CREATE TABLE '" tableName.ToString() "' (Weight INT, Name NVARCHAR, Breed NVARCHAR)", con))
      {
         command.ExecuteNonQuery();
      }
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
   }
}
 

Есть предложения? Я получаю сообщение об ошибке (как и ожидалось), но не уверен, что мне нужно делать.

Я использую SqlCe (и прежде чем кто-нибудь скажет «BulkCopy не поддерживается», я знаю, у меня есть ссылка, которая позволяет это)

Ошибка, которую я получаю, :

Произошла ошибка при разборе запроса. [Номер строки токена = 1, смещение строки токена = 16, ошибка токена = 1-2-3 ]

// «1-2-3» — значения текстового поля.

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

1. Какую ошибку вы получаете? Что-то насчет неправильного синтаксиса?

2. Произошла ошибка при разборе запроса. [Номер строки токена = 1, смещение строки токена = 16, ошибка токена = 1-2-3 ] // «1-2-3» — значения текстового поля.

3. Сначала выполните отладку и проверьте, каково значение string tableName параметра. Во-вторых, поскольку tableName already — это строка, вам не нужно вызывать .ToString() ее.

4. У меня он отображается в окне сообщения как 1-2-3. (Значения из текстовых полей в форме) я удалил .ToString() и все равно получаю ту же ошибку

5. Замените тире на подчеркивание или заключите все название таблицы в [квадратные скобки] .

Ответ №1:

Замените тире на подчеркивание или заключите все имя таблицы в [квадратные скобки]

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

1. [] разобрался с проблемой.

Ответ №2:

Как упоминалось в комментариях выше, внесите следующие изменения:

 using (SqlCeCommand command = new SqlCeCommand(
     "CREATE TABLE '" tableName "' (Weight INT, Name NVARCHAR, Breed NVARCHAR)", con))
 

tableName это уже строка. Нет необходимости использовать .ToString() его.

Кроме того, у вас есть начальный пробел в вашем объявлении tableName :

 string tableName = ""   quotenameTxt.Text   "-"   firstTxt.Text   "-" 
                        surenameTxt.Text;
 

Это создает строку «1-2-3», а не «1-2-3», которую вы ожидаете.

Наконец, окружите свой tableName с [] , чтобы заставить его работать правильно:

 using (SqlCeCommand command = new SqlCeCommand(
   "CREATE TABLE '["   tableName   "]' (Weight INT, Name NVARCHAR, Breed NVARCHAR)", con))
 

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

1. Отличное описание. Упрощает понимание. Теперь, чтобы найти способ отображения всех таблиц из базы данных в виде списка или чего-то подобного.