以下是我的存储过程:
[dbo].[DFW_Completed_Safety] (
@StartDate VARCHAR(10),
@Station VARCHAR(50),
@EmployeeID INT)
当我代码以下内容时:
SqlDataAdapter daAC_CSM = new SqlDataAdapter();
DataSet dsAC_CSM = new DataSet();
try
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlCmd = new SqlCommand();
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Connection = sqlConnection;
sqlCmd.CommandTimeout = 0;
sqlCmd.CommandText = "DFW_Completed_Safety";
sqlCmd.Parameters.AddWithValue("@StartDate", startdate);
sqlCmd.Parameters.AddWithValue("@Station", station);
sqlCmd.Parameters.AddWithValue("@EmployeeID", "0");
daAC_CSM.SelectCommand = sqlCmd;
daAC_CSM.Fill(dsAC_CSM);
}
return dsAC_CSM;
}
catch (Exception)
{
throw;
}
它抛出异常: EmployeeID 作为varchar收到。
Conversion failed when converting the varchar value 'd ' to data type int.
我尝试的事情:
1-很多其他人在StackOverflow上发帖说明Convert.ToInt32(0);
会这样做。由于默认情况下0是Int32,因此这不是解决方案。
2-更改方法以接收varchar(发送“0”)并且它也不起作用。
感谢您的任何想法! (将方法签名保留为Int会更大。)
更新:问题尚未得到解答,因为将我的存储过程更改为varchar没有成功..任何想法?
答案 0 :(得分:0)
请像这样重写您的代码:
try
{
sqlCon = new SqlConnection(connectionString);
sqlCmd = new SqlCommand();
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter daAC_CSM = new SqlDataAdapter();
DataSet dsAC_CSM = new DataSet();
sqlCmd.Connection = sqlCon;
sqlCmd.CommandTimeout = 0;
sqlCmd.CommandText = "DFW_Completed_Safety";
sqlCmd.Parameters.AddWithValue("@StartDate", startdate); //Using "@"
sqlCmd.Parameters.AddWithValue("@Station", station); //Using "@"
sqlCmd.Parameters.AddWithValue("@EmployeeID", 0); //Using "@"
foreach(SqlParameter p in sqlCmd.Parameters){
//Will print Name, Type and Value
System.Diagnostics.Trace.WriteLine("Name:" + p.ParameterName + "Type: " + p.DbType+" Value: "+p.Value);
}
sqlCon.Open();
daAC_CSM.SelectCommand = sqlCmd;
daAC_CSM.Fill(dsAC_CSM);
sqlCon.Close();
return dsAC_CSM;
}
catch (Exception ex)
{
throw ex;
}
它打印什么?你得到什么错误?
答案 1 :(得分:0)
当您从SSMS运行程序时,您很可能会得到相同的错误,因为错误最有可能来自您的过程正文,而不是您如何调用它。如果您要查询的表中的列中有值'd',并且您正在将该列与整数类型进行比较,那么您将收到该错误。另外,还有几个旁白:
SqlCommand
和SqlConnection
个实例放在using子句中,或者手动处理它们,因为它们是IDisposable。throw ex
- 你可能只想要throw
。通过使用throw ex
,您可以搞乱原始异常中可用的堆栈跟踪。答案 2 :(得分:0)
最后它不是第一行。 FormName是存储FormID的字段。之前在这里的程序员可能是一个菜鸟或者将Column数据类型更改为int,使得所有查询都不起作用。非常感谢@Matt_Whitfield& @Luxspes。顺便说一句Luxpes,你是对的,它甚至在SSMS上写成了第1行,但我使用相同的方式写了它:
EXEC @return_value = [dbo].[DFW_Completed_Safety]
@StartDate = N'07-18-2012',
@Station = N'YHZ',
@EmployeeID = 0
通过Print @SqlStatement,我能够复制&粘贴一个新的查询,看到它是一个Int的Form * Name *。谁知道名字可能是国际?