2012-01-18 51 views
0

当我在SSMS执行以下查询我得到预期的结果,即“1”问题与SqlCommand的参数

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

然而,当SqlCommand的是在我的应用程序中的代码生成的的ExecuteScalar失败(它只是导致该方法退出而没有错误消息)。

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,但返回的ExecuteScalar任何数据,我知道应该有基于我在SSMS可比查询。

请协助。

+2

你可以运行SQL事件探查器,并找到该命令击中数据库?抓住声明,并尝试在SSMS中手动运行 - 如果你有确切的SQL敲击db,应该更容易发现。 – AdaTheDev

+0

什么是SQL Profiler显示在服务器上执行? – Richard

+0

我知道这是微不足道的,但你确定连接字符串指向同一个数据库吗?你是否使用同一个数据库用户进行连接(也许你使用域帐户通过SSMS连接,而你的代码使用的是具有较少特权的指定帐户)? – Strillo

回答

1

而不是SqlDbType.Text尝试采取以下的,这取决于列的类型:

  • SqlDbType.VarChar
  • SqlDbType.NVarChar
  • SqlDbType.NText
  • SqlDbType.NChar
  • SqlDbType.Char
1
SELECT TSID 
FROM tblTimesheets 
WHERE TSUser = 'PJW' AND TSDate = '2012-01-18'; 

这里ü[R合格的确切日期作为参数

凡为同时传递参数给你逝去的 “日期时间paramDate”

一个日期时间变量的存储过程

五月是你需要解析到确切的日期格式由 即你需要格式化paramDate变量存储过程支承为“YYYY-MM-DD”

我不确定..尝试一下..并回复是否有帮助!

+0

尽管参数的SqlDbType是Date,所以即使paramDate有时间,在命中数据库之前也应该删除它。 – AdaTheDev

1

当参数为DB型date的,这是一个很好的做法,防守剥去设置参数,这样在部分时间:

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

请让我知道,如果这没有帮助,和我会删除我的答案。

1

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

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