Lỗi MSSQL 'Nhà cung cấp cơ sở không thành công khi mở'


220

Tôi đã sử dụng một .mdfđể kết nối với một databaseentityClient. Bây giờ tôi muốn thay đổi chuỗi kết nối để không có .mdftập tin.

Điều sau đây có connectionStringđúng không?

<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" />

Bởi vì tôi luôn nhận được lỗi:

Nhà cung cấp cơ bản không thành công trên Open


2
Tôi có vấn đề tương tự ở đây khi tôi cố gắng chạy trong IIS. Nếu tôi chạy trong VS Server, tôi không gặp lỗi.
Zote

11
Tôi đã có cùng một vấn đề và loại bỏ Integrated Securitykhỏi chuỗi kết nối, tạo một người dùng và đảm bảo rằng họ có sysadminquyền và thêm người dùng đó vào chuỗi kết nối.
Fulvio

DB của bạn nằm ở đâu, nếu trên ứng dụng được lưu trữ trên IIS, bạn nên đặt DB của mình vào thư mục App_Data và chỉnh sửa chuỗi kết nối được tạo bởi mô hình Entityframework để tìm nó ở đó. stackoverflow.com/questions/9809442/ từ
eran otzap 22/03/2016

Tôi đã có vấn đề này, và nó đã được giải quyết bằng cách chèn mật khẩu vào chuỗi kết nối.
satyrFrost

Đơn giản chỉ cần loại bỏ Bảo mật tích hợp hoạt động với tôi khi chạy trong IIS
Jon

Câu trả lời:


215

Tôi đã có lỗi này và tìm thấy một vài giải pháp:

Nhìn vào chuỗi kết nối của bạn, nó có vẻ hợp lệ. Tôi tìm thấy bài đăng trên blog này , vấn đề ở đây là họ đã sử dụng Bảo mật tích hợp . Nếu bạn đang chạy trên IIS, người dùng IIS của bạn cần truy cập vào cơ sở dữ liệu.

Nếu bạn đang sử dụng Entity Framework với Giao dịch , Entity Framework sẽ tự động mở và đóng kết nối với mỗi cuộc gọi cơ sở dữ liệu. Vì vậy, khi sử dụng giao dịch, bạn đang cố gắng trải đều một giao dịch qua nhiều kết nối. Điều này nâng lên MSDTC .

( Xem tài liệu tham khảo này để biết thêm thông tin. )

Thay đổi mã của tôi thành sau đây đã sửa nó:

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

7
Làm thế nào được thực hiện khi sử dụng Linq để truy cập các bảng (sử dụng EF4)?
Brett Rigby

2
@Brett Rigby: stackoverflow.com/questions/794707/ trên bao gồm cách thực hiện điều này với Linq / EF.
Scott Stafford

63
Nếu bạn đang sử dụng EF / DBContext, thì cuộc gọi chính xác là bối cảnh.Database.Connection.Open ();
sống tình yêu

2
Tôi ước tôi đã đọc bài viết của bạn thay vì đọc lướt qua nó để tìm mã khi tôi tìm thấy nó lần đầu tiên. Vấn đề của tôi (như được chỉ ra trong câu trả lời này) là người dùng AppPool cho bối cảnh Plugin CRM 2011 không có quyền truy cập ghi vào Cơ sở dữ liệu mà tôi đã thiết lập. Khi tôi thêm người dùng vào SQL, Plugin hoạt động như một bùa mê.
Mike_Matthews_II

2
Tôi không có chuỗi kết nối trong cấu hình của mình được đặt tên theo bối cảnh tôi đang tạo ....... cũng kiểm tra xem.
Bill Blankenship

38

context.Connection.Open() không giúp giải quyết vấn đề của tôi nên tôi đã thử bật "Cho phép khách hàng từ xa" trong cấu hình DTC, không còn lỗi nữa.

Trong windows 7, bạn có thể mở cấu hình DTC bằng cách chạy dcomcnfg, Dịch vụ thành phần -> Máy tính -> Máy tính của tôi -> Điều phối viên giao dịch phân tán -> Nhấp chuột phải vào Local DTC -> Bảo mật.


11
Trong windows 7, bạn có thể mở cấu hình DTC bằng cách chạy dcomcnfg , Dịch vụ thành phần -> Máy tính -> Máy tính của tôi -> Điều phối viên giao dịch phân tán -> Nhấp chuột phải vào Local DTC -> Bảo mật.
kerem

7
Trên thực tế, nhấp chuột phải vào DTC cục bộ -> Thuộc tính -> Bảo mật
Otto

27

Bạn nên xem InternalException để xem nguyên nhân bên trong của việc ném lỗi là gì.

