2009-01-13 42 views
5

Tôi đang chạy Sql Server Compact Edition 3.5.1.0 SP1 trong một ứng dụng đa luồng. Ứng dụng chạy ngẫu nhiên chèn các truy vấn trong các giao dịch. Với giao dịch ngắn, nó hoạt động tốt. Nhưng khi các giao dịch được lâu hơn và sự chậm trễ giữa hành được ngắn hơn hoặc khi tôi chạy ứng dụng ở chế độ debug, SqlCE bắt đầu ném ngoại lệ sau đây một cách ngẫu nhiên:Sql Compact ngẫu nhiên tạo AccessViolationException

AccessViolationException Toan đọc hay ghi bộ nhớ được bảo vệ. này thường là dấu hiệu cho thấy bộ nhớ khác bị hỏng.

tại System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() tại System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand ( hành vi CommandBehavior, String phương pháp, ResultSetOptions tùy chọn) tại System.Data.SqlServerCe.SqlCeCommand .ExecuteNonQuery() tại SqlCompactTest.TransactedCommandGroupExecutionTest.Test() trong D: \ Projects \ sân chơi \ SqlCompactTest \ SqlCompactTest \ TransactedCommandGroupExecutionTest.cs: dòng 53 tại SqlCompactTest.ExecutionTest.RunTest() trong D: \ Projects \ sân chơi \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs: dòng 60 tại SqlCompactTest.ExecutionTest.TimerElapsed (Object gửi, ElapsedEventArgs e) trong D: \ Projects \ sân chơi \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs : dòng 68 tại System.Timers.Timer.MyTimerCallback (Object nhà nước)

mã tôi đang chạy là:

IDbConnection connection = m_connectionProvider.GetConnection(); // Just returns new connection 

connection.Open(); 
IDbTransaction transaction = connection.BeginTransaction(); 

foreach (IDbCommand command in m_commands) 
{ 
    command.Connection = connection; 
    command.ExecuteNonQuery(); // This line throws exception 
    Thread.Sleep((int)m_delayBetweenExecutions); 
} 

transaction.Commit(); 
connection.Close(); 

mã này được chạy đồng thời trong tw o chủ đề. chuỗi kết nối là:

"Data Source=testDB.sdf;Encrypt Database=True;Password=test;File Mode=Read Write;Persist Security Info=False;Max Database Size=1024" 

tôi tìm thấy giải pháp ngớ ngẩn trên Internet như quay trở lại để Framework 1.1, thay đổi thứ tự của các đối số phương pháp, bật/tắt tối ưu hóa vv nhưng không ai trong số họ làm việc cho tôi. Tôi cũng đã lặp lại thông qua possible solutions on microsoft sites nhưng tôi không thể tìm thấy giải pháp phù hợp với mình. Phiên bản tệp cơ sở dữ liệu của tôi là 3.5.0.0.

Tôi làm cách nào để giải quyết vấn đề này?

Trả lời

5

Chỉ vì bạn đặt kết nối thành lệnh.Cách kết nối không có nghĩa là nó được đặt.

command.Connection = connection; 
command.Connection.GetHashCode() == connection.GetHashCode(); // may return false. 

Đây là nguyên nhân của sự cố. Có thể được sửa chữa bằng cách sử dụng connection.CreateCommand();

+0

Các lỗi HA đã được khắc phục? Bây giờ tôi cần câu trả lời –

3

SQL CE objects are not thread-safe. Ngoài ra, cùng một bài viết liệt kê một tình huống không phù hợp với phiên bản (xảy ra trong trường hợp của tôi).

+0

Tôi đã có cùng một ngoại lệ và chính xác điều này, gọi một người làm việc nền đã truy cập ngữ cảnh của tôi trong khi các quy trình khác đang sử dụng nó. – Hannish