【问题标题】:System.Data.SqlClient.SqlException: 'Invalid column nameSystem.Data.SqlClient.SqlException:'无效的列名
【发布时间】:2020-07-18 22:28:17
【问题描述】:

我正在尝试学习 Vb.Net 并一起使用 sql,目前我在尝试将信息插入数据库时​​遇到了一个问题,当尝试将文本框中的信息插入 de DB 时,它总是显示相同的错误。

System.Data.SqlClient.SqlException: 'Invalid column name 'nombre'.
Invalid column name 'calle'.
Invalid column name 'colonia'.
Invalid column name 'ciudad'.
Invalid column name 'cp'.
Invalid column name 'Tel1'.
Invalid column name 'Tel2'.
Invalid column name 'RFC'.'

这是我的代码

Imports System.Data.Common
Imports System.Data.SqlClient

Public Class Agregar
    Private myConn As SqlConnection
    Private myCmd As SqlCommand
    Private myReader As SqlDataReader
    Private results As String


    Private Sub Agregar_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        myConn = New SqlConnection("Initial Catalog=Database1;" &
        "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\sergi\source\repos\AppsPadre\AppsPadre\Database1.mdf;Integrated Security=True")

        myConn.Open()


    End Sub



    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Me.Close()
        Inicio.Show()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


        'Dim connectionString As String = "Data Source= DB\Database1;Initial Catalog=Orders;Integrated Security=True"
        'Using connection As New SqlConnection(connectionString)

        Dim nombre As String = txtNombre.Text
        Dim calle As String = txtCalle.Text
        Dim colonia As String = txtColonia.Text
        Dim ciudad As String = txtCiudad.Text
        Dim cp As String = txtCP.Text
        Dim Tel1 As String = txtTel1.Text
        Dim Tel2 As String = txtTel2.Text
        Dim RFC As String = txtRFC.Text

        If txtNombre.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba un Nombre.")

        ElseIf txtCalle.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba una Calle.")

        ElseIf txtColonia.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba una Colonia.")

        ElseIf txtCiudad.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba una Ciudad.")

        ElseIf txtCP.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba un Codigo Postal.")

        ElseIf txtTel1.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba un Telefono.")

        ElseIf txtRFC.Text.Equals("") Then
            MessageBox.Show("Porfavor escriba un RFC.")

        Else
            /* Dim MyValues As String = String.Format("'{0}', '{1}', '{2}', {3}', '{4}', '{5}', '{6}', '{7}'", txtNombre.Text, txtCalle.Text, txtColonia.Text, txtCiudad.Text, txtCP.Text, txtTel1.Text, txtTel2.Text, txtRFC.Text)*/
            Dim insertCommand As String = "INSERT INTO Remitente([nombre], [calle], [colonia], [ciudad], [cp], [tel_1], [tel_2], [rfc]) VALUES(nombre, calle, colonia, ciudad, cp, Tel1, Tel2, RFC)"
            Dim cmd As New SqlCommand(insertCommand, myConn)
            cmd.ExecuteNonQuery()

        End If
    End Sub
End Class

这是我的数据库代码/脚本:

CREATE TABLE [dbo].[Remitente] (
    [Id_remitente] INT           NOT NULL IDENTITY,
    [nombre]       VARCHAR (50)  NOT NULL,
    [calle]        VARCHAR (100) NOT NULL,
    [colonia]      VARCHAR (50)  NOT NULL,
    [ciudad]       VARCHAR (50)  NOT NULL,
    [cp]           SMALLINT      NOT NULL,
    [tel_1]        SMALLINT      NOT NULL,
    [tel_2]        SMALLINT      NULL,
    [rfc]          SMALLINT      NOT NULL,
    CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED ([Id_remitente] ASC)
);

我已经环顾四周,找不到解决问题的方法,我们将不胜感激。

【问题讨论】:

  • 未正确提供值,SQL 无法绑定代码错误地认为它作为“值”插入的参数(与表列同名)。请参阅有关如何使用参数化查询的 SQL 教程。另外,请确保发布最少(且有效)的代码:一些重要的原因代码已被注释掉..?
  • ⚠️ 这(使用字符串插值)是一种低质量的不安全方法,容易发生 SQL 注入和意外损坏。有关如何使用参数,请参阅上面提供的链接。
  • @T.S.小鲍比桌会帮你的!!
  • @user2864740 OP 问出了什么问题 :-) 我给出了解决方案。它说,“我正在学习 vb”。所以,让OP学习。一步到位。
  • @Mary Little Bobby 将获得 OP,而不是我。 OP只是学习。这不是生产问题。我们让他继续前进 - 足够好

标签: sql-server vb.net


【解决方案1】:

在您的代码中,您准备了一个名为 MyValues 的字符串用作您的值列表,但您忘记实际使用它。

您的值字符串中还包含单引号中的所有值,但并非表中的所有列都是varchar 列。其中四个是smallint。这不会导致错误,因为 SQL 会自动尝试将它们转换为 smallint,但这是不准确的。

Dim MyValues As String = String.Format(
   "'{0}', '{1}', '{2}', '{3}', {4}, {5}, {6}, {7}", 
   txtNombre.Text, txtCalle.Text, txtColonia.Text, txtCiudad.Text, txtCP.Text, txtTel1.Text, txtTel2.Text, txtRFC.Text)

Dim insertCommand As String = "INSERT INTO Remitente(" & _
   "[nombre], [calle], [colonia], [ciudad], [cp], [tel_1], [tel_2], [rfc]) " & _
   "VALUES(" & MyValues & ")"

【讨论】:

  • 谢谢!,我有字符串,但它给了我错误,所以我尝试使用不同的方法,在添加你说的更正后,它现在给出了这个错误:System.Data.SqlClient.SqlException: 'Incorrect syntax near ','.' 。但它没有说错误在哪一行,我现在有点迷路了。
  • @SergioFlores 啊,tel_1tel_2 是用来保存电话号码的吗?如果是这样,它们不应该是表中的smallint 值。也许文本框中的文本会弄乱字符串。您能否在Dim insertCommand 行之后添加一行代码MessageBox.Show(insertCommand),以便我们可以看到正在构造的字符串值?我认为我们可能需要使用不同的 SQL 列类型。或者我在构造字符串时犯了一个 VB 错误,我已经 15 年没有使用它了;)
  • 确实是电话号码,添加MessageBox后看到信息,错误改成int相关的问题,所以我只是将电话和其他改为varchar并给它最大值共 10 个字符,非常感谢!
  • ? ⚠️ 这是一种低质量的不安全方法,容易发生 SQL 注入和意外损坏。有关如何使用参数,请参阅上面提供的链接。
  • 我正在谈论推广不良做法。由于答案没有包含如此重要的信息,因此会收到警告。遗憾的是没有明确提供指导并努力建立更好的编码习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2019-11-02
  • 2016-04-22
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多