2017-09-18 23 views
1

2つの値を返すストアドプロシージャがSQL Serverにあります。次のSQLコードとQAから呼び出された場合:SQL Serverストアドプロシージャの戻り値

exec TWEEPush_ValidateCO @CoFilter='CO IN(''1502'',''Mike'',''Clarkson'')', @TDate='09/18/`2017' 

2つの値を返すことで期待どおりに動作します:

@TempCOID @TempDate 
1502  09/10/2017 

ストアドプロシージャは、いくつかの作業を行い、二つの値が非nullに設定された状態で終了します値は、で終わるストアドプロシージャで:VB.net(Visual Basicのではなく、C)では

SELECT 
    @TempCOID AS N'@TempCOID', 
    @TempDate AS N'@TempDate' 

、私は結果を得るために多くの異なるアプローチを試してみたが、運がなかったしています。私は、paramという名前が存在しない、またはそれがどんなに私が試したどのようなコード空の値(すべてが戻りデータにNULL値を防ぐためにコード化された)

Dim sConnectStr As String = GetSQLConnectionString() 

Try 
    Using Connection As New SqlConnection(sConnectStr) 
     Connection.Open() 

     Dim Command As New SqlCommand("dbo.TWEEPush_ValidateCO", Connection) 
     Command.CommandType = CommandType.StoredProcedure 
     Command.Parameters.AddWithValue("@CoFilter", Filter) 
     Command.Parameters.AddWithValue("@TDate", Now()) 

     Dim PramCOIDRet As New SqlParameter 
     PramCOIDRet.ParameterName = "@TempCOID" 
     PramCOIDRet.SqlDbType = SqlDbType.NVarChar 
     PramCOIDRet.Size = 30 
     PramCOIDRet.Direction = ParameterDirection.Output 

     Dim PramDateRet As New SqlParameter 
     PramDateRet.ParameterName = "@TempDate" 
     PramDateRet.SqlDbType = SqlDbType.NVarChar 
     PramDateRet.Size = 30 
     PramDateRet.Direction = ParameterDirection.Output 

     Command.Parameters.Add(PramCOIDRet) 
     Command.Parameters.Add(PramDateRet) 

     Command.ExecuteNonQuery() 

     Dim COID as string = Command.Parameters("@TempCOID").Value 
     Dim CoDate as Date = CDate(Command.Parameters("@TempDate").Value) 
    End Using 
Catch ex As Exception 
End Try 

を返す終わるというエラーを取得するのいずれかコードは期待どおりにデータを返すことはありません。 私は何が間違っていますか?誰かがこれでいくつかの光を発することができますか? -

+2

これらの「パラメータ」は実際にはパラメータではありません。あなたはその中にある値を使って、その中に1つの行がある通常の結果セットを返します。 ExecuteNonQueryではなくExecuteReaderを使うべきです(なぜなら、実際にはクエリであり、それが 'SELECT'がやっていることです)、そこでそこから結果を取得するからです。 –

+0

'PramDateRet.Value'と' PramCOIDRet.Value'をチェックした場合 – JamieD77

+1

そのプロシージャは、文字列を受け取って動的SQLとして実行しているような疑いがあります。これは非常に恐ろしく、SQLインジェクションの脆弱性が非常に高い可能性があります。 –

答えて

1

あなたは私達にあなたのストアドプロシージャのコードを示さなかったが、最も可能性が高い、それはこのようなものです: - ではない二つのパラメータこの場合

CREATE PROCEDURE dbo.dbo.TWEEPush_ValidateCO 
    @CoFilter VARCHAR(100), -- just guessing here! 
    @TDate DATE    -- again - just guessing 
AS 
BEGIN 
    DECLARE @TempCOID INT; 
    DECLARE @TempDate DATE; 

    -- do some calculations here that define @TempCOID and @TempDate 
    -- this is just for demo purposes - I'm sure your calculation is a bit 
    -- more complex and involved... 
    SET @TempCOID = 1502; 
    SET @TempDate = '20170910'; 

    -- return the values in a SELECT statement 
    SELECT 
     @TempCOID AS N'@TempCOID', 
     @TempDate AS N'@TempDate' 
END 

、あなたは結果セットを返すです!

あなたはこのようなあなたの値を取得する必要があります。

static void Main(string[] args) 
{ 
    string connectionString = ConfigurationManager.ConnectionStrings["YourConnectionString"].ConnectionString; 

    int tempCoid; 
    DateTime tempDate; 

    using (SqlConnection conn = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = new SqlCommand("dbo.dbo.TWEEPush_ValidateCO", conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.AddWithValue("@CoFilter", Filter); 
     cmd.Parameters.AddWithValue("@TDate", DateTime.Now); 

     conn.Open(); 

     using (var rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       tempCoid = rdr.GetFieldValue<int>(0); 
       tempDate = rdr.GetFieldValue<DateTime>(1); 
      } 
     } 

     conn.Close(); 
    } 
} 

(私はあなたのアイデアを得ると確信している - あなたは簡単すぎて、VB.NETにこれを翻訳することができます)。

希望に役立ちます!

Marc

+0

Marc;これは、コードとSQ​​Lプロシージャの内部にあるものと同じくらいです。残念ながら、私はまだ値を得ていません。私は今日、自分のコーディングミスである可能性の高いもの(つまりあなたの例ではないもの)を通して働くための時間がなかった。どんな場合でも、SPから返される値は決して決してゼロにはなりません。空にすることはできますが、nullにすることはできません。 –

+0

@marc_s、申し訳ありませんが、以下の質問をしてください。私はシナリオをどのように扱うべきか分かりません。親切な一見。 https://stackoverflow.com/questions/46285924/which-kind-of-table-design-best-suuitable-for-normalization-in-sql-server私に解決策を提案してください。 – RGS

+1

@RGS:私はこれらのコメントですでに言われていることを超えて、何も追加的なことはありません。 –

関連する問題