关于c#:SqlCommand参数问题

Issue with SqlCommand Parameters

当我在SSMS中执行以下查询时,会得到预期的结果,即"1"

1
2
3
SELECT TSID
FROM tblTimesheets
WHERE TSUser = 'PJW' AND TSDate = '2012-01-18';

但是,当我的应用程序中的代码生成sqlcommand时,executescalar会失败(它只会导致方法退出,不显示错误消息)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int GetID(string paramUser, DateTime paramDate)
    {
        string strSql ="SELECT TSID" +
                       "FROM tblTimesheets" +
                       "WHERE TSUser = @TSUser AND TSDate = @TSDate;";

        string strConnection = BuildConnectionString();
        SqlConnection linkToDB = new SqlConnection(strConnection);
        linkToDB.Open();

        SqlCommand sqlCom = new SqlCommand(strSql, linkToDB);
        sqlCom.Parameters.Add("@TSUser", SqlDbType.Text);
        sqlCom.Parameters.Add("@TSDate", SqlDbType.Date);
        sqlCom.Parameters["@TSUser"].Value = paramUser;
        sqlCom.Parameters["@TSDate"].Value = paramDate;


        int intResult = (Int32)sqlCom.ExecuteScalar();
        linkToDB.Close();
        return intResult;
    }

我已经完成了代码,可以根据需要确认参数是PJW和2012-01-18,但ExecuteEscalar返回任何数据,我知道这些数据应该存在于SSMS中的类似查询中。

请协助。


你说ExecuteScalar失败,没有错误信息。将代码包装在一个try-catch块中,以确保捕获ExecuteScalar()可能抛出的任何异常。

除此之外,请按照其他人的建议尝试并查看使用SQL事件探查器生成的SQL,然后在SSMS中运行该SQL以比较结果。


当参数为db-type date时,在设置参数时,最好是防御性地去掉时间部分,如下所示:

1
2
sqlCom.Parameters.Add("@TSDate", SqlDbType.Date);
sqlCom.Parameters["@TSDate"].Value = paramDate.Date;

如果这不起作用,请告诉我,我将删除我的答案。


1
2
3
SELECT TSID
FROM tblTimesheets
WHERE TSUser = 'PJW' AND TSDate = '2012-01-18';

这里,u r传递精确的日期作为参数

在将参数传入要传递的存储过程时"日期时间参数日期"

日期时间变量

可能需要解析为存储过程支持的确切日期格式例如,您需要将参数日期变量格式设置为"yyyy-mm-dd"

我不确定……试试看。如果有帮助或没有帮助,请回复!


根据列的类型,尝试以下任一操作,而不是SqlDbType.Text

  • SqlDbType.VarChar
  • SqlDbType.NVarChar
  • SqlDbType.NText
  • SqlDbType.NChar
  • SqlDbType.Char