【问题标题】:InvalidCastException when converting control values to SQL parameters将控件值转换为 SQL 参数时出现 InvalidCastException
【发布时间】:2012-07-19 01:16:38
【问题描述】:

nudAge.Value 是向上向下的数字。在我的 sql 数据库中,它是Age(int, null)。 我做到了,

      insert.Parameters.AddWithValue("@age", nudAge.Value.ToString())

我不确定是否应该使用 .ToString()

date_of_confinement 是我数据库中的日期时间。格式应该是这样吗?

      insert.Parameters.AddWithValue("@date_of_confinement", dtpDate.Value.ToShortDateString)

另外,对于 number_of_bottles 是 vb.net 中的文本和 db 中的 Int,我使用了 Int32.Parse 但不确定,

      insert.Parameters.AddWithValue("@number_of_bottles", Int32.Parse(txtBottle.Text))

但我仍然收到错误“System.InvalidCastException”。

这是我的代码:

      PatientInfoConnection.Open() 'open database connection

      Dim sql As String = ""
      sql = "insert into PatientInfo (name, age, date_of_confinement,type_of_sickness, type_of_IVfluid, number_of_bottles, drop_rate)" & _
      " values (@name, @age, @date_of_confinement, @type_of_sickness, @type_of_IV_fluid, @number_of_bottles, @drop_rate)"


      Dim insert As New SqlCommand(sql, PatientInfoConnection)
      insert.Parameters.AddWithValue("@name", txtName.Text)
      insert.Parameters.AddWithValue("@age", Int32.Parse(txtAge.Text))
      insert.Parameters.AddWithValue("@date_of_confinement", Date.Parse(dtpDate.Value))
      insert.Parameters.AddWithValue("@type_of_sickness", txtSickness.Text)
      insert.Parameters.AddWithValue("@type_of_IV_fluid", txtFluid.Text)
      insert.Parameters.AddWithValue("@number_of_bottles", Int32.Parse(txtBottle.Text))
      insert.Parameters.AddWithValue("@drop_rate", Int32.Parse(txtDrop.Text))

      insert.ExecuteNonQuery()

这是我的新代码:(我修改了一些。我没有收到任何错误,但是当我想通过单击保存按钮进行保存时,它什么也没做。我与数据库的连接有问题吗?谢谢!)

      Private Sub PatientInfoBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PatientInfoBindingNavigatorSaveItem.Click
    Me.Validate()
    Me.PatientInfoBindingSource.EndEdit()
    Me.PatientInfoTableAdapter.Update(Me.PatientInfoDBDataSet.PatientInfo)

End Sub

Private Sub EditInfo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'TODO: This line of code loads data into the 'PatientInfoDBDataSet.PatientInfo' table. You can move, or remove it, as needed.
    Me.PatientInfoTableAdapter.Fill(Me.PatientInfoDBDataSet.PatientInfo)

End Sub
Private Sub cmdSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSave.Click
    Try

        'To check if all values have been filled up
        If txtName.Text = "" Or txtAge.Text = "" Or dtpDate.Value = "" _
        Or txtSickness.Text = "" Or txtFluid.Text = "" Or txtBottle.Text = "" Or txtDrop.Text = "" _
        Then

            MsgBox("Please Complete All the Required Fields")

        Else
            Try

                Dim PatientInfoConnection As SqlConnection = New _
                SqlConnection("Server=CATH-PC; database=PatientInfoDB;user id=sa;password=********") 'connection to SQL database

                PatientInfoConnection.Open() 'open database connection

                Dim sql As String = ""
                sql = "insert into PatientInfo (name, age, date_of_confinement,type_of_sickness, type_of_IVfluid, number_of_bottles, drop_rate)" & _
                                   " values (@name, @age, @date_of_confinement, @type_of_sickness, @type_of_IV_fluid, @number_of_bottles, @drop_rate)"


                Dim insert As New SqlCommand(sql, PatientInfoConnection)
                insert.Parameters.AddWithValue("@name", txtName.Text)
                insert.Parameters.AddWithValue("@age", Convert.ToInt32(txtAge.Text))
                insert.Parameters.AddWithValue("@date_of_confinement", Date.Parse(dtpDate.Value))
                insert.Parameters.AddWithValue("@type_of_sickness", txtSickness.Text)
                insert.Parameters.AddWithValue("@type_of_IV_fluid", txtFluid.Text)
                insert.Parameters.AddWithValue("@number_of_bottles", Convert.ToInt32(txtBottle.Text))
                insert.Parameters.AddWithValue("@drop_rate", Convert.ToInt32(txtDrop.Text))

                insert.ExecuteNonQuery()

                PatientInfoConnection.Close() 'close database connection

                MsgBox("Successfully Saved")
                Me.Visible = False
                Mainform.Show()


            Catch myerror As MySqlException
                MessageBox.Show("Error Connecting to Database: " & myerror.Message & ". Please contact the operator")

            End Try
        End If
    Catch ex As Exception
    End Try
End Sub

【问题讨论】:

  • 行或语句中抛出异常?
  • 您在这里引用了三个不同的东西(nudAgedtpDatetxtBottle)。你的问题到底是什么?其中哪一个导致异常?
  • 我想知道我的语法是否正确。我认为我的值有问题:dtpDate 和 txtBottle 因为我收到 System.InvalidCastException 错误根据我的编辑,我发布了我的代码,而不是使用数字 up down 与 Age 和 drop_rate,我把它做成了 .Text。 .
  • 我认为您的问题出现在 insert.Parameters.AddWithValue("@age", nudAge.Value.ToString()) 语句中。你尝试转换成字符串。哪一行给了你例外?

标签: sql vb.net tostring datetimepicker


【解决方案1】:

在您的方法上添加断点,逐步遍历每一行,以找到发生异常的确切行。

试试这个:

Dim sql As String
sql = "insert into PatientInfo (name, age, date_of_confinement,type_of_sickness, type_of_IVfluid, number_of_bottles, drop_rate)" & _
                      " values (@name, @age, @date_of_confinement, @type_of_sickness, @type_of_IV_fluid, @number_of_bottles, @drop_rate)"


                Dim insert As New SqlCommand(sql, PatientInfoConnection)
                insert.Parameters.AddWithValue("@name", txtName.Text)
                insert.Parameters.AddWithValue("@age", Convert.ToInt32(txtAge.Text))
                insert.Parameters.AddWithValue("@date_of_confinement", Date.Parse(dtpDate.Value))
                insert.Parameters.AddWithValue("@type_of_sickness", txtSickness.Text)
                insert.Parameters.AddWithValue("@type_of_IV_fluid", txtFluid.Text)
                insert.Parameters.AddWithValue("@number_of_bottles", Convert.ToInt32(txtBottle.Text))
                insert.Parameters.AddWithValue("@drop_rate", Convert.ToInt32(txtDrop.Text))

                insert.ExecuteNonQuery()

问候

【讨论】:

  • 嗨,我按照你说的做了,我改成了 Convert.Int32().. 之后,我又运行了。当我单击保存按钮时,没有像以前那样的错误,但它没有执行这些行: MsgBox("Successfully Saved") Me.Visible = False Mainform.Show()
  • 您的记录会保存吗?添加 PatientInfoConnection.Close() ..你能在那个插入方法上发布你的完整代码吗?
  • 嗨 BizzApps,我认为它没有保存到我的数据库中。而且,我修改了我的帖子。谢谢您的帮助! ^^
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多