2011-11-17 6 views
1

J'essaie de transmettre une table de données à une procédure stockée. La table comporte quatre colonnes, OldDifficulty, OldIndex, NewDifficulty et NewIndex. Il est passé à une procédure stockée qui est supposée mettre à jour toutes les lignes d'une table Puzzles en changeant les lignes avec l'ancien index et la difficulté à leur nouvel index et difficulté. La table Puzzles ne change pas, et je n'arrive pas à comprendre pourquoi. Je ne suis pas sûr si le problème est dans le code ou dans la requête de base de données.La procédure stockée ne met pas à jour les données

Voici le code C# qui appelle la procédure stockée:

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

et voici la procédure stockée:

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 

Avez-vous une idée pourquoi la table ne soit pas mise à jour? Y at-il un problème avec mon SQL?

+0

Quelle est votre version de sqlserver? – Illuminati

+0

com.Parameters.Add (nouveau SqlParameter ("ChangedPuzzles", table) => com.Parameters.Add (nouveau SqlParameter ("@ ChangedPuzzles", table) - pourrait être ceci aussi, mais il serait utile de connaître le erreur exacte avant de sauter dans les conclusions. – Illuminati

Répondre

2

Tout semble ok , à l'exception:

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

je changerais à:

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

@ préfixe de signe dans parameter name. Utilisez le SQL Server Profiler pour voir si cette requête est effectivement exécutée.

1

vérifier l'ordre des champs dans le type de table ChangedPuzzlesTable, il doit être le même que datatable tout changement afin peut provoquer ce problème

, erreur en ajoutant une prise d'essai

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 
       } 
Questions connexes