amr aly Ответов: 1

Установленное соединение было прервано программным обеспечением на вашем хост-компьютере.


Всем привет,
Я столкнулся с проблемой с сервером SQL2012 после переноса на него базы данных access 2013,
сохранение или обновление базы данных sql выполняется в обычном режиме но после нажатия кнопки Сохранить появляется это сообщение об ошибке '
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine.)
'
Это мой код.
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
        Using con As New SqlConnection(cs)
            con.Open()
            Using cmd As New SqlCommand("update Product set AVNo=@a  
                                           where ProductCode=@b", con)
                cmd.Parameters.Add("@a", SqlDbType.Bit).Value = CheckBox1.Checked
                cmd.Parameters.Add("@b", SqlDbType.Int).Value = Val(txtProductCode.Text)

                'If con.State = ConnectionState.Open Then
                '    con.Close()
                'End If
                'con.Open()
                'cmd.ExecuteNonQuery()
                'con.Close()
            End Using
        End Using
    End Sub

Это происходит на моей локальной машине .
А это моя строка подключения
 Public cs As String = "Data Source=KMA18214\SQLEXPRESS,1433;Network Library=DBMSSOCN;Initial Catalog=Stock;" &
"Persist Security Info=True;User ID=amr;Password=****;Trusted_Connection=True;"


И эта ошибка произошла после сохранения, а затем обновления(то есть процесс сохранения выполнен без ошибок и после нажатия кнопки обновления произошла ошибка)
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)

Это код кнопки обновления

