Я написал SQL Server CLR User-defined type (UDT) в SQL Server 2012. У меня есть смог получить к нему доступ, хотя сценарии тестирования SQL, и использовал его как локальную переменную, определил ее в таблице и протестировал ее через Visual Studio и SQL Server Management Studio.SQLBulkCopy с CLR UDT дает «Не удалось найти метод« Чтение »для типа« MyNamespace.MyType »в сборке« MyType »»
У нас есть служба, которая использует SQLBulkCopy в довольно обобщенном виде для сбора файлов, которые помещаются в каталог, а затем вставляют их содержимое в соответствующую таблицу. Когда я добавляю свой UDT в качестве столбца в одной из этих таблиц, я получаю сообщение об ошибке из вызова WriteToServer (DataTable).
Столбец UDT передается как System.String в надежде на то, что в SQL Server будет вызываться метод Parse() UDT, чтобы преобразовать его во внутренний тип. Я также попытался объявить класс UDT в этой клиентской программе и передать данные как тип UDT напрямую.
В любом случае я получаю сообщение об ошибке (отредактированный принять мои фирменные имена)
Не удалось найти метод «Read» для типа «MyNamespace.MyType» в сборе «MyType»
Я рассмотрел столько похожих вопросов, что могу найти об этом сообщении об ошибке, и они обычно ссылаются на формат оператора CREATE. Кроме того, они обычно ссылаются на функции CLR, а не на типы CLR, которые немного отличаются. Это мое:.
CREATE TYPE [DBO] [MyType]
ВНЕШНЕЕ ИМЯ [MyType] [MyNamespace.MyType]
Я подозреваю, что это не может быть проблемой, и что. вместо этого это связано с тем, как SQLBulkCopy взаимодействует с UCLT SQLCLR. Для этой конкретной комбинации трудно найти подробное объяснение.
Редактировать # 1 - Это обычная сериализация.
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = -1)]
public struct MyType: INullable, IBinarySerialize
Edit # 2 - Execute разрешение выдается
GRANT EXECUTE
ON TYPE :: MyType
TO PUBLIC
Edit # 3 - адаптированный тестирование кода
CREATE TABLE [dbo].[TestMyType]
(
[SourceMachine] [varchar](32) NULL,
[Output] MyType NULL
)
и обновляется
try
{
DataTable dataTable = new DataTable("[TestMyType]");
dataTable.Columns.Add("SourceMachine", typeof(System.String));
dataTable.Columns.Add("Output", typeof(MyNamespace.MyType));
dataTable.Rows.Add("Ron1", MyNamespace.MyType.Parse("This is string 1"));
dataTable.Rows.Add("Ron2", MyNamespace.MyType.Parse("This is string 2"));
dataTable.Rows.Add("Ron3", MyNamespace.MyType.Parse("This is string 3"));
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn);
sqlBulkCopy.DestinationTableName = "[TestMyType]";
sqlBulkCopy.WriteToServer(dataTable);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
throw;
}
Это дало тот же сообщение об ошибке Бова.
Редактировать # 4 - Исключить SqlBulkCopy из номера
Я воссоздал проблему, используя параметризованный INSERT. Я установил его для передачи объекта UDT от клиента к серверу в качестве параметра, который напрямую использует экземпляр UDT.
string sInsert = "INSERT INTO TestMyType VALUES (?, ?)";
SqlCommand command = new SqlCommand(sInsert, conn);
SqlParameter parm1 = new SqlParameter("SourceMachine", "This is Machine 01");
SqlParameter parm2 = new SqlParameter("Output", MyNamespace.MyType.Parse("This is INSERT 01"));
parm2.UdtTypeName = "MyType";
command.Parameters.Add(parm1);
command.Parameters.Add(parm2);
int nResult = command.ExecuteNonQuery();
давая
A first chance exception of type 'System.Data.SqlClient.SqlException'
occurred in System.Data.dll
Additional information: Could not find method 'Read' for
type 'MyNamespace.MyType' in assembly 'MyType'
Является ли ваш UDT использованием собственной или пользовательской сериализации? –
Это обычная сериализация. [Serializable] [Microsoft.SqlServer.Server.SqlUserDefinedType (Format.UserDefined, MaxByteSize = -1)] структура MyType общественности: INullable, IBinarySerialize – RonSanderson
К сожалению, я не могу понять, как сделать это выглядеть как код блок в комментарии. Я пробовал все, что мог найти на страницах справки. – RonSanderson