System.FormatException:"无法将参数值从字符串转换为 Int32。



当我试图使用c#windows表单将数据传递到数据库时,标题中不断出现错误。

作为参考,我尝试使用Scope_Identity从一个表中获取当前PK,然后将其作为FK传递到另一个表。但我很难完成这项工作。我毫不怀疑我错过了什么或做错了什么,但老实说,我找不到解决我需要的问题的办法。这是我正在使用的代码。

SqlConnection con = new SqlConnection(@"");
con.Open();
{
using (SqlCommand cmd = new SqlCommand("INSERT dbo.Booking(CustomerID,VehicleID,DateofBooking," +
"DurationBooked, ExpectedReturnDate) VALUES( @CustID, @VehicleID, @DOBooking, @DurationBooked,@ExpectedReturn); INSERT dbo.Payments (BookingID,PaymentMethod,Discount,PaymentAmount," +
"PaymentDate,PaymentReceived) VALUES( SCOPE_IDENTITY(),@PayMeth,@PayAmount,@PayDate, @PayReceived, @Discount)"))
{
cmd.Connection = con;
cmd.Parameters.Add("@CustID", SqlDbType.Int).Value = comboBox1.ValueMember;
cmd.Parameters.Add("@VehicleID", SqlDbType.Int).Value = comboBox2.ValueMember;
cmd.Parameters.Add("@DOBooking", SqlDbType.Date).Value = datefrom.Text;
cmd.Parameters.Add("@ExpectedReturn", SqlDbType.Date).Value = dateTo.Text;
cmd.Parameters.Add("@DurationBooked", SqlDbType.Float, 3).Value = Duration.Text;
cmd.Parameters.Add("@PayMeth", SqlDbType.VarChar, 15).Value = listBox1.Text;
cmd.Parameters.Add("@PayAmount", SqlDbType.Money).Value = PayAmount.Text;
cmd.Parameters.Add("@PayDate", SqlDbType.Date).Value = DatePay.Text;
cmd.Parameters.Add("@PayReceived", SqlDbType.VarChar, 3).Value = PayReceived.Text;
cmd.Parameters.Add("@Discount", SqlDbType.SmallMoney).Value = Discount.Text;
}

我在试图将此PK作为FK传递到另一个表时遇到了大量麻烦。为了参考,我正试图将预订表中的BookingID传给BookingID中的Payments表,这是FH关系

错误图像

我认为您正试图解决另一个问题。您有转换问题,但没有PK或FK密钥一致性。

请检查您发送的所有参数是否与您的说明中描述的类型相同。

也可能是您的scope_identity((的类型与值不同。我不知道你是否涵盖了密钥限制

顺便说一下。超出范围。还有一种获取最后id的方法是使用@@IDENTITY。

@@identity函数返回在同一会话中创建的最后一个标识。scope_identity((函数返回在同一会话和同一作用域中创建的最后一个标识。

固定。感谢所有提供帮助的人。问题确实与我的参数有关,特别是与日期有关。我需要将SQL server中的DataType更改为DateTime,并确保查询首先在SQL server中运行。

using (SqlCommand cmd = new SqlCommand("INSERT dbo.Booking(CustomerID,VehicleID,DateofBooking, DurationBooked, ExpectedReturnDate) " +
"VALUES( @CustID, @VehicleID, @DOBooking, @DurationBooked,@ExpectedReturn) SELECT SCOPE_IDENTITY(); " +
"INSERT dbo.Payments (BookingID,PaymentMethod,Discount,PaymentAmount, PaymentDate,PaymentReceived)" +
"VALUES( SCOPE_IDENTITY(),@PayMeth,@Discount,@PayAmount, @PayDate, @PayReceived)"))
{
cmd.Connection = con;
cmd.Parameters.Add("@CustID", SqlDbType.Int).Value = Convert.ToInt32(CustID.SelectedValue);
cmd.Parameters.Add("@VehicleID", SqlDbType.Int).Value = Convert.ToInt32(VehicleID.SelectedValue);
cmd.Parameters.Add("@DOBooking", SqlDbType.DateTime).Value = DateofBooking.Value.Date;
cmd.Parameters.Add("@ExpectedReturn", SqlDbType.DateTime).Value = ExpectedReturnDate.Value.Date;
cmd.Parameters.Add("@DurationBooked", SqlDbType.Float, 3).Value = Duration.Text;
cmd.Parameters.Add("@PayMeth", SqlDbType.VarChar, 15).Value = PaymentMethod.Text;
cmd.Parameters.Add("@PayAmount", SqlDbType.Money).Value = PayAmount.Text;
cmd.Parameters.Add("@PayDate", SqlDbType.DateTime).Value = PayDate.Value.Date;
cmd.Parameters.Add("@PayReceived", SqlDbType.VarChar, 3).Value = Received.Text;
cmd.Parameters.Add("@Discount", SqlDbType.VarChar, 3).Value = Discount.Text;
if (cmd.ExecuteNonQuery() > 0)
{
MessageBox.Show("Record inserted");
}
else
{
MessageBox.Show("Customer failed");
}

对于Ref,Scope_Identity运行良好。

感谢你们的支持,我知道这对你们中的一些人来说可能是基本的,但我对这一切都是新手,并试图自学,正如你们所能想象的那样。。即使这个小问题解决了,也让人松了一口气。谢谢各位

最新更新