Private Sub Update_Record_Click(sender As Object, e As EventArgs) Handles Update_Record.Click

       If txtProductCode.Text = GenerateID("Product", "ProductCode") Then
           MessageBox.Show("يجب حفظ الصنف اولا", "Product Details", MessageBoxButtons.OK, MessageBoxIcon.Information)
           Exit Sub
       End If
       If Len(Trim(ComboBox1.Text)) <> 0 Then
           MessageBox.Show("استخدم زرار نقل من باكية لاخرى", "Product Details", MessageBoxButtons.OK, MessageBoxIcon.Information)
           Button5.Focus()
           Exit Sub
       End If
       If Len(Trim(cmbCategory.Text)) = 0 Then
           MessageBox.Show("ادخل اسم الباكية", "Product Details", MessageBoxButtons.OK, MessageBoxIcon.Information)
           Exit Sub
       End If

       ' for enforce user to use category screen
       conn = New SqlConnection(cs)
       conn.Open()
       Dim n As String = "select CategoryName from InventoryCategory where CategoryName='" & cmbCategory.Text & "' "
       cmd = New SqlCommand(n)
       cmd.Connection = conn
       Dim datatable1 As New DataTable
       Dim datadap As New SqlDataAdapter(cmd)
       datadap.Fill(datatable1)

       If datatable1.Rows.Count = 0 Then
           MessageBox.Show(" يجب تعريف باكية جديدة اذهب لشاشة تعريف باكية", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
           cmbCategory.Text = ""
           cmbCategory.Focus()

           conn.Close()
           Exit Sub
       End If

       conn = New SqlConnection(cs)
       conn.Open()


       Dim cb As String = "update Product set
                           ProductName=@d1,
                           Price=@d2,
                           SellPrice=@d3,
                           DamNo=@d4,
                           AVNo=@d5,
                           SumStockNo=@d11
                           where Productcode =@d6"

       cmd = New SqlCommand(cb)
       With cmd.Parameters
           .Add("@d1", SqlDbType.VarChar).Value = txtProductName.Text
           .Add("@d2", SqlDbType.Int).Value = Val(txtPrice.Text)
           .Add("@d3", SqlDbType.Int).Value = Val(txtSellPrice.Text)
           .Add("@d4", SqlDbType.Int).Value = Val(txtDamage.Text)
           .Add("@d5", SqlDbType.Bit).Value = CheckBox1.Checked
           .Add("@d11", SqlDbType.Int).Value = Val(TextBox4.Text)
           .Add("@d6", SqlDbType.Int).Value = Val(txtProductCode.Text)
       End With

       cmd.Connection = conn


       If conn.State = ConnectionState.Open Then
           conn.Close()
       End If

       conn.Open()
       cmd.ExecuteNonQuery()
       conn.Close()

       '''''''''''''''''

       conn = New SqlConnection(cs)
       conn.Open()

       Dim cb2 As String = "insert into ProLog(ProductCode,ProductName,Category,Price,SellPrice,StockNo,EntryDate,NewStockNo,UpdatedDate)
                            VALUES(@d1,@d2,@d3,@d4,@d5,@d6,@d7,@d8,@d9)"

       cmd = New SqlCommand(cb2)

       cmd.Connection = conn

       cmd.Parameters.Add(New SqlParameter("@d1", SqlDbType.Int, 20, "ProductCode"))
       cmd.Parameters.Add(New SqlParameter("@d2", SqlDbType.VarChar, 150, "ProductName"))
       cmd.Parameters.Add(New SqlParameter("@d3", SqlDbType.VarChar, 150, "Category"))
       cmd.Parameters.Add(New SqlParameter("@d4", SqlDbType.Float, 20, "Price"))
       cmd.Parameters.Add(New SqlParameter("@d5", SqlDbType.Float, 20, "SellPrice"))
       cmd.Parameters.Add(New SqlParameter("@d6", SqlDbType.Int, 20, "StockNo"))
       cmd.Parameters.Add(New SqlParameter("@d7", SqlDbType.Date, 20, "EntryDate"))
       cmd.Parameters.Add(New SqlParameter("@d8", SqlDbType.Int, 20, "NewStockNo"))
       cmd.Parameters.Add(New SqlParameter("@d9", SqlDbType.Date, 50, "UpdatedDate"))


       cmd.Parameters("@d1").Value = Val(txtProductCode.Text)
       cmd.Parameters("@d2").Value = txtProductName.Text
       cmd.Parameters("@d3").Value = cmbCategory.Text
       cmd.Parameters("@d4").Value = CDbl(Val(txtPrice.Text))
       cmd.Parameters("@d5").Value = CDbl(Val(txtSellPrice.Text))
       cmd.Parameters("@d6").Value = Val(txtStockNo.Text)
       cmd.Parameters("@d7").Value = DateTimePicker1.Value
       cmd.Parameters("@d8").Value = Val(txtNewStockUpdate.Text)
       cmd.Parameters("@d9").Value = ToolStripStatusLabel4.Text

       cmd.ExecuteReader()

       If conn.State = ConnectionState.Open Then
           conn.Close()
       End If

       conn.Close()
       '''''''''

       If txtStockID.Text = GenerateID("Stock", "StockID") Then
           Dim ct As String = "select ProductCode,Category from Stock where ProductCode=@find and Category=@find1"
           Using conn = New SqlConnection(cs)
               conn.Open()
               Using cmd As New SqlCommand(ct)
                   cmd.Connection = conn
                   cmd.Parameters.Add(New SqlParameter("@find", SqlDbType.Int, 20, "ProductCode"))
                   cmd.Parameters.Add(New SqlParameter("@find1", SqlDbType.VarChar, 100, "Category"))
                   cmd.Parameters("@find").Value = Val(txtProductCode.Text)
                   cmd.Parameters("@find1").Value = cmbCategory.Text
                   rdr = cmd.ExecuteReader()

                   If rdr.Read Then
                       MessageBox.Show("المنتج موجود بهذه الباكية قم بتعديله", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

                       If Not rdr Is Nothing Then

                           rdr.Close()
                       End If
                       Exit Sub
                   Else

                       Dim con1 = New SqlConnection(cs)
                       con1.Open()

                       Dim cb3 As String = "insert into Stock(StockID,ProductCode,ProductName,Price,SellPrice,Category,StockDate,StockNo,User_Name)VALUES (@d1,@d2,@d3,@d4,@d5,@d6,@d7,@d8,@d9)"

                       Dim cmd11 As New SqlCommand(cb3)

                       cmd11.Connection = con1

                       cmd11.Parameters.Add(New SqlParameter("@d1", SqlDbType.Int, 20, "StockID"))
                       cmd11.Parameters.Add(New SqlParameter("@d2", SqlDbType.Int, 20, "ProductCode"))
                       cmd11.Parameters.Add(New SqlParameter("@d3", SqlDbType.VarChar, 150, "ProductName"))
                       cmd11.Parameters.Add(New SqlParameter("@d4", SqlDbType.Float, 20, "Price"))
                       cmd11.Parameters.Add(New SqlParameter("@d5", SqlDbType.Float, 20, "SellPrice"))
                       cmd11.Parameters.Add(New SqlParameter("@d6", SqlDbType.VarChar, 150, "Category"))
                       cmd11.Parameters.Add(New SqlParameter("@d7", SqlDbType.Float, 20, "StockDate"))
                       cmd11.Parameters.Add(New SqlParameter("@d8", SqlDbType.Int, 20, "StockNo"))
                       cmd11.Parameters.Add(New SqlParameter("@d9", SqlDbType.VarChar, 20, "User_Name"))


                       cmd11.Parameters("@d1").Value = Val(txtStockID.Text)
                       cmd11.Parameters("@d2").Value = Val(txtProductCode.Text)
                       cmd11.Parameters("@d3").Value = txtProductName.Text
                       cmd11.Parameters("@d4").Value = CDbl(Val(txtPrice.Text))
                       cmd11.Parameters("@d5").Value = CDbl(Val(txtSellPrice.Text))
                       cmd11.Parameters("@d6").Value = cmbCategory.Text
                       cmd11.Parameters("@d7").Value = DateTimePicker1.Value
                       cmd11.Parameters("@d8").Value = Val(txtStockNo.Text)
                       cmd11.Parameters("@d9").Value = ToolStripStatusLabel2.Text

                       MessageBox.Show("تم التعديل بنجاح و اضافة باكية جديدة للصنف", "عملية التعديل", MessageBoxButtons.OK, MessageBoxIcon.Information)

                       If con1.State = ConnectionState.Open Then
                           con1.Close()
                       End If

                       con1.Open()
                       cmd11.ExecuteNonQuery()
                       con1.Close()
                       Exit Sub
                   End If
               End Using
           End Using

       End If

       Dim con = New SqlConnection(cs)
       con.Open()

       Dim cb1 As String = "update Stock set ProductName=@d3,Price=@d4,SellPrice=@d5,Category=@d6,
                           StockDate=@d7,StockNo=@d8,User_Name=@d9
                           where StockID=@d1"

       Dim cmd1 As New SqlCommand(cb1)

       cmd1.Connection = con

       cmd1.Parameters.Add(New SqlParameter("@d3", SqlDbType.VarChar, 150, "ProductName"))
       cmd1.Parameters.Add(New SqlParameter("@d4", SqlDbType.Float, 20, "Price"))
       cmd1.Parameters.Add(New SqlParameter("@d5", SqlDbType.Float, 20, "SellPrice"))
       cmd1.Parameters.Add(New SqlParameter("@d6", SqlDbType.VarChar, 150, "Category"))
       cmd1.Parameters.Add(New SqlParameter("@d7", SqlDbType.Date, 20, "StockDate"))
       cmd1.Parameters.Add(New SqlParameter("@d8", SqlDbType.Int, 20, "StockNo"))
       cmd1.Parameters.Add(New SqlParameter("@d9", SqlDbType.VarChar, 50, "User_Name"))
       cmd1.Parameters.Add(New SqlParameter("@d1", SqlDbType.Int, 20, "StockID"))


       cmd1.Parameters("@d3").Value = txtProductName.Text
       cmd1.Parameters("@d4").Value = CDbl(Val(txtPrice.Text))
       cmd1.Parameters("@d5").Value = CDbl(Val(txtSellPrice.Text))
       cmd1.Parameters("@d6").Value = cmbCategory.Text
       cmd1.Parameters("@d7").Value = DateTimePicker1.Value
       cmd1.Parameters("@d8").Value = Val(txtStockNo.Text)
       cmd1.Parameters("@d9").Value = ToolStripStatusLabel2.Text
       cmd1.Parameters("@d1").Value = Val(txtStockID.Text)


       cmd1.ExecuteReader()


       MessageBox.Show("تم التعديل بنجاح", "عملية التعديل", MessageBoxButtons.OK, MessageBoxIcon.Information)
       Save.Enabled = False
       Update_Record.Enabled = True
       Delete.Enabled = True
       DataGridView1.DataSource = Nothing
       autocomplete()

       txtSumTotal.Text = ""
       TextBox1.Text = ""
       txtStockNo.Text = ""
       TextBox4.Text = ""
       cmbCategory.Text = ""
       ComboBox1.Text = ""
       TextBox2.Text = ""
       txtStockID.Text = GenerateID("Stock", "StockID")

       If con.State = ConnectionState.Open Then
           con.Close()
       End If
       con.Close()


       ''''''''''''''
       fillCategory()
       fillProduct()


   End Sub


Я намеревался снова создать таблицы вместо миграции и расследования, но я сказал, что спросил после того, как выполню это
Заранее спасибо........................

Что я уже пробовал:

Я попытался перезапустить службы sql и проверить TCP/IP в диспетчере конфигурации sql узел IP2, который является моим IP-адресом, существует, а порт TCp-1433

CHill60

Попробуйте удалить его ;Trusted_Connection=True; в строке подключения, Если вы используете имя пользователя + пароль, или удалить User ID=amr;Password=****; если вы используете доверенное соединение

amr aly

Спасибо за быстрое воспроизведение ...
Я попробовал ваше предложение, но та же ошибка после обновления

Richard Deeming

Попробуйте удалить порт и сетевую библиотеку из строки подключения:

Public cs As String = "Data Source=KMA18214\SQLEXPRESS;Initial Catalog=Stock;Trusted_Connection=True;"

https://www.connectionstrings.com/sql-server/[^]

Кроме того, поскольку вы используете SQL Express, убедитесь, что он настроен на прием удаленных подключений:
Удаленное подключение к SQL Express // Джош Райт[^]

amr aly

Хорошо, я сделал то, что вы предложили, моя строка подключения стала следующей

Public cs As String = "Data Source=KMA18214\SQLEXPRESS;Initial Catalog=Stock;Trusted_Connection=True;" &
"Persist Security Info=True;User ID=amr;Password=****;"


Но произошла новая ошибка
The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following:  the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
в этом тексте изменено

 Private Sub cmbCategory_TextChanged(sender As Object, e As EventArgs) Handles cmbCategory.TextChanged
        Dim cat As String = "select ProductCode,Category from ProductSold where ProductCode=@find and Category=@find1"
        Using conn As New SqlConnection(cs)
            conn.Open()
            Using cmd As New SqlCommand(cat)
                cmd.Connection = conn
                cmd.Parameters.Add(New SqlParameter("@find", SqlDbType.Int, 20, "ProductCode"))
                cmd.Parameters.Add(New SqlParameter("@find1", SqlDbType.VarChar, 100, "Category"))
                cmd.Parameters("@find").Value = Val(txtProductCode.Text)
                cmd.Parameters("@find1").Value = cmbCategory.Text
                rdr = cmd.ExecuteReader()

                If rdr.Read Then
                    'MessageBox.Show("الباكية تم التعامل عليها و لا يمكن تعديلها", "تعديل خاطئ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    cmbCategory.Enabled = False
                    If Not rdr Is Nothing Then
                        rdr.Close()
                    End If

                    Exit Sub
                Else

                    cmbCategory.Enabled = True
                End If
            End Using
        End Using
    End Sub 

Richard Deeming

Вы настроили SQL Express так, чтобы разрешить удаленные соединения по протоколу TCP/IP?

Настройка SQL Server 2016 Express в локальной сети для строки подключения C# [^]

amr aly

Конечно, да, я настраиваю его в своем брандмауэре

Richard Deeming

Вам также нужно настроить SQL Express, а не только брандмауэр.

amr aly

Я настроил его на сервере SQL EXPRESS ...
Я видел этот веб-сайт и многое другое раньше, чтобы знать, как настроить SQL server
Спасибо......

Dave Kreskowiak

Ты сделал это снова. Вы используете как TrustedConnection, так и имя пользователя/пароль. Вы можете использовать только один из них.

Доверенное соединение означает, что вы не указываете имя пользователя и пароль в строке подключения, но поскольку вам все равно нужно войти в SQL Server, соединение будет использовать учетную запись Windows пользователя, который запускает приложение, для проверки подлинности на сервере. Имя пользователя и пароль не требуются.

Если вы укажете имя пользователя и пароль в строке подключения, вы автоматически попросите соединение не использовать TrustedConnection. Имя пользователя и пароль должны существовать в разделе Безопасность/логины SQL Server, а также соответствующие разрешения, назначенные этим учетным записям для каждой базы данных и объекта, к которым вы хотите получить доступ.

amr aly

Хорошо, моя строка подключения стала

"Data Source=KMA18214\SQLEXPRESS;Initial Catalog=Stock;" &                  "User ID=amr;Password=****;"

и произошла еще одна ошибка
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)

Dave Kreskowiak

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

Если вы пытаетесь подключиться к SQL Server через TCP/IP (сеть), то вам необходимо настроить SQL Server для прослушивания в сети. Вы прошли через то, что изложено в этой статье: Удаленное подключение к SQL Express // Джош Райт[^]

amr aly

Да SQL server и vs 2105 на одной машине я отлаживаю приложение для того чтобы построить его на клиентском ПК но сценарий на стороне клиента таков
Один сервер для SQL server 2012 и два компьютера имеют мое приложение и подключаются к SQL server .... Кстати, я уже прочитал статью "удаленное подключение к SQL Express // Josh Wright"

Dave Kreskowiak

Хорошо, теперь вы должны убедиться, что пользователь существует в безопасности SQL Server и имеет соответствующие разрешения на доступ к базе данных.

amr aly

В узле безопасности под базой данных в свойствах входа amr есть роли сервера (public и sysadmin) и отображение пользователя (на фондовой базе данных) есть (db_owner и public)
А на самой фондовой базе данных в узле безопасности я добавил пользователя и разрешение is - in membership (db_owner)

Dave Kreskowiak

Существует ли пользователь в узле Security, Logins непосредственно под сервером? Я пока не смотрю на базу данных, и ваша связь тоже. В этот момент он пытается проникнуть на сам сервер. После того, как он подключен, то он может перейти к подключению к базе данных.

amr aly

Конечно ,да, я попробовал другое приложение с другой базой данных, и оно хорошо работает на той же машине и том же сервере SQL 2012 ..... И я создал новую базу данных с новыми таблицами(с другим именем), и последняя ошибка все еще сохраняется

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)

1 Ответов

Рейтинг:
7

amr aly

Наконец я исправил эту проблему , во-первых, я хочу передать свои теплые пожелания всем, кто участвует в этой теме, чтобы помочь мне найти решение специально

Dave Kreskowiak
... Большое спасибо
И я хочу поделиться тем, как моя проблема была исправлена, чтобы помочь любому, у кого есть эта проблема
Я иду в журнал SQL в этом проходе
C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Log
а посмотрев в конец файла и обнаружив что это строка
Could not connect because the maximum number of '5' user connections has already been reached. The system administrator can use sp_configure to increase the maximum value. The connection has been closed. [CLIENT: <local machine>]
затем я перехожу по этой ссылке
Ошибка при подключении к SQL Server – “не удалось подключиться, так как максимальное количество пользовательских подключений ‘1’ уже достигнуто”. – SQL BI / технологии доступа к данным[^] тогда моя проблема решена .....
Большое спасибо ребята