Trong trường hợp của tôi, lỗi ban đầu là:

Không thể mở tệp vật lý "D: \ Project2 \ xCU \ xCU \ App_Data \ xCUData_log.ldf". Lỗi hệ điều hành 5: "5 (Truy cập bị từ chối.)". Cố gắng đính kèm cơ sở dữ liệu có tên tự động cho tệp D: \ Project2 \ xCU \ xCU \ App_Data \ xCUData.mdf không thành công. Cơ sở dữ liệu có cùng tên tồn tại hoặc tệp được chỉ định không thể được mở hoặc được đặt trên chia sẻ UNC.

đã giải quyết bằng cách cấp quyền đầy đủ cho người dùng hiện tại để truy cập các tệp mdfldftệp có liên quan bằng các thuộc tính của tệp.


24

Tôi thấy vấn đề là tôi có đường dẫn máy chủ trong chuỗi kết nối ở một trong các biến thể sau:

SERVER\SQLEXPRESS
SERVER

Khi thực sự tôi nên có:

.\SQLEXPRESS

Vì một số lý do, tôi gặp lỗi bất cứ khi nào nó gặp khó khăn trong việc định vị thể hiện của SQL.


6
Đó có thể là do bạn không đặt tên đường ống được kích hoạt làm phương thức kết nối cho SQL Server.
Paul

1
@Paul, cảm ơn. Có vẻ như đó là một bản cài đặt mới của SQL, được triển khai với các ống có tên bị vô hiệu hóa. Cảm ơn cho những người đứng đầu lên. +1
dooburt

1
Cảm ơn vì điều này, tôi đã gặp vấn đề này do các đường ống được đặt tên bị vô hiệu hóa.
Patrick Allwood

15

Đây chỉ là vấn đề phổ biến. Ngay cả tôi đã phải đối mặt với vấn đề này. Trên máy phát triển, được cấu hình với xác thực Windows, nó hoạt động hoàn hảo:

<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" />

Khi được lưu trữ trong IIS với cùng cấu hình, tôi đã gặp lỗi này:

Nhà cung cấp cơ bản không thành công trên Open

Nó đã được giải quyết thay đổi connectionStringtrong tập tin cấu hình:

<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" />

Các lỗi phổ biến khác có thể là:

  1. Dịch vụ cơ sở dữ liệu có thể bị dừng
  2. Thuộc tính nguồn dữ liệu trỏ đến cơ sở dữ liệu cục bộ với xác thực Windows và được lưu trữ trong IIS
  3. Tên người dùng và mật khẩu có thể sai.

Đối với tôi, vấn đề là khi tôi tạo mô hình dữ liệu EF, nó đã tạo ra một chuỗi kết nối sử dụng dữ liệu đăng nhập từ Kết nối dữ liệu trong VS. Không có người dùng hoặc mật khẩu nào trong chuỗi kết nối, vì vậy, hãy xóa Integrated Security=Truevà thay thế nó user id=sa;password=notmyrealpasswordđể khắc phục sự cố triển khai này.
LostNomad311

10

Khi bạn nhận được ngoại lệ này, hãy đảm bảo mở rộng chi tiết và xem chi tiết ngoại lệ bên trong vì nó sẽ cung cấp chi tiết về lý do đăng nhập thất bại. Trong trường hợp của tôi, chuỗi kết nối chứa một người dùng không có quyền truy cập vào cơ sở dữ liệu của tôi.

Bất kể bạn sử dụng Bảo mật tích hợp (ngữ cảnh của Người dùng Windows đã đăng nhập) hay tài khoản SQL riêng lẻ, hãy đảm bảo rằng người dùng có quyền truy cập phù hợp trong 'Bảo mật' cho cơ sở dữ liệu bạn đang cố truy cập để ngăn chặn sự cố này.


Tôi đã gặp vấn đề tương tự như bài đăng gốc, đã xác minh tên máy chủ của tôi và xác minh trong trường hợp ngoại lệ bên trong rằng tôi đang sử dụng tên người dùng chính xác. Bảo mật người dùng SSMS có vẻ chính xác - tài khoản SQL Server được thiết lập đúng và có quyền truy cập công khai vào cơ sở dữ liệu. Nhưng, đăng nhập thất bại.
Mã với Búa

Không những gì inner exceptionnhà nước là vấn đề? Đó là câu trả lời của tôi ở đây, rằng nó sẽ cung cấp chi tiết bổ sung ẩn cần thiết để hiểu vấn đề thực sự tiềm ẩn. Các inner exceptionsẽ không xác minh rằng bạn có đăng nhập đúng - đó là một ngoại lệ không phải là một làm rõ.
atconway

