2011-11-17 110 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 
       }