2016-05-06 59 views
1

このストアドプロシージャはSQL Serverにあり、データテーブルとNewOwnerIDをパラメータとして受け取り、DatatableのIDと一致するすべての行を更新します。ユーザー定義型の配列をストアドプロシージャに渡す方法

CREATE Procedure [dbo].[udpUpdateActivityLead] 
@ActivityLeadTable ActivityLeadType READONLY, 
@OwnerTo   int 
AS 
BEGIN 
UPDATE [tblActivity] 
set [tblActivity].[employeeID] = @OwnerTo 
from @ActivityLeadTable 
where [tblActivity].[activityID] in (Select ID from [@ActivityLeadTable]) 
END 

私はこれを静かでシンプルなC#から使用しました。今は最悪の部分ですが、MS Accessフロントエンドからこのストアドプロシージャを呼び出す必要があります。私はこれをどのようにして行うのですか?

私はエラーを取得する クラスclsUpdateLeadsからUpdateRecordデータベース関数を呼び出す形で

Public Type MyIDs 
ID As Long 
End Type 

を私はMSACCESSで以下試してみたが、エラー

は、モジュール内でユーザー定義型を作成します次のコードの4行目で

Dim IDList() As MyIDs 
Dim objUL As clsUpdateLeads 
Set objUL = New clsUpdateLeads 
Call objUL.updateRecord(IDList, Me.updateEmployeeID) 

updateRecord funcの定義クラスモジュールのclsUpdateLeads

Public Sub updateRecord(activityIDs() As MyIDs, NewOwnerID As Long) 
If Not (isConnectionOpen()) Then 
OpenConnection 
End If 

Set ADOCom = New ADODB.Command 
ADOCom.ActiveConnection = ADOConn 
ADOCom.CommandType = adCmdStoredProc 
ADOCom.CommandText = "[dbo].[udpUpdateActivityLead]" 

ADOCom.Parameters.Append ADOCom.CreateParameter("@ActivityLeadTable", adArray, adParamInput, 10, activityIDs()) 
ADOCom.Parameters.Append ADOCom.CreateParameter("@OwnerTo", adBigInt, adParamInput, 10, NewOwnerID) 
ADOCom.Execute 

End Sub 
+0

を使用すると、SQL ServerにMSACCESS前端から通信したい理由bac kend.insteadすべてのデータをmsaccess.Doにインポートしてください。まず、テーブルタイプのない非常に単純なprocを作成し、それが動作するかどうかを確認してください。 – KumarHarsh

+0

@KumarHarshご回答いただきありがとうございますが、私はサーバーレベルで脳を必要とするほとんどのものを保持し、単なるデータホルダーとしてアクセスフロントエンドを使用しようとしています。もう一度ありがとうございます。 – Shallo

答えて

3

私が知る限り、ADODBを使用してテーブルタイプを渡すことはできません。

CREATE PROCEDURE dbo.udpUpdateActivityLead_MSAccess @ActivityLeadList VARCHAR(4000), @OwnerToInt INT 
AS 
BEGIN 
    -- VALIDATE THAT STRING ONLY CONTAINS NUMBERS AND COMMAS 
    IF PATINDEX('%[^0-9,]%', @ActivityLeadList) > 0 
    BEGIN 
     RAISERROR('Invalid Activity Leads (non integer values found)', 16, 1); 
     RETURN; 
    END 

    -- CONVERT LIST TO TABLE 
    DECLARE @ActivityLeadTable dbo.ActivityLeadType; 
    INSERT @ActivityLeadTable (ID) 
    SELECT y.i.value('.', 'int') 
    FROM (SELECT CAST('<i>' + REPLACE(@ActivityLeadList, ',', '</i><i>') + '</i>' AS XML)) x(i) 
     CROSS APPLY i.nodes('i') y (i); 

    EXECUTE dbo.udpUpdateActivityLead @ActivityLeadTable, @OwnerToInt; 
END 

ここに非常に大きな注意点、ひいては検証はにXMLを使用していることである:私は少なくとも最悪のオプションは、カンマ区切りのリストとして整数を渡すのアクセスからコールするラッパー・プロシージャを作成することだと思います分割文字列は、特別なXML文字が文字列に含まれないことを保証できる場合にのみ機能します。

文字列パラメータを分割するために使用する正確な方法は、要件とSQL Serverのバージョンによって異なります。分割文字列の件名にいくつかの良い読書はここで見つけることができます:

+0

ありがとうございました。 – Shallo

関連する問題