Как передать массив строк в хранимую процедуру и выполнить запрос вставки - PullRequest
0 голосов
/ 10 февраля 2020

Видел много примеров передачи значений массива в хранимую процедуру с использованием табличного параметра, и я следовал тому же, но значения не вставляются в таблицу. Здесь я должен отправить массив строк, имеющих некоторые идентификаторы и значение int. Мне нужно вставить полные значения массива с этим уникальным идентификатором.

Контроллер

 [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]

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Ваши имена столбцов с данными должны соответствовать объявлению типа в вашем pro c. У вас есть «Категория», а затем «Боги»
Я думаю, что у вас есть проблема и в этом предложении вставки. В любом случае, не уверен, что вы делаете, но если этот идентификатор является первичным ключом, вы вставляете тот же самый в каждую строку. Возможно, вы захотите переместить его в определение типа.

Я бы также использовал предложенный ответ: INSERT dbo.TempleGod (templeid, gid)
SELECT @tempId, gods FROM @dt ГДЕ Gods NOT IN (ВЫБЕРИТЕ богов ИЗ dbo.TempleGod))

0 голосов
/ 10 февраля 2020

Попробуйте изменить свой оператор вставки следующим образом:

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