Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Как правильно написать запрос на создание функции от переменной. Код самой dll .

Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient
Public Class t2f
<SqlFunction(DataAccess:=DataAccessKind.Read)> _
Public Shared Function ReturnOrderCount(ByVal Table As String) As Integer
Using conn As New SqlConnection("context connection=true")
conn.Open()
Dim cmd As New SqlCommand("select COUNT(*) as 'CountKar' from" & Table & "", conn)
Return CType(cmd.ExecuteScalar(), Integer)

End Using
End Function
End Class


Возможно я накосячил и в самой dll, поэтому прошу помощи в разъяснение.
MSDN читал , там нашел тока создание статичной функции, а хотелось бы динамическую )

p.s Не сильно ругайте , пожалуйста )
5 апр 13, 15:00    [14140804]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Frankestein,

Показали код сборки — теперь покажите, как вы эту сборку внедряете в БД и как вызываете. И какие ошибки при этом получаете (или нет никаких ошибок?)
5 апр 13, 15:10    [14140877]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
exec sp_configure 'clr enabled', 1
reconfigure
go

Configuration option 'clr enabled' changed from 1 to 1. Run the RECONFIGURE statement to install.

1)create assembly t2f from 'c:\t2f.dll'
with permission_set = safe
Успешно

2)CREATE FUNCTION ReturnOrderCountr2(@table varchar(10))
RETURNS INT
as external name t2f.t2f.ReturnOrderCount(@table)

Сообщение 102, уровень 15, состояние 1, процедура ReturnOrderCountr2, строка 3
Incorrect syntax near '('.


Понимаю , что не правильно написал выражение 2....но Я в MSDN не нашел примера динамической функции
5 апр 13, 15:27    [14140985]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Glory
Member

Откуда:
Сообщений: 104760
Frankestein
as external name t2f.t2f.ReturnOrderCount(@table)

А здесь зачем (@table) ?
5 апр 13, 15:31    [14141023]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Glory,

Ну это мой первый опыт , я просто последовал логике , я же в dll написал переменную , и подумал , нужно указать её в том месте
5 апр 13, 15:33    [14141046]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Glory
Member

Откуда:
Сообщений: 104760
Frankestein
я просто последовал логике

