2012-05-31 2 views
0

Я использую C# для пользовательского действия в wix, который отлично работает. Пользовательское действие по существу просто запускает sql-скрипты на основе параметров, переданных методу.SqlException брошен за неправильное преобразование

Один из сценариев я бегу населяет один из моих таблиц с данными, если нет ничего в нем, и выглядит примерно так:

IF (SELECT COUNT(*) FROM [dbo].[Table]) = 0 
BEGIN 

INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (N'<<GUID>>', NULL) 
INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (N'<<GUID>>', N'The 2nd Item') 

... 

END 

В этом случае <<GUID>> что-то вроде e00104e4-7e5f-4563-9356-30732d5ca57e - эти сценарии были созданы из экспорта данных SQL Server 2008 R2 с использованием соответствующей редакции Management Studio.

Когда я запускаю этот скрипт в Management Studio, он работает нормально и, как и ожидалось, все данные вставляются, если их уже нет. Запуск его с помощью кода C#, однако, и я получаю следующее исключение:

Conversion failed when converting from a character string to uniqueidentifier

В качестве единственного uniqueidentifier столбца в таблице, это должен быть столбец ItemId, но я не могу понять, почему это происходит, или как решить проблему, и последний часовой поиск в Интернете тоже ничего не дал.

EDIT

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

+1

Не могли бы вы проверить, что фактически передано в БД через инструмент Profiler? Пожалуйста, вставьте его, чтобы мы могли исследовать еще немного. – Dave

+0

Вам нужно проверить, какие значения входят в переменную, которая используется для хранения данных GUID в коде C#. Соответствует ли этой переменной правильное значение? и проверка того же значения передается в запрос через параметр в sql. –

ответ

0

Я решил проблему сейчас. Оказывается, что один из сценариев устарел, а идентификатор - таблица была изменена с nvarchar на uniqueidentifier.

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

Итак, я должен был заметить, что проблема была раньше. Вместо этого я получаю от себя дурак из SA за то, что не сделал этого. Спасибо за ответы в любом случае, надеюсь, они будут полезны для кого-то, кто наткнулся на этот вопрос.

1

Существует функция преобразования на T-SQL для uniqueidentifier столбцов Попробуйте с этим:

INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (CONVERT(uniqueidentifier,N'<<GUID>>'), N'The 2nd Item') 
+0

Я только что обновил исходный вопрос о том, почему это не идеальное решение для того, что у меня есть. Он будет работать нормально, но мне все еще кажется странным, что студия управления работает с одним и тем же SQL без проблем. – Joeb454

+0

Ну, похоже, нет способа передать такую ​​строку без изменений обратно в SQLServer. Я попытался найти способ сказать SSMS вставить CONVERT в свой выходной скрипт, но без успеха.Вероятно, он считает, что сценарий предназначен для использования в качестве копии. С другой стороны, если уникальный идентификатор передается как строка внутри SqlCommand, он не работает с указанной ошибкой. Я думаю, вы должны реализовать преобразование перед отправкой своего INSERT в SqlServer через ADO.NET. – Steve

0

Интересный вопрос. Вы не используете Visual Studio 2008 случайно? Возможно, драйвер, который вы используете, устарел.

+0

Нет, я использую VS 2010, я все-таки понял, в чем проблема. Вероятно, мне следовало бы проверить его раньше ... См. Ответ ниже – Joeb454

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