首页 > 解决方案 > 执行存储过程不适用于添加参数

问题描述

在 T-SQL 中,我有一个这样的 exec:

    EXEC [dbo].[usp_TaskStatus_Time_Calculation_Final] 
       @EmployeeGuidIdTableType = @EmployeeGuidIdTableType, 
       @StartingDate = '2018-08-02 00:00:00.000', 
       @EndingDate = '2018-08-08 00:00:00.000'

它工作正常,参数正常工作,所以我想在 C# 中重现它,我这样做:

public DataTable ExeSQLParamAndType(string SprocName, DataTable paramArray, string tableTypeName, string parameters = null)
{
    SqlCommand cmd = new SqlCommand(SprocName, this.dbconn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter(tableTypeName, SqlDbType.Structured));
    cmd.Parameters[tableTypeName].Value = paramArray;
    cmd.Parameters.Add(new SqlParameter(parameters, SqlDbType.NVarChar));

    DataTable tbl = new DataTable("Table1")
        {
            Locale = System.Globalization.CultureInfo.InvariantCulture
        };
    SqlDataAdapter da = new SqlDataAdapter(cmd);

    try
    {
        da.Fill(tbl);
    }
    catch (SqlException e)
    {
        this.HandleSQLError(e, "GetTableBySQL", SprocName);
    }
    finally
    {
        cmd.Dispose();
    }

    return tbl;
}

执行方法:

db.ExeSQLParamAndType("StoredProcedureCalc", parameters,
                      "@EmployeeGuidIdTableType",
                      $"@StartingDate = '{startDate}', @EndingDate = '{endDate}'");

尝试在行中传递StaringDateEndingDate参数 时出现异常this.HandleSQLError(e, "GetTableBySQL", SprocName);

@StartingDate = ''2018-08-02 00:00:00.000'', @EndingDate = ''2018-08-08 00:00:00.000'' 不是过程 StoredProcedureCalc 的参数

有人看出哪里不对了吗?问候

注意:如果我在没有这两个参数的情况下从 c# 执行它(仅使用表类型),它可以工作

更新

我将代码更改为以下注释:

var startDate =  $"'{startingDate.Value.ToString("yyyy-MM-dd 00:00:00.000")}'";
var endDate = $"'{endingDate.Value.ToString("yyyy-MM-dd 00:00:00.000")}'";

db.ExeSQLParamAndType("usp_TaskStatus_Time_Calculation_Final", parameters, "@EmployeeGuidIdTableType", startDate, endDate);

和方法如:

public DataTable ExeSQLParamAndType(string sprocName, DataTable paramArray, string tableTypeName, string startingDate, string endingDate)
{
    SqlCommand cmd = new SqlCommand(sprocName, this.dbconn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter(tableTypeName, SqlDbType.Structured));
    cmd.Parameters[tableTypeName].Value = paramArray;

    DateTime.TryParse(startingDate, out var startDate);
    cmd.Parameters.Add(new SqlParameter("@StartingDate", SqlDbType.DateTime));
    cmd.Parameters["@StartingDate"].Value = startDate;

    DateTime.TryParse(startingDate, out var endDate);
    cmd.Parameters.Add(new SqlParameter("@EndingDate", SqlDbType.DateTime));
    cmd.Parameters["@EndingDate"].Value = endDate;

    DataTable tbl = new DataTable("Table1")
            {
                Locale = System.Globalization.CultureInfo.InvariantCulture
            };

    SqlDataAdapter da = new SqlDataAdapter(cmd);

    try
    {
        da.Fill(tbl);
    }
    catch (SqlException e)
    {
        this.HandleSQLError(e, "GetTableBySQL", sprocName);
    }
    finally
    {
        cmd.Dispose();
    }

    return tbl;
}

但是我遇到了麻烦DateTime,如何解析为期望输出格式: 2018-08-02 00:00:00.000 ?

标签: c#sql-servertsql

解决方案


问题是因为

cmd.Parameters.Add(new SqlParameter(parameters, SqlDbType.NVarChar));

正在使用变量中保存的任何值的名称创建一个参数,该值是parameters字符串值"@StartingDate = '{startDate}', @EndingDate = '{endDate}'",因为这是您ExeSQLParamAndType使用此代码传递的内容:

db.ExeSQLParamAndType("StoredProcedureCalc"
, parameters
, "@EmployeeGuidIdTableType"
,$"@StartingDate = '{startDate}', @EndingDate = '{endDate}'");

你需要创建两个参数,一个被调用startDate,一个被调用EndDate

cmd.Parameters.Add(new SqlParameter(startingDate, SqlDbType.NVarChar));
cmd.Parameters.Add(new SqlParameter(EndingDate , SqlDbType.NVarChar));

推荐阅读