2010-09-16 33 views
6

Tôi đang cố gắng cập nhật dữ liệu trong khi đọc chúng từ cơ sở dữ liệu, xem bên dưới. Nhưng sau khi kết thúc mọi thứ, dữ liệu không được cập nhật.Tại sao tôi không thể cập nhật dữ liệu vào cơ sở dữ liệu bằng LINQ to SQL?

Có bất kỳ cú pháp giao dịch nào tôi cần chỉ định không? (Khi tôi gỡ lỗi, tôi có thể thấy tôi có kỷ lục ngay lấy.)

using (conn = new SqlConnection(MyConnectionString)) 
       using (SqlCommand cmd = new SqlCommand("dbo.MyProcedure", conn)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@Count", count); 
        conn.Open(); 
        using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
        { 
         while (reader.Read()) 
         { 
          // wrapper object, not related to database 
          SampleModel c = new SampleModel(); 
          c.ID= (string)reader["ID"]; 
          c.Name = (string)reader["Name"]; 
          c.Type = (int)reader["Type"]; 

          // modeList will return to outside, not related to database 
          modelList.Add(c); 

          sampleTable1 table1 = context.sampleTable1s.SingleOrDefault(t=> t.id = c.ID); 

          // try to update the "isRead", but it doesn`t work....!!! 
          // about the datatype, in the data base, it is "smallInt" 
          // in linq to sql, it is "short?" 
          // PS Default value all should be 0 
          table1.isRead = 1; 
          context.SubmitChanges(); <--- here, it doesn`t do the job // context is new from Linq to SQL 
         } 
        } 
        conn.Close(); 
       } 

Dưới đây là thủ tục của tôi:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE MyProcedure  
    @Count int = 100 
AS 
BEGIN 

    SELECT TOP (@Count) 
     t1.id AS ID, 
     t1.name AS Name, 
     t2.type AS TYPE  
    FROM sampleTable1 as t1 with (nolock), 
     sampleTable2 as t2 with (nolock)   
    WHERE (t1.t2Id = t2.Id)  
ORDER BY t1.name asc 

END 
GO 

Và nếu tôi đặt tất cả các mã của tôi bên TransactionScope khối

using (TransactionScope scope = new TransactionScope()) 
{ 
    // all the C# code above 
    scope.Complete(); 
} 

Tôi sẽ nhận được ngoại lệ "MSDTC trên máy chủ 'localhost-sqlserver2005' không khả dụng".

Và nếu tôi chỉ đưa một số mã, không có ngoại lệ, nhưng các dữ liệu được cập nhật did`t

using (TransactionScope scope = new TransactionScope()) 
{ 
    sampleTable1 table1 = context.sampleTable1s.SingleOrDefault(t=> t.id = c.ID); 

    table1.isRead = 1; 
    context.SubmitChanges(); 

    scope.Complete(); 
} 

Cảm ơn.

+0

noloack? tự hỏi nếu đó là một lỗi đánh máy trong câu hỏi, hoặc một SPROC –

+0

bị hỏng Để xác nhận - những gì là 'table1.isRead' * trước * điều này? Nó chỉ áp dụng * thay đổi * thực tế, vì vậy nếu nó là 1 trước đó, không thay đổi. Bạn đã thử chụp nhật ký ('context.Log = Console.Out;') để xem nó đang gửi gì chưa? (tương tự thay thế - sử dụng một lược tả SQL) –

+0

@Marc, nó là một lỗi đánh máy .. xin lỗi – jojo

Trả lời

8

Kiểm tra để có ít nhất một thành viên trong lớp thực thể được đề cập được đánh dấu là thành viên chính trong thiết kế L2S. Nếu một thực thể không có bất kỳ thành viên PK nào, L2S sẽ tự động bỏ qua nó khi gửi các cập nhật (âm thầm như không có ngoại lệ nào được ném ra, và không có câu lệnh SQL được cập nhật nào được tạo ra và được gửi tới db).

+1

.. bạn là genies ... tôi quên tạo khóa chính trong kịch bản của mình. hãy để tôi thử những gì đã xảy ra sau khi tôi đặt một chính trên – jojo

+1

nó đang làm việc ngay bây giờ .....-_- !!!! – jojo

+0

Chỉ cần một lưu ý bổ sung: Chìa khóa để nhận được cập nhật (và xóa) báo cáo là nếu mô hình nghĩ rằng có một PK. Điều tốt nhất là tất nhiên nếu có PK trong DB, nhưng đối với các tình huống mà bảng DB không có PK thì đủ để đánh dấu một hoặc nhiều cột (nhận dạng duy nhất các bản ghi) khi thành viên PK và L2S sẽ vui vẻ . – KristoferA

2

Đảm bảo bạn có khóa chính được đặt cho bảng đó. Nếu bạn không thể làm điều đó trong db, hãy thực hiện nó trong trình thiết kế linq2sql.

Đã trả lời câu hỏi này here, herehere. Cũng đề cập đến nó linq to sql pitfalls.

Các vấn đề liên quan