Login failed for user 'user'.
Mã với Búa

Tôi cũng đã thử thêm NT AUTHORITY\NETWORK SERVICEvào danh sách người dùng SQL Server. Tôi vẫn nhận được cùng một thất bại đăng nhập bị từ chối.
Mã với Búa

GIẢI QUYẾT. Tôi cần phải thay đổi data sourceđể hostname\SQLEXPRESS. Tôi đã thử hostname.\SQLEXPRESStrước đây. Sau đó, tôi đã có thể kết nối với bảo mật tích hợp. Thật kỳ lạ, điều này trái ngược với câu trả lời của dooburt . Tò mò hơn, tên người dùng SQL Server không bao giờ có thể kết nối từ Visual Studio.
Mã với Búa


4

Dịch vụ SQL Server Express không được đặt tự động để bắt đầu.

1) Chuyển đến bảng điều khiển 2) Công cụ quản trị 3) Dịch vụ 4) Đặt SQL Server express để tự động bắt đầu bằng cách nhấp vào nó 5) Nhấp chuột phải và bắt đầu dịch vụ

Tôi hy vọng điều đó sẽ giúp.


3

Điều này cũng có thể xảy ra nếu bạn khôi phục cơ sở dữ liệu và người dùng đã tồn tại với các lược đồ khác nhau, khiến bạn không thể gán quyền chính xác.

Để sửa lỗi này:

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

Hoàn toàn đây là vấn đề. Tôi vừa khôi phục từ một bản sao lưu. Hãy xem để phân tích chi tiết.
nesimtunc


2

Đảm bảo rằng mỗi giá trị phần tử trong chuỗi kết nối được cung cấp là chính xác. Trong trường hợp của tôi, tôi đã gặp lỗi tương tự vì tên của danh mục (tên cơ sở dữ liệu) được chỉ định trong chuỗi kết nối không chính xác.


1

Tôi gặp vấn đề tương tự với các ngoại lệ do trạng thái kết nối, sau đó tôi nhận ra mình có biến lớp dịch vụ miền được đánh dấu là tĩnh (do nhầm lẫn).

Tôi đoán là một khi thư viện dịch vụ được tải vào bộ nhớ, mỗi cuộc gọi mới kết thúc bằng cùng một giá trị biến tĩnh (ví dụ dịch vụ miền), gây ra xung đột thông qua trạng thái kết nối.

Tôi cũng nghĩ rằng mỗi cuộc gọi của khách hàng dẫn đến một luồng mới, vì vậy nhiều luồng truy cập vào cùng một thể hiện dịch vụ miền tương đương với một xác tàu.


Đây là những gì đã làm cho tôi quá. Có vẻ như nếu bạn đánh dấu nó tĩnh, nó chỉ gây ra tất cả các loại vấn đề với trường hợp nó đang cố gắng xử lý.
Michael J. Gray

1

Tôi có cùng một vấn đề nhưng điều làm việc cho tôi là loại bỏ điều này khỏi Chuỗi kết nối:

persist security info=True


1

Tôi đã có một lỗi tương tự với ngoại lệ bên trong như dưới đây:

hoạt động không hợp lệ cho trạng thái của giao dịch

Tôi có thể giải quyết nó bằng cách kích hoạt cài đặt bảo mật DTC.

Chuyển đến Thuộc tính của DTC, trong Tab Bảo mật, kiểm tra bên dưới

  • Truy cập mạng DTC
  • Cho phép RemoteCl Client
  • Quản lý giao dịch Truyền thông
  • Cho phép gửi đến
  • Cho phép đi nước ngoài

1

