System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с' '.' - PullRequest
2 голосов
/ 21 сентября 2019

Я получаю эту ошибку SQL Server и не могу понять, в чем проблема:

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

xception Подробности: System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с' '.'

Ошибка источника: строка: 46

строка ошибки: cmdsql.ExecuteNonQuery ()

код:

Dim connexcel As OleDbConnection
Dim daexcel As OleDbDataAdapter
Dim dsexcel As DataSet
Dim cmdexcel As OleDbCommand
Dim drexcel As OleDbDataReader

Dim connsql As SqlConnection
Dim dasql As SqlDataAdapter
Dim dssql As DataSet
Dim cmdsql As SqlCommand
Dim drsql As SqlDataReader

Private Sub import_excel_to_sql_server_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.CenterToScreen()
End Sub

Private Sub BtnImpExcelFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnImpExcelFile.Click
    On Error Resume Next
    OpenFileDialog1.Filter = "(* .xls) | * .xls | (*. Xlsx) | *. xlsx | All files (*. *) | *. * "
           OpenFileDialog1.ShowDialog()
    FileAdd.Text = OpenFileDialog1.FileName
    connexcel = New OleDbConnection("provider = Microsoft.ace.OLEDB.12.0; data source =" & FileAdd.Text & "; Extended Properties = Excel 8.0;")
    connexcel.Open()

    Dim dtSheets As DataTable = connexcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
    Dim listSheet As New List(Of String)
    Dim drSheet As DataRow

    For Each drSheet In dtSheets.Rows
        listSheet.Add(drSheet("TABLE_NAME").ToString())
    Next

    For Each sheet As String In listSheet
        ExcelSheetList.Items.Add(sheet)
    Next
End Sub

Private Sub ExcelSheetList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExcelSheetList.SelectedIndexChanged
    daexcel = New OleDbDataAdapter("select * from [" & ExcelSheetList.Text & "]", connexcel)
    dsexcel = New DataSet
    daexcel.Fill(dsexcel)
    DGVImpData.DataSource = dsexcel.Tables(0)
    DGVImpData.ReadOnly = True
End Sub

Sub connections()
    connsql = New SqlConnection("data source =. \ MSSMLBIZ; initial catalog = MyInvoice; integrated security = true")
    connsql.Open()
End Sub

Private Sub BtnSaveImpData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSaveImpData.Click
    For line As Integer = 0 To DGVImpData.RowCount - 2
        Call connections()
        Dim save As String = "insert into InvoiceData values ​​('" & DGVImpData.Rows(line).Cells(0).Value & "', '" & DGVImpData.Rows(line).Cells(1).Value & "')"
    cmdsql = New SqlCommand(save, connsql)
        cmdsql.ExecuteNonQuery()
    Next
    MsgBox("data saved successfully")
    DGVImpData.Columns.Clear()
End Sub

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

У меня есть код изменения согласно «Предоставлено Мэри». Теперь он решает, что «oledbcommand» не может быть преобразовано в ошибку «oledbconnection». Но теперь он сталкивается с ошибкой в ​​качестве начальной стадии. System.Data.SqlClient.SqlException: «Неправильный синтаксис рядом»'.'

Вот новый код с изменениями

Private ExcelConString As String

Private Sub PKGAbtnImpExcelFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PKGAbtnImpExcelFile.Click
    Dim strFileName As String
    Dim dtSheets As DataTable
    PKGAofdImpOpenExcel.Filter = "All Files (*.*)|*.*|Excel files (*.xlsx)|*.xlsx|CSV Files (*.csv)|*.csv|XLS Files (*.xls)|*xls"
    PKGAofdImpOpenExcel.ShowDialog()
    strFileName = PKGAofdImpOpenExcel.FileName
    ExcelConString = "provider = Microsoft.ace.OLEDB.12.0; data source =" & strFileName & "; Extended Properties = Excel 8.0;"
    Using connexcel = New OleDbConnection(ExcelConString)
        connexcel.Open()
        dtSheets = connexcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
    End Using
    Dim exSheets() As Object = (From dRow In dtSheets.AsEnumerable() Select dRow("TABLE_Name")).ToArray
    PKGAtxtImpExlSheetL.Items.AddRange(exSheets)
End Sub

Private Sub PKGAbtnImpEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PKGAbtnImpEdit.Click
    Dim dt As New DataTable
    Using cn As New OleDbConnection(ExcelConString)
        'In older versions of Visual Studio you may have to use String.Format instead of the interpolated string.
        Using cmd As New OleDbCommand($"select * from [{PKGAtxtImpExlSheetL.Text}];", cn)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    End Using
    PKGAdgvImpData.DataSource = dt
    PKGAdgvImpData.ReadOnly = True
