.NET, C #, SQL Server: недопустимое имя объекта с оператором CREATE TABLE - PullRequest
1 голос
/ 20 августа 2010

Я пытаюсь выполнить команду CREATE TABLE, что приводит к следующему исключению SQL:

Неверное имя объекта 'UserLock'.

Утверждение выглядит так:

USE [db]
GO

CREATE TABLE [db].[dbo].[UserLock] (
    [Login] [varchar](150) NOT NULL,
    [ExpirationDate] [datetime] NOT NULL,
    CONSTRAINT [PK_UserLock] PRIMARY KEY CLUSTERED
    ([Login] ASC)
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Странно то, что я могу успешно выполнить запрос в Microsoft SQL Management Studio с тем же пользователем, но не в моем веб-приложении .NET, написанном на C #. Я не использую никаких фреймворков и подключаюсь к базе данных с помощью предоставленных классов из System.Data.SqlClient. Все остальные запросы к базе данных работают в приложении. База данных - Microsoft SQL Express 2005.

- Правка ---

Вот так выглядит мой код выполнения:

    string createString = "CREATE TABLE [" + catalog + "].[dbo].[UserLock]("
                        + "  [Login] [varchar](150) NOT NULL,"
                        + "  [ExpirationDate] [datetime] NOT NULL,"
                        + "  CONSTRAINT [PK_UserLock] PRIMARY KEY CLUSTERED "
                        + "  ([Login] ASC)"
                        + "  WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]"
                        + ") ON [PRIMARY]";

    SqlCommand createCommand = connection.CreateCommand();
    createCommand.Connection = connection;
    createCommand.CommandText = createString;

    selectCommand.ExecuteNonQuery();

Я ловлю исключение в другом методе. Само соединение SQL устанавливается другим способом. Это стандарт SqlConnection connection = new SqlConnection(connectionString);

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Я не уверен, как вы выполняете вышеуказанный SQL, но имейте в виду, что GO не является ключевым словом SQL, это команда, чтобы сообщить SQL Management Studio выполнить текущий пакет. Т.е. вы не можете использовать GO вне SQL Management Studio. Также я не вижу, как использование GO приведет к ошибке выше. Возможно, будет лучше, если вы отправите весь код C #, который не работает, поскольку ошибка может быть в другом месте.

1 голос
/ 20 августа 2010

Вы можете полностью удалить следующий код:

USE [db] GO

Вы полностью уточнили оператор создания таблицы с помощью [База данных]. [Схема]. [Имя объекта], поэтому он все равно создаст таблицу в правильной базе данных и схеме.

Кроме того, вы не должны использовать GO в C #, так как он специфичен для SQL Mgmt Studio и используется для разделения пакетов операторов SQL. Если вам действительно нужно использовать GO, взгляните на классы объектов управления Sql Server.

Есть хорошее сообщение в блоге от Джона Галлоуэя об этом.

0 голосов
/ 20 августа 2010

Если вы переименуете имя таблицы?Это работает тогда, может быть защищенным словом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...