Passing list of objects to a SQL Server stored procedure and insert records using asp.net core

微笑、不失礼 提交于 2020-01-01 00:53:09

问题


I am working on asp.net application. I am using ado.net to access the SQL Server database and perform CRUD. I want to insert multiple records in one go. For this purpose, I have added a custom Type in database and a stored procedure like this:

CREATE TYPE [dbo].[UserTableType] AS TABLE
(
    [FirstName] [nvarchar](100) NULL,
    [LastName] [nvarchar](100) NULL,
    [UserName] [nvarchar](100) NULL,
    [Password] [nvarchar](100) NULL,
    [IsActive] [bit] NULL,
    [IsDeleted] [bit] NULL,
    [CreatedBy] [int] NULL,
    [CreatedAt] [datetime] NULL,
    [UpdatedBy] [int] NULL,
    [UpdatedAt] [datetime] NULL,
    [Email] [nvarchar](100) NULL
)
GO

and stored procedure is like this:

CREATE PROCEDURE [dbo].[sp_InsertUser] 
    @UserTableType UserTableType READONLY
AS
BEGIN
    INSERT INTO tblUser
        SELECT * FROM UserTableType
END

and in C#, I am using this code:

public void CreateMultipleUser()
{
    var cs = "Server=.;Database=Clicon;Trusted_Connection=True;";

    using (SqlConnection con = new SqlConnection(cs))
    {
        SqlCommand cmd = new SqlCommand("exec sp_InsertUser @UserTableType", con);            

        var pList = new SqlParameter("@UserTableType", SqlDbType.Structured);
        pList.TypeName = "dbo.UserTableType";
        pList.Value = GetAddUserList();              
        cmd.Parameters.Add(pList);

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }
}

and this function to create a List of SqlDataRecord and pass to stored procedure:

private List<SqlDataRecord> GetAddUserList()
{
    List<SqlDataRecord> datatable = new List<SqlDataRecord>();
    SqlMetaData[] sqlMetaData = new SqlMetaData[11];
    sqlMetaData[0] = new SqlMetaData("FirstName", SqlDbType.VarChar, 100);
    sqlMetaData[1] = new SqlMetaData("LastName", SqlDbType.VarChar, 100);
    sqlMetaData[2] = new SqlMetaData("UserName", SqlDbType.VarChar, 100);
    sqlMetaData[3] = new SqlMetaData("Password", SqlDbType.VarChar, 100);
    sqlMetaData[4] = new SqlMetaData("isActive", SqlDbType.Bit);
    sqlMetaData[5] = new SqlMetaData("isDeleted", SqlDbType.Bit);
    sqlMetaData[6] = new SqlMetaData("CreatedBy", SqlDbType.Int);
    sqlMetaData[7] = new SqlMetaData("CreatedAt", SqlDbType.DateTime);
    sqlMetaData[8] = new SqlMetaData("UpdatedBy", SqlDbType.Int);
    sqlMetaData[9] = new SqlMetaData("UpdatedAt", SqlDbType.DateTime);
    sqlMetaData[10] = new SqlMetaData("Email", SqlDbType.VarChar, 100);
    SqlDataRecord row = new SqlDataRecord(sqlMetaData);

    row = new SqlDataRecord(sqlMetaData);
    row.SetValues(new object[] { "Asif", "hameed", "asif371", "123", true,false,1,DateTime.Now,1,DateTime.Now, "asif1@gmail.com" });
    datatable.Add(row);
    row = new SqlDataRecord(sqlMetaData);
    row.SetValues(new object[] { "Asif1", "hameed1", "asif372", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "asif2@gmail.com" });
    datatable.Add(row);
    row = new SqlDataRecord(sqlMetaData);
    row.SetValues(new object[] { "Asif2", "hameed2", "asif373", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "asif3@gmail.com" });
    datatable.Add(row);
    row = new SqlDataRecord(sqlMetaData);
    row.SetValues(new object[] { "Asif4", "hameed4", "asif375", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "asif5@gmail.com" });

    datatable.Add(row);
    row = new SqlDataRecord(sqlMetaData);
    row.SetValues(new object[] { "Asif5", "hameed4", "asif376", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "asif6@gmail.com" });

    datatable.Add(row);

    return datatable;
}

but I am getting this exception:

An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.SqlClient.dll but was not handled in user code

Additional information: Invalid object name 'UserTableType'

Please suggest a solution to this.


回答1:


You are selecting from the Type definition, not the parameter. Try this:

CREATE PROCEDURE [dbo].[sp_InsertUser] 
    -- Add the parameters for the stored procedure here
    @UserTableType UserTableType READONLY

AS
BEGIN
    INSERT INTO tblUser
        SELECT * FROM @UserTableType
END


来源:https://stackoverflow.com/questions/42097281/passing-list-of-objects-to-a-sql-server-stored-procedure-and-insert-records-usin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!