C# 存储过程不更新数据

C# 存储过程不更新数据,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我试图将数据表传递给存储过程。该表有四列,oldDemobility,OldIndex,newDemobility和NewIndex。它被传递到一个存储过程,该存储过程应该更新拼图表中的所有行,并使用旧索引和难度将行更改为新索引和难度。“拼图”表格没有改变,我也不知道为什么。我不确定问题是在代码中还是在数据库查询中 下面是调用存储过程的C代码: var Form = context.Request.Form; DataTable table = new DataTable(); ta

我试图将数据表传递给存储过程。该表有四列,
oldDemobility
OldIndex
newDemobility
NewIndex
。它被传递到一个存储过程,该存储过程应该更新
拼图
表中的所有行,并使用旧索引和难度将行更改为新索引和难度。“拼图”
表格没有改变,我也不知道为什么。我不确定问题是在代码中还是在数据库查询中

下面是调用存储过程的C代码:

  var Form = context.Request.Form;
  DataTable table = new DataTable();
  table.Columns.Add("OldDifficulty");
  table.Columns.Add("OldIndex");
  table.Columns.Add("NewDifficulty");
  table.Columns.Add("NewIndex");
  foreach (var key in Form.Keys)
  {
    var Old = key.ToString().Split('_');
    var New = Form[key.ToString()].Split('_');
    if (Old == New || New.Length == 1 || Old.Length == 1) continue;
    table.Rows.Add(Old[0], int.Parse(Old[1]), New[0], int.Parse(New[1]));
  }
  using (var con = new SqlConnection(SqlHelper.ConnectionString))
  {
    con.Open();
    using (var com = new SqlCommand("RearrangePuzzles", con))
    {
      com.CommandType = CommandType.StoredProcedure;
      com.Parameters.Add(new SqlParameter("ChangedPuzzles", table) 
        { SqlDbType = SqlDbType.Structured });
      com.ExecuteNonQuery();
    }
    con.Close();
  }
ALTER PROCEDURE [dbo].[RearrangePuzzles]
    @ChangedPuzzles ChangedPuzzlesTable READONLY
AS
UPDATE p 
SET 
    NthPuzzle = cp.NewIndex, 
    Difficulty = cp.NewDifficulty 
FROM 
    Puzzles p JOIN 
    @ChangedPuzzles cp ON cp.OldIndex = p.NthPuzzle AND cp.OldDifficulty = p.Difficulty
下面是存储过程:

  var Form = context.Request.Form;
  DataTable table = new DataTable();
  table.Columns.Add("OldDifficulty");
  table.Columns.Add("OldIndex");
  table.Columns.Add("NewDifficulty");
  table.Columns.Add("NewIndex");
  foreach (var key in Form.Keys)
  {
    var Old = key.ToString().Split('_');
    var New = Form[key.ToString()].Split('_');
    if (Old == New || New.Length == 1 || Old.Length == 1) continue;
    table.Rows.Add(Old[0], int.Parse(Old[1]), New[0], int.Parse(New[1]));
  }
  using (var con = new SqlConnection(SqlHelper.ConnectionString))
  {
    con.Open();
    using (var com = new SqlCommand("RearrangePuzzles", con))
    {
      com.CommandType = CommandType.StoredProcedure;
      com.Parameters.Add(new SqlParameter("ChangedPuzzles", table) 
        { SqlDbType = SqlDbType.Structured });
      com.ExecuteNonQuery();
    }
    con.Close();
  }
ALTER PROCEDURE [dbo].[RearrangePuzzles]
    @ChangedPuzzles ChangedPuzzlesTable READONLY
AS
UPDATE p 
SET 
    NthPuzzle = cp.NewIndex, 
    Difficulty = cp.NewDifficulty 
FROM 
    Puzzles p JOIN 
    @ChangedPuzzles cp ON cp.OldIndex = p.NthPuzzle AND cp.OldDifficulty = p.Difficulty

你知道为什么表没有更新吗?我的SQL有问题吗?

检查表类型ChangedPuzzlesTable中字段的顺序,它必须与datatable相同。顺序上的任何更改都可能导致此问题

通过添加try-catch检查错误

  try
    {
     using (var con = new SqlConnection(SqlHelper.ConnectionString))
      {
        con.Open();
        using (var com = new SqlCommand("RearrangePuzzles", con))
        {
          com.CommandType = CommandType.StoredProcedure;
          com.Parameters.Add(new SqlParameter("ChangedPuzzles", table) 
            { SqlDbType = SqlDbType.Structured });
          com.ExecuteNonQuery();
        }
        con.Close();
      }
    }

catch (Exception ex)
                {
                   // ex will show you the error
                }

看起来一切正常,除了:

com.Parameters.Add(new SqlParameter("ChangedPuzzles", table) 
    { SqlDbType = SqlDbType.Structured });
我想改为:

com.Parameters.Add(new SqlParameter("@ChangedPuzzles", table) 
    { SqlDbType = SqlDbType.Structured });
@
登录-以前缀登录


使用SQL Server Profiler查看是否实际执行了此查询。

您的SQL Server版本是什么?com.Parameters.Add(new-SqlParameter(“ChangedPuzzles”,table)=>com.Parameters.Add(new-SqlParameter(“@ChangedPuzzles”,table)),也可能是这样,但在下结论之前知道确切的错误会有所帮助。