【问题标题】:How to Pass string array to Stored procedure and perform insert query如何将字符串数组传递给存储过程并执行插入查询
【发布时间】:2020-02-10 12:31:33
【问题描述】:

已经看到很多使用表值参数将数组值传递给存储过程的示例,我也遵循了相同的方法,但值没有插入到表中。 在这里,我必须发送一个具有一些 id 和一个 int 值的字符串数组。 我需要插入具有此唯一 ID 的完整数组值。

控制器

 [HttpPost]
        public  JsonResult AssignGod(int id,string[] g)
        {
            SqlConnection con = null;              
            try
            {
                con = GetSqlConnectionObject(cs);             


            DataTable dt_god = new DataTable();
            dt_god.Columns.Add("gods", typeof(String));
            dt_god.Columns.Add("tid", typeof(Int32));
            DataRow workRow;
            foreach (string cat in g)
            {
                workRow = dt_god.NewRow();
                workRow["gods"] = cat.Trim();
                workRow["tid"] = id;
                dt_god.Rows.Add(workRow);
            }
            SqlCommand cmd = new SqlCommand("AssignGod", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter tvparam = cmd.Parameters.AddWithValue("@templegod", dt_god);
            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.TempleGod AS TABLE
 (gods NVARCHAR(200),tid int);
go




ALTER  PROC [dbo].[AssignGod]
                    @templegod AS [dbo].TempleGod READONLY


AS
BEGIN
        SET NOCOUNT ON;

    BEGIN

            BEGIN
            INSERT dbo.TempleGod(templeid,gid) SELECT tid,gods FROM @templegod
            END

    END

While am running this code its not showing any error but the table remains empty
[![Table must be like this][1]][1]

【问题讨论】:

    标签: arrays asp.net-mvc-4 stored-procedures table-valued-parameters


    【解决方案1】:

    您的数据表列名称需要与您的 proc 中的类型声明相匹配。 你有“类别”,然后是“神”
    我认为您在插入子句中也有问题。无论如何,不​​确定您在做什么,但如果该 id 是主键,那么您将在每一行中插入相同的。您可能希望将其移动到类型定义中。

    我也会使用建议的答案: 插入 dbo.TempleGod(templeid,gid)
    SELECT @tempId, gods FROM @dt WHERE gods NOT IN (SELECT gods FROM dbo.TempleGod))

    【讨论】:

    • tempid 不是主键。我只是想像图片一样插入。你能纠正我吗?
    • 试试这个作为你的过程。您需要更新呼叫数据表以匹配 MyDataTable 列名称。 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
    • 试过了。但没用。我已经用神更改了数据表列现在正确吗?
    • 改变了一点
    • 我不会将类型命名为与表格相同的名称。下面是 proc 的测试代码,它可以工作你确定数组在你的 c# 中有值吗? ` DECLARE @t TempleGod INSERT INTO TempleGod (gods, tid) VALUES (N'test', -- gods - nvarchar(200) 1 -- tid - int ) EXEC [AssignGod] @t `
    【解决方案2】:

    尝试将您的插入语句更改为:

    INSERT dbo.TempleGod(templeid,gid)   
    SELECT @tempId, gods   FROM @dt   WHERE gods NOT IN (SELECT gods FROM dbo.TempleGod))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2017-12-29
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多