Установленное соединение было прервано программным обеспечением на вашем хост-компьютере.
Всем привет,
Я столкнулся с проблемой с сервером 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.)