这让我发疯了。
从对象类型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 :(得分:2)
这些代码行是您问题的一部分:
cmd.Parameters.AddWithValue("@origin", JourOrigin.SelectedItem);
cmd.Parameters.AddWithValue("@destination", JourDestination.SelectedItem);
cmd.Parameters.AddWithValue("@time", date.SelectedItem);
请将它们转换为正确的类型或使用SelectedValue
。
该异常告诉您正在为ListItem
类型的对象设置参数,并且您无法将其插入到数据库中。
抛出异常时(连接了调试器)中断并查看Parameters
集合,确保其值的类型正确。目前,您正在寻找值为ListItem
的参数。但是我会在那里检查它们的正确性。
答案 1 :(得分:0)
从您编辑的问题版本中,您尝试发送在构造实际SQL命令时无法转换的参数值。或者简单地说,这些值没有简单类型,如string,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与业务逻辑分开。业务逻辑方法应仅适用于标识符,名称等相关数据,而不适用于ListItem
s等UI元素。