调用存储过程时转换失败

时间:2012-07-22 23:26:27

标签: c# asp.net sql sql-server stored-procedures

以下是我的存储过程

[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没有成功..任何想法?

3 个答案:

答案 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',并且您正在将该列与整数类型进行比较,那么您将收到该错误。另外,还有几个旁白:

  • 您应该将SqlCommandSqlConnection个实例放在using子句中,或者手动处理它们,因为它们是IDisposable。
  • 你可能不希望你的catch块中有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 *。谁知道名字可能是国际?