2010-11-16 2 views
3

Хотя нижеследующее отлично работает в SQL Server Management Studio, он просто не будет работать в C#:C# MSSQL изменить таблицу затем изменить значения

DECLARE @PeriodID AS bigint; 
SELECT TOP 1 @PeriodID = PeriodID FROM Periods ORDER BY PeriodID DESC; 
IF NOT EXISTS(SELECT * FROM information_schema.columns WHERE COLUMN_NAME = N'PeriodID' AND TABLE_NAME = N'MobilePlans') 
BEGIN 
    BEGIN 
    ALTER TABLE MobilePlans ADD PeriodId bigint NULL 
    END 
    BEGIN 
    UPDATE MobilePlans SET PeriodID = @PeriodID 
    END 
    BEGIN 
    ALTER TABLE MobilePlans ALTER COLUMN PeriodID bigint NOT NULL 
    END 
END 

В C#, он продолжает говорить мне Invalid column name 'PeriodID'. и проведя пару часов, я думал, что попрошу здесь.

Во время поиска я наткнулся на http://bytes.com/topic/c-sharp/answers/258520-problem-sqlcommand-t-sql-transaction, но я не мог перевести свой условный запрос на этот вопрос.

Почему C# не может работать так же, как студия управления?

Есть ли другой способ сделать то, что делает запрос, что работает на C#? Мне нужно выполнить это на 400 базах данных, поэтому мне бы очень понравился сценарий для этого.

Заранее благодарен!

Версия сервера SQL - 2008. Версия менеджера - 2008 (10.0.2531). Версия .NET Framework 2.0.

ответ

3

я получаю «недопустимое имя столбца" PeriodID»запустить его в Management Studio, если таблица уже не имеет столбец PeriodID.

Репро:

create table Periods (
    PeriodID bigint not null 
) 
go 
insert into Periods(PeriodID) select 1 
go 
create table MobilePLans (
    BLah int not null 
) 
go 
insert into MobilePLans(BLah) select 2 
go 
DECLARE @PeriodID AS bigint; 
SELECT TOP 1 @PeriodID = PeriodID FROM Periods ORDER BY PeriodID DESC; 
IF NOT EXISTS(SELECT * FROM information_schema.columns WHERE COLUMN_NAME = N'PeriodID' AND TABLE_NAME = N'MobilePlans') 
BEGIN 
    BEGIN 
    ALTER TABLE MobilePlans ADD PeriodId bigint NULL 
    END 
    BEGIN 
    UPDATE MobilePlans SET PeriodID = @PeriodID 
    END 
    BEGIN 
    ALTER TABLE MobilePlans ALTER COLUMN PeriodID bigint NOT NULL 
    END 
END 

Причина проста - SQL Server пытается полностью компилировать каждую партию. Если столбец уже существует, то оператор UPDATE может быть скомпилирован. Если нет, вы получите сообщение об ошибке.

Если поставить обновление внутри Exec:

EXEC('UPDATE MobilePlans SET PeriodID = ' + @PeriodID) 

Тогда будет скомпилирован в точке, которая действительно существует столбец.

+0

О, мой бог .. Эта маленькая вещь решила мою проблему. Как досадно, что компилятор не может понять, что один из них. Думаю, я слишком привык, чтобы получить материал, раздаваемый на блюде компилятором C# :) Спасибо, кучка, Дамиен! – Heki

3

Возможно, у вас есть орфографическая ошибка в коде C#.

Ошибка говорит PeriodeID в то время как ваше имя столбца PeriodID.

+0

Да, извините. Я перевел его, чтобы иметь смысл. Кажется, я просто забыл перевести сообщение об ошибке. – Heki

2

Разъяснение:

1 - Вы хотели бы, чтобы подтолкнуть этот сценарий его против многих баз данных?

2 - Недопустимое имя столбца 'PeriodeID', я не вижу столбец под названием «PeriodeId», но «PeriodId», это опечатка?

3 - Можете ли вы попробовать тот же блок без основного блока BEGIN/END?

+0

1: Да, около 400, но в том же случае. – Heki

+0

2: Забыл перевести ошибку. Это должно быть PeriodId, как вы указали. – Heki

1

Является ли сортировка сервера Нечувствительный к регистру? Поскольку вы добавляете Период Id, а затем обновление Период ID

+0

Нет, это не так. Я забыл упомянуть, когда я пытался иметь последовательный случай без положительного эффекта. – Heki

+0

Я имею в виду, это так. Это нечувствительно к регистру. :) – Heki

Смежные вопросы