C# 执行存储过程不能添加参数

C# 执行存储过程不能添加参数,c#,sql-server,tsql,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' 它工作正常,参数工作正常,所

在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}'");
我在尝试传递this.HandleSQLError(e,“GetTableBySQL”,SprocName)行中的
StaringDate
EndingDate
参数时遇到异常

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

有人看到有什么不对劲吗?问候

注意:如果我从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
方面遇到了问题,我如何解析为desire输出格式:2018-08-02 00:00:00.000?

问题的原因是

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

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

您是否尝试过不使用sir,我正在更新非常旧的windows窗体项目,所以我认为这不是一个解决方案@GBJBaan您是否尝试过Dapper。。。这是一个SQL客户端库,因此可以很好地与winforms和任何其他C#应用程序配合使用。@Pepe没有人能读懂你的心思或看到你的屏幕。您的主题仍然提到“不工作”,这最初是一个运行时错误。该过程现在是否成功执行?“我怎样才能作为欲望输出而分开……”是什么意思?您现在是否对过程返回的信息有显示问题?请考虑一下您的错误处理。标签“GetTableBySQL”对任何人都有用吗?你似乎没有这个名称的方法或函数。他可能想要
cmd.Parameters.Add(new-SqlParameter(“@StartingDate”,SqlDbType.DateTime)。Value=new-DateTime(2018,8,8)
等等。确切地说

确切地说,我的日期有问题,我用当前的问题更新了我的问题尝试