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?
Quelle est votre version de sqlserver? – Illuminati
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