c# - 存储过程无法使用动态 sql 文本正确运行

标签 c# sql-server sql-server-2008 stored-procedures

由于某种原因,我的存储过程在 C# 代码隐藏中没有任何错误地执行,但它根本没有删除存储过程编写的任何内容。我有所有正确的参数和一切。我使用 C# 代码中的所有相同参数从 SQL Server 运行查询,它运行良好。我不明白为什么当我从 SQL Server 运行它时它可以工作,但当我从我的 Visual Studio 中的 C# 代码运行它时它不工作。

这是将数据传递给存储过程的 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 文本执行。

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='''+@ReportType+''' AND
            PUNBR IN ('''+@PUNBR+''') AND
            [Group] IN ('''+@GRNBR+''') 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 正在运行的内容:

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 运行这个查询时,它运行得很好。但是为什么在从 C# 代码执行时它不起作用。有帮助吗?

最佳答案

避免将参数连接到您的 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

注意

确保将逗号分隔列表作为 925,926,927 而不是 '925','926','927'

关于c# - 存储过程无法使用动态 sql 文本正确运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33642284/

相关文章:

C# - 合并来自 SQL 结果集的匹配结果

c# - 适用于 EF Core 时强制 SUM 方法返回 NULL

c# - 检测到 Protobuf-net 可能的递归 : serialize children and parents

sql-server - TADOQuery 连接表 - 从结果中插入\删除记录

c# - 在 C# 上转义花括号和反斜杠

sql - 非常大的表中的列的不同值

sql-server - SQL Server sp_msforeachtable 用法仅选择满足某些条件的表

sql-server - 分组行的排序依据和顶部

c# - collections.Contains(T) 方法

c# - 两个 DateTime 对象之间的格式差异时间