2016-09-09 9 views
3

SSMSクエリからレコードを正しく返すストアドプロシージャがあります。ここでストアドプロシージャはC#から呼び出されたときにレコードを返しませんが、SSMSで機能します。

は、ストアドプロシージャです:

このようなSSMSクエリからこれを呼び出す
CREATE PROCEDURE [dbo].[q_CheckRecords] 
    @ItemIDS AS VARCHAR(40) 
AS 
BEGIN 
    SET NOCOUNT ON 

    SELECT * 
    FROM q_Warehouse80_OOS_ItemsNeedingNotification 
    WHERE item_id = @ItemIDS 
END 

exec [q_CheckOOSWarehouse80ItemsNeedingNotification] 'B30-R10000-B001' 

私は保存を呼び出すために、このC#コードを使用するとき、それが正しくしかし、行を返します。プロシージャ、私は返される行が決して得られません。

SqlCommand cmd = null; 
SqlDataReader myReader = null; 
System.Data.SqlClient.SqlConnection conn = null; 

conn = new System.Data.SqlClient.SqlConnection("Data Source=" + sSessionServer + ";database=" + sSessionDatabase + "; Integrated Security=SSPI"); 

    String SQL = "[q_CheckOOSWarehouse80ItemsNeedingNotification]"; 

    cmd = new SqlCommand(); 
    cmd.CommandText = SQL; 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.Connection = conn; 
    cmd.Parameters.Add("@ItemIDS", SqlDbType.VarChar).Value = ItemsToBeChecked; 

    conn.Open(); 
    myReader = cmd.ExecuteReader(); 

    // check to see if any rows were returned. 
    if (myReader.HasRows) 
    { 
     while (myReader.Read()) 
     {         
      // code to read fields in returned rows here 
     } 
    } 

    conn.Close(); 

C#は、ストアドプロシージャに渡されるデータ型を定義する方法に問題があるように見えますが、私はこの問題を解決する方法についてのオンライン情報を見つけていません。

私はそれが

@ItemIDS AS VARCHAR(40) 
AS 
BEGIN 
    SET NOCOUNT ON 
    select * from q_Warehouse80_OOS_ItemsNeedingNotification where item_id = 'B30-R10000-B001' 
END 

「ハードコード化された」ですので、ストアドプロシージャを変更した場合、それにC#の呼び出しが正しく行が「発見」されたことを示します。

ご協力いただければ幸いです。

+0

ItemsToBeChecked変数の種類は何ですか? – SergeyS

+0

角かっこなしで試してください:String SQL = "q_CheckOOSWarehouse80ItemsNeedingNotification"; – tonakai

+0

コードを正しくフォーマットできますか?目には痛いです。 – ajeh

答えて

1

varCharsql treats it as length 1の長さを指定しない場合。

cmd.Parameters.Add("@ItemIDS", SqlDbType.VarChar).Value = ItemsToBeChecked; 

あなたの変数ItemsToBeCheckedは切り捨てられます、と私はその値のちょうど最初の文字を使用して、データベース内の何もマッチングがあると思います。

あなたは、これがSQLプロファイラにを入れて、あなたのC#を実行することによって、ケースであることを確認することができますvarchar型

cmd.Parameters.Add("@ItemIDS", SqlDbType.VarChar, 40).Value = ItemsToBeChecked; 

の長さを指定します。 @ItemIDSパラメーターに渡される値は1文字だけです。

+0

長さを.Add呼び出しに追加しました。成功した結果はありません –

0

問題は、C#コードでストアドプロシージャを呼び出さないためです。

+0

私はそうではありませんか? –

関連する問題