我正在尝试在从数据库中读取数据时更新数据,请参阅下文。 但是在整个过程结束后,数据没有得到更新。
我需要指定任何交易语法吗? (当我调试时,我可以看到我找到了正确的记录。)
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();
}
感谢。
答案 0 :(得分:8)
检查所讨论的实体类中至少有一个成员在L2S设计器中被标记为主键成员。如果一个实体没有任何PK成员,L2S会在提交更新时默默地忽略它(无异常抛出,因为没有抛出异常,也没有生成更新的SQL语句并发送给db)。
答案 1 :(得分:2)
确保您为该表设置了主键。如果您不能在db中执行此操作,请在linq2sql设计器中执行此操作。
已回复此here,here和here。还提到了linq to sql pitfalls。