何らかの理由で、私のストアドプロシージャが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#コードから実行されたときにはうまくいかないのですか?どんな助け?
M.Aliの答えにもう少し詳しく説明します。パラメータの中の単一引用符で囲まれたC#からは、SQLインジェクションを避けるために変更されます。それが原因でブレークします。 – Shaun
また、SQLプロファイラを使用すると結果のコードが表示され、何が起きているのかがわかります。 – Shaun