【问题标题】:Conversion failed when converting the nvarchar value to data type int将 nvarchar 值转换为数据类型 int 时转换失败
【发布时间】:2015-06-20 07:14:31
【问题描述】:

我的代码隐藏中出现转换失败的错误。我的代码如下:

using (SqlCommand cmd = new SqlCommand((tempUsertype == "0" ? "Select * from tbl_students" : "Select * from tbl_students where Id in (Select Id from tbl_students where NgoId=@NgoId)"), conn))
{
    cmd.Parameters.AddWithValue("@NgoId", Convert.ToString(Session["User"]));
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);
    ddlStudent.DataValueField = ds.Tables[0].Columns["Id"].ToString();
    ddlStudent.DataTextField = ds.Tables[0].Columns["first_name"].ToString();
    ddlStudent.DataSource = ds.Tables[0];
    ddlStudent.SelectedIndex = 0;

    if (Session["UserType"] == "1" || Session["UserType"] == "2")
    {
        ddlStudent.Enabled = false;
    }
    else
    {
        ddlStudent.Items.Insert(0, new ListItem() { Text = "--Select NGO--", Value = "0" });
        ddlStudent.Enabled = true;
    }
}

我收到以下错误:

将 nvarchar 值转换为数据类型 int 时转换失败。

这里需要做哪些改变?

【问题讨论】:

  • 顺便说一句,这很奇怪:ddlStudent.DataValueField = ds.Tables[0].Columns["Id"].ToString()。因为你得到的字符串 "Id" 那时你已经知道了。
  • Session["User"] 中的任何内容似乎都不是整数。
  • @TimSchmelter:是的,那么在这种情况下该怎么办??
  • NgoId 是 int 还是 string?您将其作为字符串传递 cmd.Parameters.AddWithValue("@NgoId", Convert.ToString(Session["User"]));
  • @jadarnel27:是的,它不是整数,,,

标签: c# sql asp.net


【解决方案1】:

我猜NgoId 是一个 int 但您分配的是一个字符串。所以这可能会解决它:

var p = new SqlParameter("@NgoId", SqlDbType.int).Value = int.Parse(Convert.ToString(Session["User"]));
cmd.Parameters.Add(p);

编辑:由于您已评论会话存储用户名,但 NgoId 是一个 int 列,您有三个选项:

  1. 更改会话以存储用户 ID int 而不是名称
  2. 更改列以存储用户名
  3. 从存储用户名的表中选择用户 ID。

我更喜欢第一个或最后一个选项。

如果您也喜欢最后一种方法,则此方法有效:

string sql = "Select * from tbl_students";
if(tempUsertype != "0")
{
    sql = @"Select s.* 
            from tbl_students s 
            where s.NgoId in (Select u.NgoId 
                              from tbl_User u 
                              where u.username = @Username)";
}
using (var cmd = new SqlCommand(sql, conn))
{
    var p = new SqlParameter("@Username", SqlDbType.varchar);
    p.Value = Convert.ToString(Session["User"]);
    cmd.Parameters.Add(p);
    // ...
}

【讨论】:

    【解决方案2】:

    试试这个:

    cmd.Parameters.Add("@NgoId", SqlDbType.Int).Value = Convert.ToString(Session["User"]);
    

    这会将 NgoId 参数强制转换为 SQL Server int 数据类型。

    【讨论】:

    • 得到错误The handle is invalid. (Exception from HRESULT: 0x80070006 (E_HANDLE))
    猜你喜欢
    • 2020-04-17
    • 2011-08-29
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多