繁体   English   中英

为什么我不能使用LINQ to SQL将数据更新到数据库中?

[英]Why can't I update data into database using LINQ to SQL?

我正在尝试在从数据库中读取数据时更新数据,请参阅下文。 但在整个事情结束后,数据没有得到更新。

是否需要指定任何事务语法? (当我调试时,我可以看到我检索到了正确的记录。)

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();
                }

这是我的程序:

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

如果我将所有代码放在TransactionScope块中

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

我将得到一个例外“服务器上的MSDTC'localhost-sqlserver2005'不可用。”

如果我只放了一些代码,没有例外,但数据确实没有更新

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

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

    scope.Complete();
}

谢谢。

检查所讨论的实体类中的至少一个成员是否被标记为L2S设计器中的主键成员。 如果一个实体没有任何PK成员,L2S会在提交更新时默默地忽略它(默认情况下不会抛出异常,也不会生成更新的SQL语句并发送给db)。

确保您为该表设置了主键。 如果您不能在db中执行此操作,请在linq2sql设计器中执行此操作。

在这里这里这里回答这个问题 还提到了linq to sql陷阱

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM