2017-02-07 1 views
0

Я работаю над приложением asp.net. Я использую ado.net для доступа к базе данных SQL Server и выполнения CRUD. Я хочу вставить несколько записей за один раз. Для этого я добавил пользовательский тип в базе данных и хранимую процедуру так:Передача списка объектов в хранимую процедуру SQL Server и вставки записей с использованием ядра asp.net

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 

и хранимая процедура выглядит так:

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

и в C#, я использую этот код:

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(); 
    } 
} 

и эта функция для создания списка SqlDataRecord и перейти к хранимой процедуре:

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, "[email protected]" }); 
    datatable.Add(row); 
    row = new SqlDataRecord(sqlMetaData); 
    row.SetValues(new object[] { "Asif1", "hameed1", "asif372", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "[email protected]" }); 
    datatable.Add(row); 
    row = new SqlDataRecord(sqlMetaData); 
    row.SetValues(new object[] { "Asif2", "hameed2", "asif373", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "[email protected]" }); 
    datatable.Add(row); 
    row = new SqlDataRecord(sqlMetaData); 
    row.SetValues(new object[] { "Asif4", "hameed4", "asif375", "123", true, false, 1, DateTime.Now, 1, DateTime.Now, "[email protected]" }); 

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

    datatable.Add(row); 

    return datatable; 
} 

, но я получаю это исключение:

Исключение типа «System.Data.SqlClient.SqlException» произошло в System.Data.SqlClient.dll, но не был обработан в пользовательском коде

Дополнительная информация: Недопустимое имя объекта 'UserTableType'

Пожалуйста, предложите решение.

+1

Примечание: вы не должны ** использовать префикс 'sp_' для хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

1

Вы выбираете из определения типа, а не параметра. Попробуйте следующее:

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 
Смежные вопросы