Хранимые процедуры на CLR
От: Аноним  
Дата: 26.05.09 04:54
Оценка:
Есть процедура:
[Microsoft.SqlServer.Server.SqlProcedure]
public static SqlInt32 Object_Member_Set(..., object val)...

При вызове из SQL:
exec Object_Member_Set ..., 234

аргумент val всегда равен null.
Почему? (что делаю не правильно?)
Re: Хранимые процедуры на CLR
От: Sinix  
Дата: 26.05.09 05:01
Оценка:
Здравствуйте, Аноним

А попробуйте вместо object SqlVariable или что-то наподобие.

И посмотрите профайлером как у вас деплоится хранимая процедура — скриптик сюда.
Re[2]: Хранимые процедуры на CLR
От: Аноним  
Дата: 26.05.09 05:16
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А попробуйте вместо object SqlVariable или что-то наподобие.

Уже искал и не нашёл.

S>И посмотрите профайлером как у вас деплоится хранимая процедура — скриптик сюда.

Скриптик... я делаю командой IDE "Развернуть решение".

USE [test1]
GO

/****** Object:  StoredProcedure [dbo].[Object_Member_Set]    Script Date: 05/26/2009 11:15:44 ******/
CREATE PROCEDURE [dbo].[Object_Member_Set]
    @tid [nvarchar](4000),
    @oid [nvarchar](4000),
    @mid [nvarchar](4000),
    @val [sql_variant]
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Server].[UserDefinedFunctions].[Object_Member_Set]
GO

EXEC sys.sp_addextendedproperty @name=N'AutoDeployed', @value=N'yes' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'Object_Member_Set'
GO

EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFile', @value=N'Object_Member_Set.cs' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'Object_Member_Set'
GO

EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFileLine', @value=9 , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'PROCEDURE',@level1name=N'Object_Member_Set'
GO
Re: Хранимые процедуры на CLR
От: Аноним  
Дата: 26.05.09 05:48
Оценка:
Или подскажите как обновить (update) поле неизвестным заранее типом значения.
У меня в процедуре есть такой код:
cm.Parameters.Add(new SqlParameter("@v", val));
cm.CommandText = "update [" + tid.ToString() + "$] set [" + mid.ToString() + "] = @v";
сm.ExecuteNonQuery();

Так как я не знаю тип значения и поля (могут быть любыми), то ввожу параметр @v.
Может можно как-то подругому это сделать?
Re[3]: Хранимые процедуры на CLR
От: Sinix  
Дата: 26.05.09 07:11
Оценка:
Здравствуйте, Аноним, Вы писали:

Гммм... а если при вызове процедуры явно объявить тип переменной:
Declare @var variable;
set @var =123;
exec...


Сорри, сервера под рукой сейчас нет, а clr sps даавно уже не писал.
Re[2]: Хранимые процедуры на CLR
От: Sinix  
Дата: 26.05.09 07:22
Оценка:
Здравствуйте, Аноним

Тааак — всё забафней и забафней

Именно так оно и делается... если не считать возможности поиметь вас через sql injection.
Будет в mid нечто вроде "column]=1; страшный sql;--" — сильно порадуетесь.

Параметры для того и заведены, чтобы не было таких дыр.
Если у вас никак не обойтись без конкатенации строк — делайте валидацию и экранируйте служебные символы.
Re[3]: Хранимые процедуры на CLR
От: Аноним  
Дата: 26.05.09 09:07
Оценка: :)
Спасибо, Sinix, за участие и рекомендации, буду их учитывать, но проблема, как всегда в невнимательности...
у меня в самом начале метода (процедуры) написано "val = null;" (!)
(я наверно код из такого же метода, но заканчивающегося на "Get" скопировал...)

ПОЛ ДНЯ потеряно!..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.