C# 执行存储过程不能添加参数
在T-SQL中,我有这样一个exec: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' 它工作正常,参数工作正常,所
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)
等等。确切地说确切地说,我的日期有问题,我用当前的问题更新了我的问题尝试