Чьей логике то ?
Смотрим декларацию в хелпе
CLR Scalar Functions
CREATE FUNCTION [ schema_name. ] function_name
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type
[ = default ] }
[ ,...n ]
)
RETURNS { return_data_type }
[ WITH <clr_function_option> [ ,...n ] ]
[ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

<method_specifier>::=
assembly_name.class_name.method_name - никаких скобок, переменных и тп
5 апр 13, 15:36    [14141064]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Glory,
Переписал.
CREATE FUNCTION ReturnOrderCountr2(@table varchar(10))
RETURNS INT
as external name t2f.t2f.ReturnOrderCount

Сообщение 6552, уровень 16, состояние 3, процедура ReturnOrderCountr2, строка 1
CREATE FUNCTION for "ReturnOrderCountr2" failed because T-SQL and CLR types for parameter "@table" do not match.


Теперь возникает вопрос , что я забыл написать в dll. Как правильно описать переменную ?
5 апр 13, 15:45    [14141136]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Glory
Member

Откуда:
Сообщений: 104760
Frankestein
Как правильно описать переменную ?

BOL - Mapping CLR Parameter Data
5 апр 13, 15:49    [14141158]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Спасибо большое Всем за разъяснение
5 апр 13, 15:57    [14141209]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Теперь начал пытаться получить табличное значение , но пишет ошибку ...Кто может сказать где она
Код dll

Imports System.Data
Imports System.Data.SqlTypes
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Server
Imports System.Collections
Partial Public Class ArtistFindDunctions

Private Class ArtistResult
Public id_artist As SqlInt32
Public Name_artist As SqlString

Public Sub New(id_artist_1 As SqlInt32, Name_artist_2 As SqlString)
id_artist = id_artist_1
Name_artist = Name_artist_2
End Sub
End Class

<SqlFunction(dataAccess:=DataAccessKind.Read, FillRowMethodName:="FindArtist_fillRow", TableDefinition:="id_artist int,name_artist nvarchar(4000)")> _
Public Shared Function FindArtist_fill() As IEnumerable

Dim resultCollection As New ArrayList()

Using con As New SqlConnection("context connection=true")
con.Open()

Using selectArtist As New SqlCommand("Select " & "[id_artist],[name_artist] " & " From dbo.card_artist")

Using ArtistReader As SqlDataReader = selectArtist.ExecuteReader()

End Using
End Using
End Using

Return resultCollection

End Function

Public Shared Sub FindArtist_fillRow(artistResultObj As Object, id_artist As SqlInt32, Name_artist As SqlString)
Dim artistResult As ArtistResult = DirectCast(artistResultObj, ArtistResult)

id_artist = artistResult.id_artist
Name_artist = artistResult.Name_artist
End Sub
End Class


Код прописывания и ошибка

create assembly MyCLR From 'C:\tb3p.dll'
with permission_set = Safe
go

Create function FindArtist()
Returns Table (
id_artist int,
Name_artist nvarchar(4000)
)
As external name MyCLR.ArtistFindDunctions.FindArtist_fill;


Function signature of "FillRow" method (as designated by SqlFunctionAttribute.FillRowMethodName) does not match SQL declaration for table valued CLR function'FindArtist' due to column 1.

Пример написания читал из msdn....что не так и как это решить ?
9 апр 13, 15:14    [14156996]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Frankestein
Public Shared Sub FindArtist_fillRow(artistResultObj As Object, id_artist As SqlInt32, Name_artist As SqlString)

Полагаю, id_artist и Name_artist должны быть out-параметрами.
9 апр 13, 15:31    [14157161]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Гость333,

Но они же в начале DLL указаны , или я чего-то не понимаю
9 апр 13, 15:34    [14157192]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Frankestein
Пример написания читал из msdn

Можно ссылку на пример?
9 апр 13, 15:38    [14157236]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Гость333,

http://msdn.microsoft.com/en-us/library/ms131103.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-7

Sample: Returning the Results of a SQL Server Query
9 апр 13, 15:47    [14157331]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Frankestein
Public Shared Sub FindArtist_fillRow(artistResultObj As Object, id_artist As SqlInt32, Name_artist As SqlString)

Вот так попробуйте:
Public Shared Sub FindArtist_fillRow(artistResultObj As Object, ByRef id_artist As SqlInt32, ByRef Name_artist As SqlString)
10 апр 13, 07:43    [14159762]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Гость333,

Спасибо Большое , помогло
10 апр 13, 08:43    [14159860]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Узнаю новое , возникают новые вопросы. Нужна помощь в написание такой штуки. Пишу сборку для нечеткого сравнения. Нашел пример для VBA http://acc-s.ru/access/invfunctionstring8.htm , переписал для VB. Код ниже. Начал прописывать сборку начались ошибки , из - за малой практики работы написания сборок ( не примеров из msdn ) , прошу помощи людей) (можно и нелюдей ))) )

Imports System.Data
Imports System.Data.SqlTypes
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Server
Imports System.Collections
Public Class t4p

Partial Public Class IndistingMatch

Private Structure RetCount
Public lngSubRows As Long
Public lngCountLike As Long
End Structure

Private Function MatchingStrings(strA As String, strB As String, lngLen As Integer) As RetCount
Dim TempRet As RetCount
Dim PosStrA As Integer
Dim PosStrB As Integer
Dim strTempA As String
Dim strTempB As String
TempRet.lngCountLike = 0
TempRet.lngSubRows = 0
For PosStrA = 0 To strA.Length - lngLen
strTempA = strA.Substring(PosStrA, lngLen)
For PosStrB = 0 To strB.Length - lngLen
strTempB = strB.Substring(PosStrB, lngLen)
If (String.Compare(strTempA, strTempB) = 0) Then
TempRet.lngCountLike = (TempRet.lngCountLike + 1)
Exit For
End If
Next
TempRet.lngSubRows = (TempRet.lngSubRows + 1)
Next
Return TempRet
End Function

<SqlFunction(DataAccess:=DataAccessKind.Read, FillRowMethodName:="MatchingStrings")> _
Public Function IndistinctMatching(MaxMatching As Integer, strInputMatching As String, strInputStandart As String) As Single
Dim gret As RetCount
Dim tret As RetCount
Dim lngCurLen As Integer
'текущая длина подстроки
'если не передан какой-либо параметр, то выход
If MaxMatching = 0 OrElse strInputMatching.Length = 0 OrElse strInputStandart.Length = 0 Then
Return 0
End If
gret.lngCountLike = 0
gret.lngSubRows = 0
' Цикл прохода по длине сравниваемой фразы
For lngCurLen = 1 To MaxMatching
'Сравниваем строку A со строкой B
tret = MatchingStrings(strInputMatching, strInputStandart, lngCurLen)
gret.lngCountLike = gret.lngCountLike + tret.lngCountLike
gret.lngSubRows = gret.lngSubRows + tret.lngSubRows
'Сравниваем строку B со строкой A
tret = MatchingStrings(strInputStandart, strInputMatching, lngCurLen)
gret.lngCountLike = gret.lngCountLike + tret.lngCountLike
gret.lngSubRows = gret.lngSubRows + tret.lngSubRows
Next
If gret.lngSubRows = 0 Then
Return 0
End If
Return CSng(gret.lngCountLike * 100.0 / gret.lngSubRows)
End Function
End Class
End Class


Прописывание сборки

create assembly IndistingMatching From 'C:\t4p.dll'
with permission_set = Safe
go

CREATE FUNCTION IndistingMatching() RETURNS real
as external name IndistingMatching.IndistingMatching.IndistinctMatching

Сообщение 6505, уровень 16, состояние 2, процедура IndistingMatching, строка 2
Could not find Type 'IndistingMatching' in assembly 't4p'.


p.s Да, я не прописал параметры для функции , но он пишет нет метода, вроде , Я же его указал
pp.s. Не ругать сильно )
15 апр 13, 13:55    [14181599]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Frankestein
Public Class t4p

