c# - 执行存储过程不适用于添加参数
问题描述
在 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 的参数
有人看出哪里不对了吗?问候
注意:如果我在没有这两个参数的情况下从 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 ?
解决方案
问题是因为
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));
推荐阅读
- javascript - 赛普拉斯输入为空时输入,但不清除时不清除
- java - 是否可以知道 @ParameterizedTests 的 @ValueSource 的大小?
- node.js - 代码:'InvalidAuthenticationToken',消息:'CompactToken 解析失败,错误代码:80049217' - Microsoft AD Graph API
- java - 如何使用 CsvMapper 将 CSV 映射到带有列表的对象?
- postgresql - 偶尔的性能问题
- google-bigquery - 它们是否支持 BigQuery 中单个 DDL 语句(CREATE、DROP、ALTER)的隐式事务?
- android - Jetpack compose Canvas 内容在我使其可滚动后消失
- swift - 如何限制 UIDatePicker 上的日期选择
- r - Bookdown 演示在编译时返回错误
- python - Python:如何在列表列表中添加新字典?