2016-11-24 33 views
0

奇妙な問題が発生しました。これはストアドプロシージャのOUTパラメータに関連していると思いますか?SqlException、データ型nvarcharをintに変換するエラー

ストアドプロシージャ:

try 
{ 
    using (SqlConnection conn = new SqlConnection(strConnection)) 
    { 
     using (SqlCommand cmd = new SqlCommand("dbo.uspProcessResetRequest", conn)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@user", SqlDbType.UniqueIdentifier).Value = strUser; 
      cmd.Parameters.AddWithValue("@company", SqlDbType.UniqueIdentifier).Value = strCompany; 
      cmd.Parameters.AddWithValue("@mobile", SqlDbType.NVarChar).Direction = ParameterDirection.Output; 
      cmd.Parameters.AddWithValue("@system", SqlDbType.NVarChar).Direction = ParameterDirection.Output; 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 

      string[] strResult = new string[] { (string)cmd.Parameters["@mobile"].Value, (string)cmd.Parameters["@system"].Value }; 

      return strResult; 
     } 
    } 
} 
catch (Exception err) 
{ 
    string strError = err.Message; // Log error 
    return new string[] { "", "" }; 
} 

ストアドプロシージャがうまく動作します - すべてのコードが実行されますが、cmd.ExecuteNonQuery();が例外をスローします:C#コードの呼び出し

ALTER PROCEDURE [dbo].[uspProcessResetRequest] 
    @user uniqueidentifier, 
    @company uniqueidentifier, 
    @mobile nvarchar(50) OUT, -- return phone number 
    @system nvarchar(256) OUT -- return system name 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @mobile = 'error' --for debugging 
    SET @system = 'error' --for debugging 

    -- Select matching row from ResetQueue into temporary table 
    INSERT INTO ResetHistory ([User_ID], MobilePhone, Company_ID, [System], [Status], ResetIP) 
     SELECT 
      rq.[User_ID], u.MobilePhone, u.Company_ID, rq.[System], '3', rq.ResetIP 
     FROM 
      ResetQueue rq 
     INNER JOIN 
      [User] u ON rq.[User_ID] = u.ObjectGuid 
     WHERE 
      u.Company_ID = @company 
      AND rq.[User_ID] = @user 
      AND rq.[Status] = '2'   

    SELECT @mobile = u.[MobilePhone] 
    FROM [user] u 
    WHERE u.ObjectGuid = @user 

    SELECT @system = rq.[system] 
    FROM ResetQueue rq 
    WHERE rq.[User_ID] = @user 

    DELETE FROM ResetQueue 
    WHERE [User_ID] = @user 
END 

、SQLExceptionを:データ型nvarcharをintに変換中にエラーが発生しました。

私は出力値を失います。私は、OUTパラメータはいくつかの問題に直面していることを疑っていますが、このナットを割ることができないよう

...私はこの問題が見つかり

他のほとんどの投稿がSqlIntパラメータに提出された値をテキストに関連します。これは、ストアドプロシージャが実際にデータを予想どおりに実行して移動するため、このようなケースではないようです。

+0

多量のコードを** minimal demo **に置き換えて質問を簡略化できますか? –

+0

ExecuteNonQuery()はintを返しません...したがって、ストアドプロシージャもintを返す必要がありますか? ExecuteScalar()を呼び出してオブジェクトを返すことをお勧めします。 – Gwasshoppa

+0

@Gwasshoppa ExecuteNonQueryは、sprocの戻り値ではなく、 'ROWCOUNT'値を返します。 – Dai

答えて

1

@Gwashoppa、私の質問に答える時間をとってください。私の理解では、戻り値はOUTPUTパラメータと混同されません。しかし、いずれにしても、私は解決策を見つけた - データ型と長さが明示的に設定する必要があります:私はAddWithValue機能で起こったが、どうやらないと考え

cmd.Parameters["@mobile"].SqlDbType = SqlDbType.NVarChar; 
cmd.Parameters["@mobile"].Size = 50; 

0

あなたのC#コードはうまくいきます... cmd.ExecuteNonQuery();行が例外をスローするという事実は、エラーがSPで使用されるいくつかのパラメータにあることを示しています。あなたはこの声明の中で、例えば

...問題領域を識別するためのステップであなたのSPを隔離する必要があります

はResetHistory表をあなたの選択に使用したのと同じ列の型を持っていますか?

INSERT INTO ResetHistory ([User_ID], MobilePhone, Company_ID, [System], [Status], ResetIP) 
SELECT rq.[User_ID], u.MobilePhone, u.Company_ID, rq.[System], '3', rq.ResetIP 
FROM ResetQueue rq 
... 

このステートメントでは、mobilephone列はVarchar値を返しますか?

SELECT u.[MobilePhone] 
FROM [user] u 
WHERE u.ObjectGuid = @user 

この文では、システム列はVarchar値を返しますか?

SELECT rq.[system] 
FROM ResetQueue rq 
WHERE rq.[User_ID] = @user 
関連する問題