2011-11-17 71 views
1

我试图将数据表传递给存储过程。该表具有四列OldDifficulty,OldIndex,NewDifficultyNewIndex。它被传递给一个存储过程,该存储过程应该更新Puzzles表中的所有行,将具有旧索引和难度的行更改为其新索引和难度。 Puzzles表不会更改,我无法弄清楚原因。我不确定问题出在代码中还是数据库查询中。存储过程不更新数据

这里是调用存储过程的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 

你有什么想法,为什么表中没有更新?我的SQL有什么问题吗?

+0

什么是你的sqlserver版本? – Illuminati

+0

com.Parameters.Add(new SqlParameter(“ChangedPuzzles”,table)=> com.Parameters.Add(new SqlParameter(“@ ChangedPuzzles”,table) - 也可以是这个,但它会有助于知道在得出结论之前确切的错误。 – Illuminati

回答

2

一切正常导致此问题

校验错误的任何变化,除了:

com.Parameters.Add(new SqlParameter("ChangedPuzzles", table) 
    { SqlDbType = SqlDbType.Structured }); 

我将改变为:

com.Parameters.Add(new SqlParameter("@ChangedPuzzles", table) 
    { SqlDbType = SqlDbType.Structured }); 

@符号 - 前缀parameter name

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

1

检查表型ChangedPuzzlesTable字段的顺序,它必须是相同的数据表,以便可以通过添加一个尝试捕捉

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 
       }