End Sub

Private Sub PKGAbtnImpSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PKGAbtnImpSave.Click
    Using cn As New SqlConnection("Data Source=DESKTOP-MIQGJTK\MSSMLBIZ;Initial Catalog=PkGlobalAccounting;Integrated Security=True")
        Using cmd As New SqlCommand("Insert Into Test(Name, Type) Values ​​(@Name, @Type);", cn)
            cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50)
            cmd.Parameters.Add("@Type", SqlDbType.VarChar, 100)
            cn.Open()
            For line As Integer = 0 To PKGAdgvImpData.RowCount - 2
                cmd.Parameters("@Name").Value = PKGAdgvImpData.Rows(line).Cells(0).Value
                cmd.Parameters("@Type").Value = PKGAdgvImpData.Rows(line).Cells(1).Value
                cmd.ExecuteNonQuery() 'Line Error
            Next
        End Using
    End Using
    MsgBox("data saved successfully")
    PKGAdgvImpData.Columns.Clear()

End Sub

Пожалуйста, помогите мне разобраться с этой ошибкой. Спасибо

0 голосов
/ 29 сентября 2019

Спасибо за помощь в исправлении ошибки в моем коде.Вот финальный код без System.Data.SqlClient.SqlException: «Неверный синтаксис рядом с« ».ошибка.

Теперь я попытался улучшить код в последнем разделе (см. Ниже), чтобы определить параметры для экспорта данных.Поскольку у меня есть большое количество данных для экспорта в SQL Server, я получаю сообщение об ошибке тайм-аута.Может ли кто-нибудь улучшить код для быстрого экспорта данных в SQL Server?

connsql.Open () "System.InvalidOperationException: 'Истекло время ожидания. Время ожидания истекло до получения соединения из пула. Это можетпроизошли из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула. '"

Dim connexcel As OleDbConnection
Dim daexcel As OleDbDataAdapter
Dim dsexcel As DataSet
Dim cmdexcel As OleDbCommand
Dim drexcel As OleDbDataReader


Dim connsql As SqlConnection
Dim dasql As SqlDataAdapter
Dim dssql As DataSet
Dim cmdsql As SqlCommand
Dim drsql As SqlDataReader

Private Sub Import_excel_to_sql_server_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.CenterToScreen()
End Sub

Private Sub PKGAbtnImpExcelFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PKGAbtnImpExcelFile.Click
    On Error Resume Next
    'OpenFileDialog1.Filter = "(*.xls)|*.xls|(*.xlsx)|*.xlsx|All files (*.*)|*.*"
    PKGAofdImpOpenExcel.ShowDialog()
    PKGAtxtImpFileAdd.Text = PKGAofdImpOpenExcel.FileName
    connexcel = New OleDbConnection("provider=Microsoft.ace.OLEDB.12.0;data source=" & PKGAtxtImpFileAdd.Text & ";Extended Properties=Excel 8.0;")
    connexcel.Open()


    Dim dtSheets As DataTable = connexcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
    Dim listSheet As New List(Of String)
    Dim drSheet As DataRow

    For Each drSheet In dtSheets.Rows
        listSheet.Add(drSheet("TABLE_NAME").ToString())
    Next

    For Each sheet As String In listSheet
        PKGAtxtImpExlSheetL.Items.Add(sheet)
    Next
End Sub

Private Sub PKGAtxtImpExlSheetL_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PKGAtxtImpExlSheetL.SelectedIndexChanged
    daexcel = New OleDbDataAdapter("select * from [" & PKGAtxtImpExlSheetL.Text & "]", connexcel)
    dsexcel = New DataSet
    daexcel.Fill(dsexcel)
    PKGAdgvImpData.DataSource = dsexcel.Tables(0)
    PKGAdgvImpData.ReadOnly = True
End Sub

' Последний раздел

Sub Connectonsql()
    connsql = New SqlConnection("Data Source=DESKTOP-MIQGJTK\MSSMLBIZ;Initial Catalog=PkGlobalAccounting;Integrated Security=True")
    connsql.Open() 
End Sub

Private Sub PKGAbtnImpSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PKGAbtnImpSave.Click
    For Line As Integer = 0 To PKGAdgvImpData.RowCount - 2
        Call Connectonsql()
        Dim save As String = "insert into Test values('" & PKGAdgvImpData.Rows(Line).Cells(0).Value & "','" & PKGAdgvImpData.Rows(Line).Cells(1).Value & "')"
        cmdsql = New SqlCommand(save, connsql)
        cmdsql.ExecuteNonQuery()
    Next
    MsgBox("Data Saved Successfully")
    PKGAdgvImpData.Columns.Clear()

