2016-09-02 16 views
0

以下のコードでエラーが発生します。私は、「データ型intにnvarchar型の値が 『113332,113347』を変換する際の変換に失敗しました。」「113332,113347」"nvarchar値 '113332,113347'をデータ型intに変換するときに変換に失敗しました。

cn.Open(); 
SqlCommand cmd = new SqlCommand("SelectUser", cn); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("@in_UserId", SqlDbType.Int).Value = Convert.ToInt32(userId); 
cmd.Parameters.Add("@in_StartDate", SqlDbType.DateTime).Value = fromDate; 
cmd.Parameters.Add("@in_EndDate", SqlDbType.DateTime).Value = toDate; 
cmd.Parameters.Add("@in_LocalIds", SqlDbType.NVarChar, 100).Value = localids.ToString(); 
cmd.ExecuteNonQuery(); 

としてローカルIDを渡しています

データベースでは、ローカルIDのデータ型はintです。

ストアドプロシージャのコードがそのように変換し、(SQLでは、whileループのいくつかの種類でなければならない)の値を分割し、あなたは「」によって接合INTを有する@in_LocalIdsパラメータで

CREATE PROCEDURE [dbo].[User_Update] @in_UserId INT 
,@in_StartDate DATETIME 
,@in_EndDate DATETIME 
,@in_LocalIds NVARCHAR(100) 
AS 
BEGIN 
SELECT * FROM TABLE1 WHERE LocalId in (@in_LocalIds) AND UserId = @in_UserId 
END 
go 
+0

それが失敗したときにuserId' 'で何ですか?それはintではないように見えます。 – LordWilmore

+0

ストアドプロシージャをポストできますか?あなたのコードに 'localids'とはどのような型ですか? –

+0

バグがあり、同じ文字列値 "113332,113347"を 'localids'と' userid'の両方に割り当てているように私に聞こえます –

答えて

1

以下に示します。値をintに変換して一時テーブルに挿入します。

次に、where句で表を使用します。

EDIT:

CREATE PROCEDURE [dbo].[User_Update] @in_UserId INT 
,@in_StartDate DATETIME 
,@in_EndDate DATETIME 
,@in_LocalIds NVARCHAR(100) 
AS 
BEGIN 

declare @tempLocalIds nvarchar(100) 
declare @tempStrId nvarchar(100) 
declare @tempId int 
declare @idx int 
declare @Ids TABLE (ID int) 

set @tempLocalIds = @in_LocalIds 

while(len(@tempLocalIds) > 0) 
begin 
    -- find index of first ',' char 
    set @idx = charindex(',', @tempLocalIds) 
    -- get substring 0 to previously found index 
    set @tempStrId = substring(@tempLocalIds, 0, @idx-1) 
    -- convert the value 
    set @tempId = convert(@tempStrId as int) 
    -- remove the first number from string 
    set @tempLocalIds = substring(@tempLocalIds, @idx, len(@tempLocalIds) - @idx -1) 


    -- insert into the temp table 
    insert into @Ids(ID) 
    values (@tempId) 

end 


SELECT * FROM TABLE1 WHERE LocalId in (select ID from @Ids) AND UserId = @in_UserId 
END 
go 
+0

サンプルコードを提供できますか? –

+0

ストアドプロシージャを実行するときにこのエラーが発生します - LEFTまたはSUBSTRING関数に無効な長さパラメータが渡されました。 whileループは決して終わらないでしょう。 –

+0

最後の部分文字列の前に 'print @ tempLocalIds'、' print @ idx'、 'print len(@tempLocalIds)'を追加して、システムが文字列長の合計よりも長い部分文字列を取得しようとしていないかどうかを確認します。 – owczarek

関連する問題