在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?
答案 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”来实现此目的。