繁体   English   中英

System.FormatException:“无法将参数值从 String 转换为 Int32。”

[英]System.FormatException: 'Failed to convert parameter value from a String to a 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列中的付款表,这是一种FK关系

错误图片

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

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

也可能是您的 scope_identity() 的类型与值不同。 我不知道你是否用 Keys 约束覆盖了这个

顺便一提。 出 scope。还有一种获取最后一个 ID 的方法是使用@@IDENTITY。

@@identity function 返回在同一个 session 中创建的最后一个身份。scope_identity() function 返回在同一个 session 和同一个 scope 中创建的最后一个身份。

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

 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工作得很好。

感谢您的所有支持,我知道这对你们中的一些人来说似乎很基本,但我对这一切都是陌生的,并且正在尝试自学,所以您可以想象..即使这个小问题得到解决,我也松了一口气。 多谢你们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM