Kesalahan MSSQL 'Penyedia yang mendasarinya gagal saat Buka'


220

Saya menggunakan .mdfuntuk menghubungkan ke databasedan entityClient. Sekarang saya ingin mengubah string koneksi sehingga tidak akan ada .mdffile.

Apakah yang berikut ini connectionStringbenar?

<connectionStrings>
   <!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />-->
   <add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Karena saya selalu mendapatkan kesalahan:

Penyedia yang mendasarinya gagal pada Open


2
Saya memiliki masalah yang sama di sini ketika saya mencoba menjalankan di bawah IIS. Jika saya menjalankan di VS Server saya tidak mendapatkan kesalahan.
Zote

11
Saya memiliki masalah yang sama dan dihapus Integrated Securitydari connectionstring, membuat pengguna dan memastikan mereka memiliki sysadminizin dan menambahkan pengguna itu ke connectionstring.
fulvio

di mana DB Anda berada, jika itu pada aplikasi yang di-host di IIS Anda harus menempatkan DB Anda di folder App_Data Anda dan mengedit string koneksi yang dihasilkan oleh model Entityframework untuk mencarinya di sana. stackoverflow.com/questions/9809442/…
eran otzap

Saya punya masalah ini, dan itu diselesaikan dengan memasukkan kata sandi dalam string koneksi.
satyrFrost

Cukup menghapus Keamanan Terpadu bekerja untuk saya ketika berjalan di bawah IIS
Jon

Jawaban:


215

Saya mengalami kesalahan ini dan menemukan beberapa solusi:

Melihat string koneksi Anda, itu terlihat valid. Saya menemukan posting blog ini , masalahnya di sini adalah mereka menggunakan Keamanan Terpadu . Jika Anda menjalankan IIS, pengguna IIS Anda perlu akses ke database.

Jika Anda menggunakan Entity Framework with Transactions , Entity Framework secara otomatis membuka dan menutup koneksi dengan setiap panggilan basis data. Jadi saat menggunakan transaksi, Anda mencoba untuk menyebar transaksi melalui beberapa koneksi. Ini naik ke MSDTC .

( Lihat referensi ini untuk informasi lebih lanjut. )

Mengubah kode saya ke yang berikut ini memperbaikinya:

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}

7
Bagaimana ini dilakukan ketika menggunakan Linq untuk mengakses tabel (menggunakan EF4)?
Brett Rigby

2
@ Brett Rigby: stackoverflow.com/questions/794707/… mencakup cara melakukan ini dengan Linq / EF.
Scott Stafford

63
Jika Anda menggunakan EF / DBContext, maka panggilan yang benar adalah context.Database.Connection.Open ();
live-love

2
Saya berharap saya membaca posting Anda alih-alih membaca kode ketika saya pertama kali menemukannya. Masalah saya (sebagaimana ditunjukkan dalam jawaban ini) adalah bahwa pengguna AppPool untuk konteks Plugin CRM 2011 tidak memiliki akses tulis ke Database yang saya atur. Ketika saya menambahkan pengguna ke SQL, Plugin bekerja seperti pesona.
Mike_Matthews_II

2
Saya tidak memiliki string koneksi di konfigurasi saya dinamai konteks yang saya buat ....... periksa juga.
Bill Blankenship

38

context.Connection.Open() tidak membantu menyelesaikan masalah saya, jadi saya mencoba mengaktifkan "Izinkan Klien Jarak Jauh" di konfigurasi DTC, tidak ada lagi kesalahan.

Di windows 7 Anda dapat membuka konfigurasi DTC dengan menjalankan dcomcnfg, Layanan Komponen -> Komputer -> Komputer Saya -> Koordinator Transaksi Terdistribusi -> Klik kanan ke DTC Lokal -> Keamanan.


11
Di windows 7 Anda dapat membuka konfigurasi DTC dengan menjalankan dcomcnfg , Layanan Komponen -> Komputer -> Komputer Saya -> Koordinator Transaksi Terdistribusi -> Klik kanan ke DTC Lokal -> Keamanan.
kerem

7
Sebenarnya itu Klik kanan ke DTC Lokal -> Properti -> Keamanan
Otto Abnormalverbraucher

27

Anda harus melihat innerException untuk melihat apa penyebab batuk kesalahan.

Dalam kasus saya, kesalahan aslinya adalah:

Tidak dapat membuka file fisik "D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf". Kesalahan sistem operasi 5: "5 (Akses ditolak.)". Upaya untuk melampirkan database yang diberi nama otomatis untuk file D: \ Projects2 \ xCU \ xCU \ App_Data \ xCUData.mdf gagal. Database dengan nama yang sama ada, atau file yang ditentukan tidak dapat dibuka, atau itu terletak di berbagi UNC.

yang diselesaikan dengan memberikan izin penuh kepada pengguna saat ini untuk mengakses file terkait mdfdan ldfmenggunakan properti file.


24

Saya menemukan masalahnya adalah bahwa saya memiliki jalur server dalam string koneksi di salah satu varian ini:

SERVER\SQLEXPRESS
SERVER

Kapan saya seharusnya memiliki:

.\SQLEXPRESS

Untuk beberapa alasan saya mendapatkan kesalahan setiap kali mengalami kesulitan menemukan contoh SQL.


6
Itu mungkin karena Anda tidak memiliki nama pipa yang diaktifkan sebagai metode koneksi untuk SQL Server.
Paul

1
@ Paul, terima kasih. Kemungkinan karena itu adalah instalasi baru SQL, yang diluncurkan dengan pipa bernama dinonaktifkan. Terimakasih atas peringatannya. +1
dooburt

1
Terima kasih untuk ini, saya mengalami masalah ini karena pipa bernama dinonaktifkan.
Patrick Allwood

15

Ini hanya masalah umum. Bahkan saya telah menghadapi masalah ini. Pada mesin pengembangan, yang dikonfigurasi dengan otentikasi Windows, ini berfungsi dengan sempurna:

<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Setelah di-host di IIS dengan konfigurasi yang sama, saya mendapatkan kesalahan ini:

Penyedia yang mendasarinya gagal pada Open

Itu dipecahkan berubah connectionStringdalam file konfigurasi:

<add name="MyEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Kesalahan umum lainnya adalah:

  1. Layanan basis data bisa dihentikan
  2. Atribut Sumber Data menunjuk ke database lokal dengan otentikasi Windows dan di-host di IIS
  3. Nama pengguna dan kata sandi bisa saja salah.

Bagi saya masalahnya adalah ketika saya membuat model data EF itu menciptakan string koneksi yang menggunakan data login dari Koneksi Data di VS. Tidak ada pengguna atau kata sandi dalam string koneksi, jadi hapus Integrated Security=Truedan ganti dengan user id=sa;password=notmyrealpassworduntuk memperbaiki masalah penyebaran ini.
LostNomad311

10

Saat Anda menerima pengecualian ini, pastikan untuk memperluas detail dan melihat detail pengecualian dalam karena itu akan memberikan detail mengapa login gagal. Dalam kasus saya, string koneksi berisi pengguna yang tidak memiliki akses ke database saya.

Terlepas dari apakah Anda menggunakan Keamanan Terpadu (konteks Pengguna Windows yang masuk) atau akun SQL individual, pastikan bahwa pengguna memiliki akses yang tepat di bawah 'Keamanan' untuk database yang Anda coba akses untuk mencegah masalah ini.


Saya memiliki masalah yang sama dengan posting asli, memverifikasi nama host saya, dan memverifikasi dalam pengecualian internal bahwa saya menggunakan nama pengguna yang benar. Keamanan pengguna SSMS terlihat benar - akun SQL Server sudah diatur dengan benar dan memiliki akses publik ke database. Tetapi, gagal masuk.
Kode dengan Hammer

Apa masalah inner exceptionnegara? Itulah jawaban saya di sini, bahwa itu akan memberikan detail tambahan tersembunyi yang diperlukan untuk memahami masalah mendasar yang sebenarnya. Tidak inner exceptionakan memverifikasi bahwa Anda memiliki log masuk yang benar - itu pengecualian bukan klarifikasi.
atconway

Login failed for user 'user'.
Kode dengan Hammer

Saya juga mencoba menambahkan NT AUTHORITY\NETWORK SERVICEke daftar pengguna SQL Server. Saya masih mendapat kegagalan login yang ditolak sama.
Kode dengan Hammer

TERPECAHKAN. Saya perlu untuk mengubah data sourceke hostname\SQLEXPRESS. Saya sudah mencoba hostnamedan .\SQLEXPRESSsebelumnya. Kemudian saya dapat terhubung dengan keamanan terintegrasi. Anehnya, ini kebalikan dari jawaban dooburt . Curiouser, nama pengguna SQL Server tidak pernah dapat terhubung dari Visual Studio.
Kode dengan Hammer


4

Layanan SQL Server Express tidak diatur untuk mulai secara otomatis.

1) Buka panel kontrol 2) Alat Administratif 3) Layanan 4) Set SQL Server express untuk memulai secara otomatis dengan mengkliknya 5) Klik kanan dan mulai layanan

Saya harap itu akan membantu.


3

Ini juga dapat terjadi jika Anda memulihkan database dan pengguna sudah ada dengan skema berbeda, membuat Anda tidak dapat menetapkan izin yang benar.

Untuk memperbaiki proses ini:

USE your_database
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf'
GO
EXEC sp_change_users_login 'update_one', 'user', 'user'
GO

Benar-benar ini masalahnya. Saya baru saja pulih dari cadangan. Mengambil tampilan untuk detail menganalisis.
nesimtunc


2

Pastikan setiap nilai elemen dalam string koneksi yang diberikan sudah benar. Dalam kasus saya, saya mendapatkan kesalahan yang sama karena nama katalog (nama database) yang ditentukan dalam string koneksi salah.


1

Saya memiliki masalah serupa dengan pengecualian karena status koneksi, kemudian saya menyadari bahwa saya memiliki variabel kelas layanan domain saya ditandai sebagai statis (karena kesalahan).

Dugaan saya adalah bahwa begitu perpustakaan layanan dimuat ke dalam memori, setiap panggilan baru berakhir menggunakan nilai variabel statis yang sama (contoh layanan domain), menyebabkan konflik melalui keadaan koneksi.

Saya pikir juga bahwa setiap panggilan klien menghasilkan utas baru, sehingga beberapa utas mengakses instance layanan domain yang sama dengan disamakan dengan bangkai kereta.


Inilah yang melakukannya untuk saya juga. Tampaknya jika Anda menandainya statis, itu hanya menyebabkan segala macam masalah dengan contoh yang sedang berusaha untuk bekerja dengannya.
Michael J. Gray

1

Saya memiliki masalah yang sama tetapi yang berhasil bagi saya adalah menghapus ini dari Connection Connection:

persist security info=True


1

Saya memiliki kesalahan yang sama dengan pengecualian dalam seperti di bawah ini:

operasi tidak berlaku untuk keadaan transaksi

Saya bisa mengatasinya dengan mengaktifkan pengaturan keamanan DTC.

Pergi ke Properti DTC, di bawah Tab Keamanan, periksa di bawah ini

  • Akses DTC Jaringan
  • Izinkan RemoteClients
  • Komunikasi Manajer Transaksi
  • Izinkan Masuk
  • Izinkan Keluar

1

Jika Anda mendapatkan kesalahan ini pada aplikasi web ASP.NET, selain hal-hal lain yang disebutkan periksa berikut ini:

  1. Izin Keamanan Pengguna Basis Data (yang memungkinkan pengguna mengakses basis data Anda).
  2. Periksa kumpulan aplikasi Anda di IIS dan pastikan itu yang benar yang memungkinkan akses ke database Anda.

1

Saya menyingkirkan ini dengan mengatur ulang IIS , tetapi masih menggunakan Integrated Authenticationdalam string koneksi.


1

Mendefinisikan aturan Windows Firewall baru untuk SQL Server (dan untuk port 1433) pada mesin server menyelesaikan kesalahan ini (jika nama server Anda, nama login atau kata sandi pengguna tidak salah dalam string koneksi Anda ...).


0

Kesalahan umum yang saya lakukan karena saya memindahkan aplikasi dari satu pc ke pc lain dan tidak ada yang bekerja di atas adalah bahwa saya lupa menyalin string koneksi ke App.Config dan Web.Config!


0

Saya memiliki masalah yang sama: Dalam eksekusi kasus pengujian saya, saya selalu mendapatkan kesalahan ini. Saya menemukan, bahwa "Layanan Transaksi Terdistribusi" saya tidak dimulai (jalankan: services.msc -> mulai "Layanan Transaksi Terdistribusi" (terbaik untuk mengaturnya untuk memulai otomatis)). Setelah saya melakukan itu, itu berfungsi seperti pesona ...


0

Saya menyalin file database (.mdf / .ldf) ke folder App_Data untuk menyingkirkan pengecualian ini.


0

Saya juga menghadapi masalah yang sama. Sekarang saya telah melakukannya dengan menghapus nama pengguna dan kata sandi dari string koneksi.


0

Bagi saya itu hanya kesalahan sederhana:

Saya menggunakan Amazon EC2 , dan saya menggunakan alamat IP elastis saya di string koneksi, tetapi ketika saya mengubah alamat IP saya lupa memperbarui string koneksi saya.


0

Saya mendapatkan kesalahan ini tiba-tiba terjadi secara tiba-tiba di salah satu situs kami. Dalam kasus saya, ternyata kata sandi pengguna SQL telah kedaluwarsa! Melepas kotak kedaluwarsa kata sandi di SQL Server Management Studio berhasil!



0

Di IIS mengatur App Pool Identity Sebagai pengguna Akun Layanan atau Administrator Account atau akun semut yang memiliki izin untuk melakukan operasi pada DataBase itu.


0

Dalam kasus saya, saya memiliki ketidakcocokan antara nama string koneksi yang saya daftarkan di konstruktor konteks vs nama di web.config saya. Kesalahan sederhana yang disebabkan oleh salin dan tempel: D

    public DataContext()
        : base(nameOrConnectionString: "ConnStringName")
    {
        Database.SetInitializer<DataContext>(null);
    }


0

saya memiliki kesalahan yang sama dengan yang saya temukan ketika saya mengubah koneksi sayaString ke Sumber Data baru saya lupa mengubah Username dan passowrd untuk database baru


0

Saya juga memiliki kesalahan ini terjadi jika nama SQL Server Instance tidak ditentukan dan host SQL memiliki beberapa contoh SQL diinstal. Berikut beberapa contoh untuk diklarifikasi:

String koneksi di bawah ini menghasilkan pengecualian "Penyedia yang mendasari gagal pada Buka" tanpa pengecualian dalam aplikasi .NET WebForms:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

String koneksi berikut dijalankan seperti yang diharapkan dalam aplikasi .net WebForms di mana lingkungan SQL memiliki beberapa instance. Rare saya tahu, tapi saya punya beberapa contoh SQL yang berbeda di kotak dev saya untuk mengakomodasi proyek yang berbeda:

 connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient"

0

dalam kasus saya alamat server telah diubah oleh admin server jadi saya harus mengubah string koneksi ke alamat server baru


0

Saya punya masalah ini karena Application Pool login yang dijalankan oleh aplikasi ini telah berubah.

Dalam IIS:

  • Temukan kumpulan Aplikasi dengan mengklik situs Anda dan pergi ke Pengaturan Dasar.

  • Pergi ke Kolam Aplikasi.

  • Klik pada kumpulan aplikasi situs Anda.

  • Klik Pengaturan Lanjut.

  • Di Identity, masukkan login dan kata sandi akun.

  • Mulai ulang situs Anda dan coba lagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.