Nếu bạn gặp phải lỗi này trên ứng dụng web ASP.NET, ngoài những điều khác được đề cập, hãy kiểm tra như sau:

  1. Cơ sở dữ liệu bảo mật người dùng (mà người dùng được phép truy cập vào cơ sở dữ liệu của bạn.
  2. Kiểm tra nhóm ứng dụng của bạn trong IIS và đảm bảo rằng đó là nhóm chính xác được phép truy cập vào cơ sở dữ liệu của bạn.

1

Tôi đã loại bỏ điều này bằng cách đặt lại IIS , nhưng vẫn sử dụng Integrated Authenticationtrong chuỗi kết nối.


1

Xác định quy tắc Tường lửa Windows mới cho SQL Server (và cho cổng 1433) trên máy chủ sẽ khắc phục lỗi này (nếu tên máy chủ, tên đăng nhập hoặc mật khẩu của người dùng không bị sai trong chuỗi kết nối của bạn ...).


0

Một lỗi phổ biến mà tôi đã làm vì tôi đã chuyển ứng dụng từ máy tính này sang máy tính khác và không có lỗi nào ở trên là tôi quên sao chép chuỗi kết nối sang cả App.Config và Web.Config!


0

Tôi đã có một vấn đề tương tự: Trong các trường hợp thử nghiệm của tôi, tôi luôn gặp lỗi này. Tôi phát hiện ra rằng "Dịch vụ giao dịch phân tán" của tôi chưa được bắt đầu (chạy: services.msc -> bắt đầu "Dịch vụ giao dịch phân tán" (tốt nhất để đặt dịch vụ bắt đầu tự động)). Sau khi tôi làm điều đó, nó hoạt động như một bùa mê ...


0

Tôi đã sao chép các tệp cơ sở dữ liệu (.mdf / .ldf) vào thư mục App_Data để loại bỏ ngoại lệ này.


0

Tôi cũng đã phải đối mặt với vấn đề tương tự. Bây giờ tôi đã thực hiện nó bằng cách xóa tên người dùng và mật khẩu khỏi chuỗi kết nối.


0

Đối với tôi đó chỉ là một lỗi đơn giản:

Tôi đã sử dụng Amazon EC2 và tôi đã sử dụng địa chỉ IP đàn hồi của mình trong chuỗi kết nối, nhưng khi tôi thay đổi địa chỉ IP, tôi đã quên cập nhật chuỗi kết nối của mình.


0

Tôi đã có lỗi này đột nhiên xảy ra bất ngờ trên một trong các trang web của chúng tôi. Trong trường hợp của tôi, hóa ra mật khẩu người dùng SQL đã hết hạn! Bỏ chọn hộp hết hạn mật khẩu trong SQL Server Management Studio đã thực hiện thủ thuật này!


0

Tôi đã gặp vấn đề tương tự vài ngày trước, sử dụng "Bảo mật tích hợp = Đúng;" trong chuỗi kết nối, bạn cần chạy danh tính nhóm ứng dụng trong "hệ thống cục bộ" Chắc chắn điều này không được khuyến khích nhưng để kiểm tra thì nó thực hiện công việc.

Đây là cách bạn có thể thay đổi danh tính trong IIS 7: http://www.iis.net/learn/manage/configuring-security/application-pool-identities


0

Trong IIS, đặt Danh tính nhóm ứng dụng là Tài khoản quản trị viên hoặc Tài khoản quản trị viên hoặc tài khoản ant có quyền thực hiện thao tác trên DataBase đó.


0

Trong trường hợp của tôi, tôi có sự không khớp giữa tên chuỗi kết nối mà tôi đã đăng ký trong hàm tạo của bối cảnh so với tên trong web.config của tôi. Lỗi đơn giản do sao chép và dán: D

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


0

Tôi có cùng một lỗi tôi đã tìm thấy đó là khi tôi thay đổi kết nối của mình. Đến nguồn dữ liệu mới, tôi quên thay đổi Tên người dùng và mật khẩu cho cơ sở dữ liệu mới


0

Tôi cũng đã xảy ra lỗi này nếu tên Trường hợp Máy chủ SQL không được chỉ định và máy chủ SQL có nhiều phiên bản SQL được cài đặt. Dưới đây là một vài ví dụ để làm rõ:

Chuỗi kết nối bên dưới dẫn đến ngoại lệ "Nhà cung cấp cơ sở không thành công khi mở" không có ngoại lệ bên trong ứng dụng .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"

Chuỗi kết nối sau đây thực thi như mong đợi trong ứng dụng .net WebForms nơi môi trường SQL có nhiều phiên bản. Hiếm khi tôi biết, nhưng tôi có một vài trường hợp SQL khác nhau trên hộp dev của mình để chứa các dự án khác nhau:

 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

trong trường hợp của tôi, địa chỉ máy chủ đã bị quản trị viên máy chủ thay đổi nên tôi phải thay đổi chuỗi kết nối thành địa chỉ máy chủ mới


0

Tôi gặp vấn đề này vì ứng dụng Đăng nhập ứng dụng này đang chạy đã thay đổi.

Trong IIS:

  • Tìm nhóm Ứng dụng bằng cách nhấp vào trang web của bạn và đi tới Cài đặt cơ bản.

  • Chuyển đến Hồ bơi ứng dụng.

  • Nhấp vào nhóm ứng dụng trang web của bạn.

  • Nhấp vào Cài đặt nâng cao.

  • Trong Danh tính, nhập thông tin đăng nhập tài khoản và mật khẩu.

  • Khởi động lại trang web của bạn và thử lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.