执行存储过程不适用于添加参数

时间:2018-08-08 21:55:33

标签: c# sql-server tsql

在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}'");

尝试在第StaringDate行中传递EndingDatethis.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?

2 个答案:

答案 0 :(得分:0)

问题是由于

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

正在创建一个参数,该参数的名称应包含在变量parameters中,该值是字符串值"@StartingDate = '{startDate}', @EndingDate = '{endDate}'",因为这是您使用以下代码传递给ExeSQLParamAndType的原因: / p>

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));

答案 1 :(得分:0)

C#DateTime和SQL Server DateTime不兼容。您必须更改SQL表中的设置以使用Datetime2而不是DateTime。您可以通过直接向数据库中带有Datetime字段的每个表发出ALTER语句,或在DbContext类中添加一条命令来告诉Entity Framework为所有使用DateTime的类专门使用“ datetime2”来实现此目的。