已经看到了很多使用表值参数将数组值传递到存储过程的示例,而我也遵循相同的例子,但是这些值未插入表中。在这里,我必须发送一个包含一些ID和一个Int值的字符串数组。我需要使用此唯一ID插入完整的数组值。
控制器
[HttpPost]
public JsonResult AssignGod(int id,string[] g)
{
SqlConnection con = null;
try
{
con = GetSqlConnectionObject(cs);
DataTable dt_Categories = new DataTable();
dt_Categories.Columns.Add("Category", typeof(String));
DataRow workRow;
foreach (string cat in g)
{
workRow = dt_Categories.NewRow();
workRow["Category"] = cat.Trim();
dt_Categories.Rows.Add(workRow);
}
SqlCommand cmd = new SqlCommand("AssignGod", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt",dt_Categories);
SqlParameter tvparam1 = cmd.Parameters.AddWithValue("@tempId", id);
tvparam.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
string result = "success";
return Json(result, JsonRequestBehavior.AllowGet);
}
catch
{
throw;
}
finally
{
CloseSqlConnectionObject(con);
}
return Json("asa", JsonRequestBehavior.AllowGet);
}
存储过程
CREATE TYPE dbo.MyDataTable
AS TABLE
(
gods NVARCHAR(200)
);
GO
ALTER PROC [dbo].[AssignGod]
@dt AS [dbo].MyDataTable READONLY,
@tempId int
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT dbo.TempleGod(templeid,gid) values (@tempId,(SELECT gods FROM @dt WHERE gods NOT IN (SELECT gods FROM dbo.TempleGod)));
END
END
尝试将您的插入语句更改为此:
INSERT dbo.TempleGod(templeid,gid)
SELECT @tempId, gods FROM @dt WHERE gods NOT IN (SELECT gods FROM dbo.TempleGod))
您的数据表列名称需要与proc中的类型声明匹配。您有“类别”,然后是“神”该插入-老实说,我从来没有见过那样做过。无论如何,都不确定要做什么,但是如果该ID是主键,则将同一行插入到每一行中。您可能需要将其移到类型定义中。