无法在ExecuteNonQuery上将参数值从String转换为Int32

时间:2013-04-30 20:36:09

标签: asp.net sql sql-server vb.net

无法解决这个问题的任何帮助?代码在此行停止。我忘了提到我有一个主键,每次添加一个新记录时,它会递增1。在数据库中,它也是一个整数。我没有将它添加到此代码中,因为我推测它会在添加所有这些记录时自行添加。如果这是有道理的。

recordsAffected = cmd.ExecuteNonQuery, 

我不确定这个问题是什么。

Dim conn As SqlConnection
Dim cmd As SqlCommand
Dim recordsAffected As String
Dim cmdstring As String = "INSERT House (TypeofHouse, NumberofRooms, Location, Cost, Information, Picture) Values(@TYPEOFHOUSE, @NUMBEROFROOMS, @LOCATION, @COST, @INFORMATION, @PICTURE)"

conn = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\House.mdf;Integrated Security=True;User Instance=True")

cmd = New SqlCommand(cmdstring, conn)

cmd.Parameters.Add("@TYPEOFHOUSE", SqlDbType.NVarChar).Value = txtType.Text
cmd.Parameters.Add("@NUMBEROFROOMS", SqlDbType.Int).Value = txtNumOfRooms.Text
cmd.Parameters.Add("@LOCATION", SqlDbType.NVarChar).Value = txtLocation.Text
cmd.Parameters.Add("@COST", SqlDbType.Int).Value = txtCost.Text
cmd.Parameters.Add("@INFORMATION", SqlDbType.NVarChar).Value = txtInfo.Text
cmd.Parameters.Add("@PICTURE", SqlDbType.NVarChar).Value = txtLocation.Text

conn.Open()

recordsAffected = cmd.ExecuteNonQuery
conn.Close()

5 个答案:

答案 0 :(得分:3)

您是否尝试过首先将文本转换为整数。

I.E改变:

cmd.Parameters.Add("@NUMBEROFROOMS", SqlDbType.Int).Value = txtNumOfRooms.Text

cmd.Parameters.Add("@NUMBEROFROOMS", SqlDbType.Int).Value = CInt(txtNumOfRooms.Text)

所有其他整数也是如此。

基本上你告诉参数期望的数据类型;在这种情况下SqlDbType.Int,因此您需要转换输入数据;在这种情况下,txtNumOfRooms.Text为预期类型。

答案 1 :(得分:1)

您应首先将txtNumOfRoomstxtCost的内容转换为int

如果相应输入字段中的文本实际上是一个数字,则下面的任何一个函数调用都可能有效:

  • CInt(txtNumOfRooms.Text)
  • Int32.Parse(txtNumOfRooms.Text)
  • Convert.ToInt32(txtNumOfRooms.Text)

但是,由于您正在使用用户输入,因此在尝试转换之前,最好检查任何数值的输入是否实际为数字:

If Not IsNumeric(txtNumOfRooms.Text) OrElse Not IsNumeric(txtCost.Text) Then
    Throw new InvalidOperationException("Trying to convert a string to an integer")  
End If

cmd.Parameters.Add("@NUMBEROFROOMS", SqlDbType.Int).Value = CInt(txtNumOfRooms.Text)
cmd.Parameters.Add("@COST", SqlDbType.Int).Value = CInt(txtCost.Text)

答案 2 :(得分:0)

您有两个Int类型的参数,但您将文本字符串设置为值。

cmd.Parameters.Add("@TYPEOFHOUSE", SqlDbType.NVarChar).Value = txtType.Text
cmd.Parameters.Add("@NUMBEROFROOMS", SqlDbType.Int).Value = Convert.ToInt32(txtNumOfRooms.Text)
cmd.Parameters.Add("@LOCATION", SqlDbType.NVarChar).Value = txtLocation.Text
cmd.Parameters.Add("@COST", SqlDbType.Int).Value = Convert.ToInt32(txtCost.Text)
cmd.Parameters.Add("@INFORMATION", SqlDbType.NVarChar).Value = txtInfo.Text
cmd.Parameters.Add("@PICTURE", SqlDbType.NVarChar).Value = txtLocation.Text

你也可以使用

cmd.Parameters.AddWithValue("@TYPEOFHOUSE", txtType.Text)
cmd.Parameters.AddWithValue("@NUMBEROFROOMS", Convert.ToInt32(txtNumOfRooms.Text))
cmd.Parameters.AddWithValue("@LOCATION", txtLocation.Text)
cmd.Parameters.AddWithValue("@COST", Convert.ToInt32(txtCost.Text))
cmd.Parameters.AddWithValue("@INFORMATION", txtInfo.Text)
cmd.Parameters.AddWithValue("@PICTURE", txtLocation.Text)

当然,您需要确保这两个文本框包含可以转换为int的实际字符串。否则使用CInt,Parse或Convert.ToInt32会引发异常 在使用Int32.TryParse填充参数集合之前,您可以引入一些错误检查,如以下示例所示。

Dim numOfRooms as Integer
if Not Int32.TryParse(txtNumOfRooms.Text, numOfRooms) Then
    MessageBox.Show("Type a valid number")
    return
End If

cmd.Parameters.AddWithValue("@NUMBEROFROOMS", numOfRooms)

答案 3 :(得分:0)

您需要将TextBox的Text值(string)转换为具有Integer dataType的列的int值,如下所示

cmd.Parameters.Add("@NUMBEROFROOMS", SqlDbType.Int).Value =CInt(txtNumOfRooms.Text);

答案 4 :(得分:0)

您是否正在对文本框进行验证以验证字符串是否为有效的int?