Partial Public Class IndistingMatch

...
End Class
End Class

У вас вложенные классы зачем-то сделаны. Оставьте какой-нибудь один.
15 апр 13, 16:12    [14182648]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Гость333,

Исправил....начал дальше копать, и споткнулся на ошибке написание функции....Где Я накосячил ) ?!

CREATE FUNCTION IndistingMath(@MaxMatching bigint,@strA nchar(4000),@strB nchar(4000)) RETURNS real
as external name IndistingMatching.IndistingMatch.IndistinctMatching

Сообщение 6573, уровень 16, состояние 1, процедура IndistingMath, строка 1
Method, property or field 'IndistinctMatching' of class 'IndistingMatch' in assembly 't4p' is not static.
15 апр 13, 17:09    [14183174]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Frankestein
Method, property or field 'IndistinctMatching' of class 'IndistingMatch' in assembly 't4p' is not static.

Потому что функция должна быть объявлена как Public Shared.
И непонятно, для чего прописан атрибут FillRowMethodName, если у вас скалярная функция?
15 апр 13, 17:28    [14183303]     Ответить | Цитировать Сообщить модератору
 Re: Новичок. CLR. Функция от переменной  [new]
Frankestein
Member

Откуда:
Сообщений: 61
Гость333,

Потому что функция должна быть объявлена как Public Shared.

ясно, буду иметь ввиду


И непонятно, для чего прописан атрибут FillRowMethodName, если у вас скалярная функция?

потому, что ругался на метод. Подумал , что этот атрибут надо указать , но сюда по Вашему комментарию , он лишний там

Исправил, по вылезали другие ошибки , но сам понял , где накосячил.

Спасибо за Ваше терпение и мудрость.
16 апр 13, 08:52    [14185050]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить