【问题标题】:No mapping exists from object type System.Web.UI.WebControls.ListItem to a known managed provider native type不存在从对象类型 System.Web.UI.WebControls.ListItem 到已知托管提供程序本机类型的映射
【发布时间】:2016-11-23 21:00:34
【问题描述】:

这快把我逼疯了。

不存在从对象类型 System.Web.UI.WebControls.ListItem 到已知托管提供程序本机类型的映射

当我尝试通过插入将数据从列表框传递到数据库时,我收到此错误。列表框中的数据也是从数据库中提取的。 插入看起来像这样:

cmd.Parameters.AddWithValue("@driver",DriversJourney.SelectedItem.ToString());

我用 selecteditem()、selectedValue.ToString())、selectedIndex、SelectedValue 尝试过。

 public partial class FindDriver : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\RideShare.mdf;Integrated Security=True");//set connection as a variable
    SqlCommand cmd = new SqlCommand();
    SqlDataReader dr;


        protected void Page_Load(object sender, EventArgs e)
        {
                if (Session["username"] == null)
                    {
                        Response.Redirect("~/Account/FindDriver.aspx");
                    }

                else
                    {
                        labelWelcome.Text = "Welcome " + Session["UserName"] + "!".ToString();
                    }

        }

 protected void search(object sender, EventArgs e)
    {
        con.Open();
        cmd.Connection = con;
        cmd.CommandText = "SELECT * FROM Driver WHERE City = '" + JourOrigin.SelectedItem + "' ";
        dr = cmd.ExecuteReader();
        dr.Read();
        if (dr.HasRows)
        {
            Session["city"] = JourOrigin.SelectedItem.ToString();
            Response.Redirect("~/Account/FindDriver.aspx");
            NoCity.Visible = false;

        }
        else
        {
            DriversJourney.Items.Clear();
            DriversJourney.Items.Add("No Drivers in selected city, try another city");
            NoCity.Visible = true;
            NoCity.Text = "No drivers in selected city, please try another city";
        }
        con.Close();
    }

 protected void JourneyAdd_Click(object sender, EventArgs e)
    {
        using(SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\RideShare.mdf;Integrated Security=True"))
        {


           SqlCommand cmd = new SqlCommand("INSERT INTO Journey(JourneyOrigin, JourneyDestination, Date, Time, PassengerUserName, DriverUserName) VALUES (@origin, @destination, @date, @time, @driver, @passenger)");
           cmd.CommandType = CommandType.Text;
           cmd.Connection = connection;
           cmd.Parameters.AddWithValue("@origin", JourOrigin.SelectedItem);
           cmd.Parameters.AddWithValue("@destination", JourDestination.SelectedItem);
           cmd.Parameters.AddWithValue("@date", Calendar.SelectedDate);
           cmd.Parameters.AddWithValue("@time", date.SelectedItem);
           cmd.Parameters.AddWithValue("@driver", DriversJourney.SelectedValue);
           cmd.Parameters.AddWithValue("@passenger", Session["username"].ToString());
           connection.Open();

           cmd.ExecuteNonQuery();
           connection.Close();
        }
    }

【问题讨论】:

  • 您的异常与您提供的代码不匹配。包括整个调用堆栈。
  • SelectedItem 是一个项目,所以它不起作用。当您使用DriversJourney.SelectedValue 时,您遇到了什么错误? @Zer0:这篇文章标题中的错误是你会得到if you tried to pass a ListItem as a parameter的异常。
  • @Santi 什么?!他在做ToString()。所以他传递的字符串不是SelectedItem。不明白你的意思。但我确实同意这就是例外所说明的,这就是我感到困惑的原因。换句话说,代码应该可以正常工作。而且我不相信这是异常的原因。
  • 无论我在 DriversJourney 之后放什么,我都会得到完全正确的错误。我也明白了:System.Data.dll 中发生了“System.ArgumentException”类型的异常,但未在用户代码中处理
  • @Zero0 哦,你是对的,我什至没有注意到,我认为 OP 在添加 .toString() 之前一定已经取消了这个异常。

标签: c# sql asp.net


【解决方案1】:

这些代码行是您的问题的一部分:

cmd.Parameters.AddWithValue("@origin", JourOrigin.SelectedItem);
cmd.Parameters.AddWithValue("@destination", JourDestination.SelectedItem);
cmd.Parameters.AddWithValue("@time", date.SelectedItem);

请将它们转换为正确的类型或使用SelectedValue

该异常告诉您正在将参数设置为ListItem 类型的对象,而您不可能将其插入数据库。

在抛出异常时中断(附加调试器)并查看Parameters 集合,确保它们的值是正确的类型。现在,您正在寻找一个值为ListItem 的参数。但我会在那里检查它们的正确性。

【讨论】:

    【解决方案2】:

    从问题的编辑版本中,您尝试发送在构造实际 SQL 命令时无法翻译的参数值。或者简单地说,这些值没有字符串、int、bool等简单类型。

       cmd.Parameters.AddWithValue("@origin", JourOrigin.SelectedItem);
       cmd.Parameters.AddWithValue("@destination", JourDestination.SelectedItem);
       cmd.Parameters.AddWithValue("@date", Calendar.SelectedDate);
       cmd.Parameters.AddWithValue("@time", date.SelectedItem);
       cmd.Parameters.AddWithValue("@driver", DriversJourney.SelectedValue);
    

    仔细检查上面的行并选择实际值(不是整个对象,因为 SelectedItem 似乎是)。

    更一般地说,您应该尝试将 UI 与业务逻辑分开。业务逻辑方法应仅适用于标识符、名称等相关数据,而不适用于 ListItems 等 UI 元素。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多