2015-11-11 12 views
5

何らかの理由で、私のストアドプロシージャがC#のコードビハインドからエラーなしで実行されますが、ストアドプロシージャが書き込んだものを何も削除していません。私はすべての正しいパラメータとすべてを持っています。 SQL ServerからC#コードのすべての同じパラメータを使用してクエリを実行したところ、完全に動作します。なぜ私はSQL Serverから実行するときに動作しますが、Visual StudioのC#コードから実行すると機能しません。動的SQL文で正しく実行されないストアドプロシージャ

ここでは、ストアドプロシージャにデータを渡すC#コードを示します。

string reportType = "PostClaim"; 
string GRNBRs = "925','926','927"; 
string PUNBRs = "100','100','100"; 
string beginningDates = "20120401"; 
string endDates= "20120430"; 

try 
{ 
    conn = new SqlConnection(ConnectionInfo); 
    conn.Open(); 
    SqlDataAdapter da = new SqlDataAdapter("RemoveReport", conn); 
    da.SelectCommand.CommandType = CommandType.StoredProcedure; 
    da.SelectCommand.Parameters.AddWithValue("@ReportType", reportType); 
    da.SelectCommand.Parameters.AddWithValue("@GRNBR", GRNBRs); 
    da.SelectCommand.Parameters.AddWithValue("@PUNBR", PUNBRs); 
    da.SelectCommand.Parameters.AddWithValue("@DATE1", beginningDates); 
    da.SelectCommand.Parameters.AddWithValue("@DATE2", endDates); 
    da.SelectCommand.CommandTimeout = 360; 
} 
catch (SqlException ex) 
{ 
    //something went wrong 
    throw ex; 
} 
finally 
{ 
    if (conn.State == ConnectionState.Open) 
     conn.Close(); 
} 

ここに私のストアドプロシージャがあります。動的SQLテキストで実行しています。

DELETE FROM MonthlyReportSchedule 
WHERE Report='PostClaim' AND 
     PUNBR IN ('100','100','100') AND 
     [Group] IN ('925','926','927') AND 
     StartedAt BETWEEN '2012-04-01' AND '2012-04-30' 

私は実際にこのクエリを実行するために、SQL Serverに行く

が、それは完璧に動作します:ここで

ALTER PROCEDURE [dbo].[RemoveReport] (
    @ReportType NVARCHAR(20), 
    @GRNBR VARCHAR(4000), 
    @PUNBR VARCHAR(4000), 
    @DATE1 DATETIME, 
    @DATE2 DATETIME 
) 
AS 

DECLARE @SQLTEXT VARCHAR(4000) 
BEGIN 

SET @SQLTEXT = 'DELETE FROM TestingTable 
      WHERE Report='''[email protected]+''' AND 
      PUNBR IN ('''[email protected]+''') AND 
      [Group] IN ('''[email protected]+''') AND 
      StartedAt BETWEEN '''+CONVERT(VARCHAR(10),@DATE1,121)+''' 
      AND '''+CONVERT(VARCHAR(10),@DATE2,121)+'''' 

PRINT @SQLTEXT <---I'll print this out to show you what exactly it is executing. 
EXECUTE (@SQLTEXT) 
END 

PRINT @SQLTEXTが実行されているものです。しかし、なぜC#コードから実行されたときにはうまくいかないのですか?どんな助け?

+0

M.Aliの答えにもう少し詳しく説明します。パラメータの中の単一引用符で囲まれたC#からは、SQLインジェクションを避けるために変更されます。それが原因でブレークします。 – Shaun

+0

また、SQLプロファイラを使用すると結果のコードが表示され、何が起きているのかがわかります。 – Shaun

答えて

3

あなたのSQLにパラメータを連結避け、パラメータ化クエリを使用し、

はこれを試してみてください...

ちょうど

ALTER PROCEDURE [dbo].[RemoveReport] 
    @ReportType NVARCHAR(20), 
    @GRNBR VARCHAR(4000), 
    @PUNBR VARCHAR(4000), 
    @DATE1 DATETIME, 
    @DATE2 DATETIME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQLTEXT NVARCHAR(MAX); 

    Declare @GRNBR_xml xml,@PUNBR_xml xml; 

    SET @GRNBR_xml = N'<root><r>' + replace(@GRNBR, ',','</r><r>') + '</r></root>'; 
    SET @PUNBR_xml = N'<root><r>' + replace(@PUNBR, ',','</r><r>') + '</r></root>'; 


SET @SQLTEXT = N'DELETE FROM TestingTable 
      WHERE Report = @ReportType 
       AND PUNBR IN (select r.value(''.'',''varchar(max)'') as item 
          from @PUNBR_xml.nodes(''//root/r'') as records(r)) 
       AND [Group] IN (select r.value(''.'',''varchar(max)'') as item 
           from @GRNBR_xml.nodes(''//root/r'') as records(r)) 
       AND StartedAt BETWEEN @DATE1 AND @DATE2' 

EXECUTE sp_executesql @SQLTEXT 
        ,N'@ReportType NVARCHAR(20) , @GRNBR_xml xml, 
         @PUNBR_xml xml,@DATE1 DATETIME,@DATE2 DATETIME' 
         ,@ReportType 
         ,@GRNBR_xml 
         ,@PUNBR_xml 
         ,@DATE1 
         ,@DATE2 
END 
.....あなたがのparamsにいくつかのカンマ区切りのリストを持っていることに気づきました

あなたは925,926,927としてカンマ区切りのリストを渡していることを確認して、ない

da.SelectCommand.ExecuteNonQuery(); 

これはあなたのストアドプロシージャへの呼び出しを実行しますが、実行するためには、この行を追加すること'925','926','927'

0

てみよう。

幸運

関連する問題