2016-11-23 62 views
0

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

没有映射从对象类型存在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(); 
     } 
    } 
+0

您的例外与您提供的代码不符。包括整个调用堆栈。 – Zer0

+0

'SelectedItem'是一个项目,所以它不起作用。当你使用'DriversJourney.SelectedValue'时,你得到了什么错误? @ Zer0:在这篇文章的标题中的错误是你会得到的异常[如果你试图传递一个ListItem作为参数](http://stackoverflow.com/questions/7095689/no-mapping-exists-from -object型系统的Web-UI-器WebControls-列表项到一个已知的)。 – Santi

+0

@Santi什么?他在做'ToString()'。所以他传递一个不是'SelectedItem'的字符串。不知道你的意思。但我确实同意这是一个例外,说明我为什么会感到困惑。换句话说,代码应该可以正常工作。我不相信这是例外的原因。 – Zer0

回答

2

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

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

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

这个例外是告诉你,你正在为ListItem类型的对象设置一个参数,并且你不可能将它插入到数据库中。

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

+0

更改这些工作,谢谢 – Mateusz

0

从您编辑的问题版本开始,您尝试发送在构建实际SQL命令时无法转换的参数值。或者干脆,这些值不具有简单类型为字符串,整数,布尔等

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与业务逻辑分开。业务逻辑方法只能与相关数据(如标识符,名称等)一起使用,而不能用于UI元素,如ListItem

相关问题