End Sub

Спасибо за вашу помощь.

0 голосов
/ 22 сентября 2019

Храните объекты базы данных локально, чтобы вы могли быть уверены, что они закрыты и удалены.Включение этих объектов с помощью `Using ... End Использование блоков выполнит это даже в случае ошибки.Вам не нужны переменные для DataAdapters, DataSets или DataReaders.Я предлагаю только одну переменную уровня формы для строки подключения Excel, поскольку она используется в 2 методах.

Немного Linq получит имена извлеченных листов из DataTable и заполнит массив.Затем массив можно передать в поле со списком .AddRange.

. Я бы не использовал событие SelectedIndexChanged, поскольку пользователь может слишком легко щелкнуть по неправильному листу или передумать.Я использовал событие Button.Click, чтобы заполнить сетку.

Строка подключения Sql выглядит странно для меня.Я предлагаю вам проверить это отдельно.Если это не работает, это хороший ресурс.https://www.connectionstrings.com/

Я бы специально указал имена столбцов в операторе Insert.Замените FirstColumnName и SecondColumnName реальными именами столбцов.Имена параметров могут быть любыми, если имена в операторе совпадают с именами в методе Parameters.Add.Я догадался о типах данных и размере.Проверьте правильность значений в вашей базе данных.

Мы добавляем параметры только один раз за пределы цикла, затем меняем только значения внутри цикла.

Private ExcelConString As String

Private Sub BtnImpExcelFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnImpExcelFile.Click
    Dim strFileName As String
    Dim dtSheets As DataTable
    OpenFileDialog1.Filter = "(* .xls) | * .xls | (*. Xlsx) | *. xlsx | All files (*. *) | *. * "
    OpenFileDialog1.ShowDialog()
    strFileName = OpenFileDialog1.FileName
    ExcelConString = "provider = Microsoft.ace.OLEDB.12.0; data source =" & strFileName & "; Extended Properties = Excel 8.0;"
    Using connexcel = New OleDbConnection(ExcelConString)
        connexcel.Open()
        dtSheets = connexcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
    End Using
    Dim exSheets() As Object = (From dRow In dtSheets.AsEnumerable() Select dRow("TABLE_Name")).ToArray
    ExcelSheetList.Items.AddRange(exSheets)
End Sub

Private Sub DisplayData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DisplayData.Click
    Dim dt As New DataTable
    Using cn As New OleDbConnection(ExcelConString)
        'In older versions of Visual Studio you may have to use String.Format instead of the interpolated string.
        Using cmd As New OleDbCommand($"select * from [{ExcelSheetList.Text}];", cn)
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    End Using
    DGVImpData.DataSource = dt
    DGVImpData.ReadOnly = True
End Sub

Private Sub BtnSaveImpData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSaveImpData.Click
    Using cn As New SqlConnection("data source =. \ MSSMLBIZ; initial catalog = MyInvoice; integrated security = true")
        Using cmd As New SqlCommand("Insert Into InvoiceData (FirstColumnName, SecondColumnName) Values ​​(@FirstColumn, @SecondColumn);", cn)
            cmd.Parameters.Add("@FirstColumn", SqlDbType.VarChar, 100)
            cmd.Parameters.Add("@SecondColumn", SqlDbType.VarChar, 100)
            cn.Open()
            For line As Integer = 0 To DGVImpData.RowCount - 2
                cmd.Parameters("@FirstColumn").Value = DGVImpData.Rows(line).Cells(0).Value
                cmd.Parameters("@SecondColumn").Value = DGVImpData.Rows(line).Cells(1).Value
                cmd.ExecuteNonQuery()
            Next
        End Using
    End Using
    MsgBox("data saved successfully")
    DGVImpData.Columns.Clear()
End Sub

Что касается обработки ошибок ... On Error Resume Next isкак правило, не используется в новом коде.У нас есть Try...Catch...Finally блоков.После запуска кода добавьте эти блоки там, где это необходимо.

EDIT

Чтобы использовать String.Format ...

Using cmd As New OleDbCommand(String.Format("select * from [{0}];", ExcelSheetList.Text))

Первый параметрэто строка, в которую вы хотите поместить переменные.Он содержит индексированные заполнители, заключенные в фигурные скобки.Следующие параметры - это переменные, которые вы хотите использовать для замены заполнителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...