我正在尝试将数据表传递给存储过程。该表有四列,OldDifficulty
,OldIndex
,NewDifficulty
和NewIndex
。它被传递给一个存储过程,该存储过程应该更新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 :(得分: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 :(得分:1)
检查表类型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
}