«Произошла ошибка при разборе запроса. SQL Server CE - PullRequest
2 голосов
/ 03 февраля 2012

Я написал небольшое приложение на C #, чтобы отслеживать клиентов и работу, но я получаю сообщение об ошибке

"Произошла ошибка при разборе запроса. [Номер строки токена = 1, токен смещение строки = 14, токен по ошибке = ']

Я использую базу данных SQL Server CE .sdf

    public static void CreateEmployeeTable(string name)
    {
        conn.Open();
        using (SqlCeCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = @"CREATE TABLE `@Name` (
                                `Id` INT(10) NOT NULL AUTO_INCREMENT,
                                `Job` VARCHAR(50) NULL,
                                `Pay` VARCHAR(50) NULL,
                                `TotalJobs` VARCHAR(50) NULL,
                                `TotalPay` VARCHAR(50) NULL,
                                PRIMARY KEY (`Id`)";
            cmd.Parameters.AddWithValue("@Name", name);
            cmd.ExecuteNonQuery();
        }
    }

Я много исследовал ошибку и, кажется, эта ошибка довольно расплывчатая

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Вы не можете параметризовать оператор таблицы CREATE таким образом.

Просто создайте строку CommandText в коде, используя конкатенацию строк (следя за возможными уязвимостями SQL-инъекций), и выполните его.

0 голосов
/ 03 февраля 2012

Вы не можете параметризовать имя таблицы в вашем примере. Я изменил вашу таблицу создания SQL, чтобы она соответствовала поддерживаемым типам данных для SQL CE. Обратите внимание, что для операторов NVARCHAR задана длина 100 для поддержки до 50 символов, которые вы указали (VARCHAR не поддерживается).

Я тестировал этот пример кода, но есть еще несколько вещей, о которых стоит подумать:

  1. Ваш метод в настоящее время общедоступен. Я не знаю контекст, в котором вы это называете, но рассмотрите возможность сделать его частным или внутренним.
  2. Попробуйте сначала выполнить запрос, чтобы определить, существует ли таблица, чтобы избежать исключения.
  3. Если это вообще возможно, я бы создал соединение в блоке использования прямо над созданием вашей команды. Таким образом, вы будете знать, что соединение закрывается и удаляется. Я оставлю это на ваше усмотрение.

    public static void CreateEmployeeTable(string name)
    {
        const string createTableFormat = @"CREATE TABLE [{0}] ( 
                           Id INT IDENTITY NOT NULL PRIMARY KEY,
                           Job NVARCHAR(100) NULL, 
                           Pay NVARCHAR(100) NULL, 
                           TotalJobs NVARCHAR(100) NULL, 
                           TotalPay NVARCHAR(100) NULL)";
        if (string.IsNullOrEmpty(name))
        {
            throw new ArgumentNullException("name");
        }
    
        // Just replace with your connection string.
        using (SqlCeConnection cn = new SqlCeConnection(Settings.Default.LocalDbConnectionString))                       
        using (SqlCeCommand cmd = cn.CreateCommand())
        {                    
            cmd.CommandText = string.Format(createTableFormat, name);
            cn.Open();         
            cmd.ExecuteNonQuery()
        }            
    } 
    
...