在ASP.NET C中将整数参数添加到存储过程#

时间:2018-04-16 11:41:21

标签: c# sql asp.net parameter-passing

尝试将整数参数@id传递给存储过程时,出现错误da.Fill(ds)

  

其他信息:将varchar值'@id'转换为数据类型int时转换失败。

我已确保传递整数值,并且存储过程包含正确的数据类型。还有哪些其他可能性来纠正这个错误?

SqlConnection conn = new SqlConnection(cs);
conn.Open(); 

SqlCommand cmd1 = new SqlCommand("asp_GetTrainingDetail", conn);
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@id", id);

SqlDataAdapter da = new SqlDataAdapter(cmd1);
DataSet ds = new DataSet();
da.Fill(ds);

2 个答案:

答案 0 :(得分:0)

试试这个......

 SqlConnection conn = new SqlConnection(cs);
        conn.Open(); SqlCommand cmd1 = new 
        SqlCommand("asp_GetTrainingDetail", conn);
        cmd1.CommandType = CommandType.StoredProcedure;
        cmd1.Parameters.AddWithValue("@id", Int.Parse(id));
        SqlDataAdapter da = new SqlDataAdapter(cmd1);
        DataSet ds = new DataSet();
        da.Fill(ds);

答案 1 :(得分:0)

如果你知道的更好,do not use AddWithValue() ......它必须"猜测"根据您在命令中输入的内容,您在数据库中拥有的数据类型。它是错误的,会导致不必要的转换。

另外:在一次性用品周围使用using(..),尤其是在使用数据库访问时,即使出现异常,它也会关闭您的连接 - 不使用using可能会让某些连接保持未关闭状态。

DataSet ds = new DataSet ();
using (var conn = new SqlConnection (cs))
{
    using (var cmd1 = new SqlCommand ("asp_GetTrainingDetail", conn))
    {
        cmd1.CommandType = CommandType.StoredProcedure;
        cmd1.Parameters.Add("@id", System.Data.SqlDbType.BigInt).Value = id;

        using (var da = new SqlDataAdapter (cmd1))
        {
            da.Fill (ds);
        }
    }
}

阅读do not use AddWithValue()中的链接,了解更多背景信息。