执行存储过程对添加参数不起作用

在 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和EndingDate参数 时出现异常this.HandleSQLError(e, "GetTableBySQL", SprocName);


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


有人看到那里有问题吗?


烙印99
浏览 156回答 2
2回答

MM们

问题是因为cmd.Parameters.Add(new SqlParameter(parameters, SqlDbType.NVarChar));正在创建一个参数,其名称为变量parameters中保存的任何值,即字符串值,"@StartingDate = '{startDate}', @EndingDate = '{endDate}'"因为这是您ExeSQLParamAndType使用以下代码传递的内容:db.ExeSQLParamAndType("StoredProcedureCalc", parameters, "@EmployeeGuidIdTableType",$"@StartingDate = '{startDate}', @EndingDate = '{endDate}'");你需要创建两个参数,一个叫startDate,一个叫EndDatecmd.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”来实现此目的。
打开App,查看更多内容
随时随地看视频慕课网APP